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.