Mapillary Bilder aus Gopro Max 360° Video extrahieren
Posted by cyton on 2 June 2023 in German (Deutsch). Last updated on 20 June 2023.Die GoPro Max kann im Intervall von zwei Sekunden ein Bild machen, im Modus “360° Zeitraffer”. Diese Bilder werden einzeln, fertig gestitcht, mit GPS Koordinaten und GPS Zeitstempel auf der SD-Karte gespeichert. Das ist schön, wenn man diese zu KartaView oder Mapillary hochladen mag, oder in JOSM einlesen zum Mappen zu Hause.
Mich stört daran, dass das minimale Intervall 2sec. ist, und nicht wie auf anderen GoPros (wie der Hero 8 Black) alle 0,5sec.
Aber die GoPro Max kann ja auch Video aufnehmen in 360°!
Das hat dann auch Ton, aber, soweit ich weiß, keine GPS-Spur.
Aber das Video enthält zwei Video-Spuren, die z.B. VLC einzeln abspielen kann, also nicht direkt ein fertiges 360° Video!
Vorgehen
Eine Lösung für das nachträgliche Stitchen der Videos ist die Software von GoPro selber: https://gopro.com/de/de/info/gopro-player Die gibt es aber nicht für Linux, und muss manuell per GUI bedient werden.
Diese kann aber aus den *.360
Dateien von der SD-Karte *.mov
Dateien Stitchen, welche als normale 360° Videos abspielbar sind.
Jedoch braucht es noch eine Georeferenzierung für das Video, also muss ich separat eine GPS-Spur aufnehmen. Das geht mit OsmAnd (in Zukunft dann bei solchen Aktionen mit kontinuierlicher Auflösung und nicht nur alle 1 sec. ein Punkt) auf dem Handy.
Mit den mapillary_tools kann man aus einem Video alle x-beliebige Sekunden Frames samplen, also einzelne Bilder extrahieren.
z.B. so:
mapillary_tools video_process GS025642.mov --geotag_source "gpx" --geotag_source_path gpx-path.gpx --video_sample_distance -1 --video_sample_interval 0.1 --skip_process_errors --interpolation_use_gpx_start_time
Danach habe ich einen Ordner mit den extrahierten Frames und eine mapillary_sampled_video_frames/mapillary_image_description.json
Datei mit den Zeitstempeln und der Geolokalisierung pro extrahiertem Frame.
Diese ist aber versetzt, da Video und gpx-Track nicht exakt gleichzeitig gestartet wurden.
Ich habe mir ein Python-Script geschrieben, welches die Daten aus der JSON-Datei in die EXIF-Daten der einzelnen Bilder schreibt, damit ich diese nachträglich manuell in JOSM versetzen kann.
Nun kann man die Bilder und die gpx-Spur in JOSM öffnen und die Korrelation korrigieren, also an die korrekte Position auf der Spur verschieben.
Dazu braucht es das JOSM-Plugin “Photo Geotagging”, um die neuen Koordinaten auch wieder in den Bilddateien speichern zu können.
Jetzt kann man noch Bilder am Anfang oder Ende löschen, oder zwischendurch welche herausnehmen, die zu nah aneinander sind.
Das ganze dann hochladen zu Mapillary und fertig: https://www.mapillary.com/app/?pKey=776980050706298&focus=photo
Probleme
Ein Problem ist die Qualität der Bilder, die ist schlechter als bei einzeln aufgenommenen Bildern.
Auch ist die Auflösung geringer, da die Video-Streams eine geringere vertikale Auflösung haben (warum auch immer), also ist das gestitchte Video auch kleiner.
- Video / Bilder: 5376 x 2688 Pixel = 14.45 megapixels
- Einzelne Bilder: 5760 x 2880 Pixel = 16.59 megapixels
- Beide mit Seitenverhältnis 2:1
Außerdem möchte ich Bilder die nah aneinander liegen automatisiert erkennen, das macht zwar das Mapillary Tool auch, aber sehr schlecht, und markiert sehr viele (vor allem nacheinander, und anderswo keine) als fehlerhaft, bzw. als zu nah beieinander.
Das habe ich auch schon bei den fertige 2sec. Bildern gemacht, wenn ich an Ampeln warte, etc. werden viele Bilder an derselben Stelle gemacht, die sind überflüssig.
Das Extrahieren der Frames passiert zu JPEG;
https://github.com/mapillary/mapillary_tools/blob/a3964b6918fbbcd97c08a0db1677f4e61cbbcdb6/mapillary_tools/ffmpeg.py#L20
FRAME_EXT = ".jpg"
Ich weiß nicht, ob das bei PNG bessere Qualität liefern würde, oder ob eine bessere Komprimierung für die JPEG einstellbar ist, seitens FFMPEG ja, aber das ist nicht angegeben im Mapillary code:
https://github.com/mapillary/mapillary_tools/blob/a3964b6918fbbcd97c08a0db1677f4e61cbbcdb6/mapillary_tools/ffmpeg.py#L269
194 & 269: # -q:v=1 is the best quality but larger image sizes
Warum, weiß ich nicht.
Über Kommentare und Verbesserungsvorschläge bin ich dankbar.