Aller au contenu principal

Pipeline 360° et vidéo

Tirez parti des caméras 360° ou des parcours vidéo stabilisés pour amorcer des cartes AR Clip VPS quand la photogrammétrie classique n'est pas praticable.

Extraire les images

ffmpeg -i hotel-tour.mp4 -vf fps=1 tour_frames/frame_%04d.jpg
  • Utilisez 1 à 2 images par seconde pour les vidéos.
  • Pour les caméras panoramiques (Insta360, Ricoh Theta), exportez des JPG équirectangulaires.

Envoyer le jeu d'images avec Python

Compressez les images retenues et déclenchez le pipeline de clustering de features via REST.

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

API_BASE = "https://api.arclip.app/vps/api/v3"
TOKEN = os.environ["ARCLIP_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()
cluster_info = init.json()
upload_url = cluster_info["uploadUrl"]
cluster_id = cluster_info["clusterId"]

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",
json={},
headers=headers,
)
finalize.raise_for_status()
print(f"Feature cluster {cluster_id} ready")

L'API renvoie un clusterId, qui désigne un sous-ensemble d'images sélectionnées et stockées sur le serveur.

Convertir le cluster en carte

import os
import requests

API_BASE = "https://api.arclip.app/vps/api/v3"
TOKEN = os.environ["ARCLIP_TOKEN"]
headers = {"Authorization": f"Bearer {TOKEN}"}

payload = {
"name": "Hotel Lobby Tour",
"dataType": "feature_cluster",
"clusterId": "cluster_abc123",
"publish": False
}

resp = requests.post(f"{API_BASE}/maps/import", json=payload, headers=headers)
resp.raise_for_status()
print(resp.json()["mapId"])

Une fois le traitement terminé (statut READY), ouvrez le parcours dans le SDK mobile ou web et vérifiez que la localisation reste stable tout du long.

Bonnes pratiques

  • Gardez une vitesse de marche constante et évitez les rotations brusques.
  • Assurez un éclairage homogène ; refilmez les zones qui provoquent des hautes lumières brûlées.
  • Effectuez au moins une boucle complète pour que l'algorithme puisse fermer la trajectoire.