Перейти к основному содержимому

Пайплайн 360° и видео

Используйте панорамные камеры или walkthrough-видео, когда классическую фотограмметрию применить сложно.

Экстракция кадров

ffmpeg -i hotel-tour.mp4 -vf fps=1 tour_frames/frame_%04d.jpg
  • Для видео достаточно 1–2 fps.
  • Для Insta360 / Ricoh экспортируйте эквиректангулы JPG.

Кластеризация через REST

# cluster_frames.py
from pathlib import Path
import zipfile
import os
import requests

API_BASE = "https://was-vps.web-ar.xyz/vps/api/v3"
TOKEN = os.environ["WEBAR3_TOKEN"]
FRAMES_DIR = Path("tour_frames")
ARCHIVE = Path("tour_frames.zip")

with zipfile.ZipFile(ARCHIVE, "w", compression=zipfile.ZIP_DEFLATED) as zf:
for frame in sorted(FRAMES_DIR.glob("*.jpg")):
zf.write(frame, frame.name)

headers = {"Authorization": f"Bearer {TOKEN}"}

init = requests.post(
f"{API_BASE}/pipelines/feature-cluster/import",
json={"name": "Hotel Lobby Tour", "frameCount": len(list(FRAMES_DIR.glob('*.jpg')))},
headers=headers,
)
init.raise_for_status()
info = init.json()
cluster_id, upload_url = info["clusterId"], info["uploadUrl"]

with ARCHIVE.open("rb") as src:
put = requests.put(upload_url, data=src, headers={"Content-Type": "application/zip"})
put.raise_for_status()

finalize = requests.post(
f"{API_BASE}/pipelines/feature-cluster/{cluster_id}/finalize",
headers=headers,
)
finalize.raise_for_status()
print(f"Кластер {cluster_id} готов")

Создание карты из кластера

payload = {
"name": "Hotel Lobby Tour",
"dataType": "feature_cluster",
"clusterId": cluster_id,
"publish": False
}
resp = requests.post(f"{API_BASE}/maps/import", json=payload, headers=headers)
resp.raise_for_status()
print(resp.json()["mapId"])

После готовности (READY) протестируйте маршрут в Web или мобильном SDK и убедитесь в устойчивой локализации.