OpenStreetMap

cyton's Diary

Recent diary entries

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.

Location: 13465, Frohnau, Reinickendorf, Berlin, Deutschland

Erweitert: https://osm.org/user/cyton/diary/401173

Der Ablauf ist sehr ähnlich geblieben, ich schildere aber nochmal alles, den vorherigen Eintrag muss man also nicht gelesen haben.

Interessante Layer
Straßenbäume, Anlagenbäume

Sind zwei separate Datensätze, sind aber identisch aufgebaut. Leider fehlen teils Bäume, teils an der falschen Stelle, teils um eine Nummer versetzt, oder kombinierte Fehler. Teils fehlen neue Pflanzungen, oder gefällte sind noch zu sehen. Leider haben die neuen kleinen Bäumchen scheinbar nie eine Nummer, das dauert wohl einfach immer.

Straßenbefahrung 2014

Ich habe mich auf die Bäume und anderes Straßenmobiliar konzentriert. Es gibt im “Straßenbefahrung 2014” Layer mehrere interessante WMF, aus denen ich Daten ziehen kann, um diese vor Ort zu prüfen.

  • Gebäudeeingänge, Zeigen wo ein Gartentor oder eine Tür in einer Häuserfront ist, liegen logisch gesehen also auf der Flurstücksgrenze.
  • Abfallbehaelter Muellbox, ist wohl nur amenity=waste_basket, hab aber noch nicht genug davon gesehen.
  • Sitzbank, sicherlich nur amenity=bench
  • Kabelkasten und Schaltkasten, scheinen alle man_made=street_cabinet zu sein, egal wofür oder von wem. Wenn eine anz enthalten ist, scheint diese die Anzahl Türen bzw. die Breite anzugeben.
  • Poller, barrier=bollard, auch zu wenig gesehen bisher, um mehr dazu zu sagen
  • Gehwegüberfahrt, Polygon von Einfahrten, also area:highway=service + service=driveway. Wenn diese mehrteilig sind, geht die Pflasterung des Gehweges darüber, wenn nicht, ist die Pflasterung der Einfahrt durchgehend. Was ich hier in Josm mache ist parallel zur Fahrbahn die inneren und äußeren (also an der Fahrbahn und Flurstücksgrenze) Knoten nehmen und dazwischen einen neuen setzen, diesen dann zentrieren dazwischen, mittels shift+b. Diese zwei Knoten verbinde ich zu der driveway-linie, welche ich zu Zaun/landuse=residential verlängere, sowie zur Straßenlinie. Ans Ende kommt noch eine potenzielle barrier=gate Node, aber das mache ich meist vor ort in Vespucci.

Alle diese sind aber mit deutlicher Vorsicht zu genießen, da die Daten halt schon etwas älter sind.

Öffentliche Beleuchtung

Laternen, die Daten sollten selbsterklärend sein.

Datenaquise

Erst die Datenlayer vom geoportal Berlin in Qgis anzeigen, dann diese herunterladen als kml.

Dann die kml in JOSM öffnen, das dauert erstmal etwas. Die kml Datei dann als .osm Datei speichern.

Die .osm Datei mit meinem Python-Script umformen. Dort ändere ich die tags und metadaten, damit sie dem OSM standard entsprechen, bzw. als zu löschen markiert sind.

Diese veränderte .osm Datei wieder in JOSM laden, und source=* und source:date=* hinzufügen, sowie natürlich fehlende Haupt-tags wie natural=tree, highway=street_lamp, oder man_made=street_cabinet etc.

An alles tagge ich außerdem ein fixme=check if exists, damit Vespucci das anmeckert und ich nichts übersehe, das lösche ich dann, wenn etwas wirklich existiert, oder aber das gesamte Objekt wird gelöscht, da es nicht existiert.

Diese Datei dann auf mein Android Handy befördern, und dort in Vespucci öffnen.

Vor Ort alle ref und etwa die Position prüfen. Meist sind Bäume korrekt oder einige auf einmal falsch positioniert.

Dann etwaige an den Bäumen oder Laternen fehlende Nummern mit ref:signed=no merken. Eventuell auch falsch-nummerierte, bzw. Unstimmigkeiten zu nummerierten Objekten allgemein in note=* an dem Objekt erfassen, damit in Zukunft niemand unnötigerweise verwirrt ist.

Für Einfahrten, kleine Verbindungs-Gehwege, Einfahrtstore sowie Gartentore messe ich mit StreetMeasure die Breiten. Das App-wechseln ist recht nervig, am liebsten hätte ich eine Möglichkeit das aus Vespucci Direkt aufzurufen, so wie Streetcomplete das auch tut.

Wenn man genug hat vom Herumlaufen, die modifizierte Datei in Vespucci wieder abspeichern.

Zu Hause dann die Datei aus dem Handy laden und in Josm nachjustieren.

Hochladen.

Ich bitte um Verbesserungen für diesen Workflow. Am liebsten hätte ich etwas das StreetComplete näher kommt, Vespucci ist sehr umständlich zu Bedienen.

Baumdaten in Berlin abgleichen

Posted by cyton on 14 March 2023 in German (Deutsch). Last updated on 12 May 2023.

Erweiterte Version ist hier: https://osm.org/user/cyton/diary/401534

Erst die Datenlayer vom geoportal berlin in Qgis anzeigen, dann diese herunterladen als kml. Anlagenbäume und Straßenbäume sind separat im geoportal.

Dann die kml in JOSM öffnen, das dauert erstmal etwas. Die kml Datei dann als .osm Datei speichern.

Die .osm datei mit meinem python script umformen. Dort ändere ich die tags und metadaten, damit sie dem OSM standard entsprechen, bzw. als zu löschen markiert sind.

Diese veränderte .osm Datei wieder in JOSM laden, und source=* und source:date=* hinzufügen, sowie natürlich natural=tree.

Diese Datei dann auf mein Android Handy befördern, und dort in Vespucci öffnen.

Vor ort alle ref und etwa die position der Bäume prüfen.

Dann etwa an den Bäumen fehlende Nummern mit ref:signed=no merken.

Zuhause Dann die ursprüngliche Datei laden und vom Handy die fehlenden ref abschreiben, etwaige positionsunstimmigkeiten oder fehlende Bäume nachtragen, oder gefällte löschen.

Hochladen.

Ich bitte um Verbesserungen für diesen Workflow. Am liebsten hätte ich etwas das StreetComplete näher kommt, Vespucci ist sehr umständlich zu Bedienen. Leider ändern sich oft die sichtbaren Layer, das nervt etwas.

Da ich nicht mit ausgestrecktem Arm und das Handy in der Hand haltend herum Laufen/Radfahren wollte, hab ich mir mit der Zeit verschiedene Gedanken gemacht und einige ausprobiert.

Helm

helm_hinten.jpg

Idee

Da das Anbringen des Handys am Lenker nur für verwackelte Bilder sorgt, wollte ich mich selbst als Stoßdämpfer zwischen Rad und Handy bringen.


Das hat auch soweit funktioniert, auf den Bildern kann man scharf alles erkennen (naja mit Einschränkungen, so ganz Perfekt geht es halt nicht mit dem Handy). Das Problem ist, dass da ein relativ großes Gewicht obendrauf kommt. Außerdem kann ich mich nicht frei umsehen, ohne die Richtung der Bilder zu verändern (macht man ja mal auf dem Rad).

helm_seite.jpg

Erst hatte ich das Mittig angebracht als Test, bin damit auch gefahren, aber die Bilder sind halt nur so lala, und das mit dem Umhersehen und dem extra Gewicht stört doch zu sehr.

helm_detail.jpg

Fazit

Keine gute Idee!

Hab ich direkt wieder abgemacht, und anders verwertet.

Ganz zu schweigen davon, was passiert, wenn ich in einen Unfall verwickelt wäre und da ein extra Gewicht an meinem Helm hängt, womit der nicht ausgelegt ist.

Die Beispielbilder habe ich nicht hochgeladen, sondern gelöscht, da die Halterung selber zu gut sehen war.


Jacke

jacke_ganz.jpg

Idee

Im Prinzip wollte ich eine Halterung für das Handy an meiner Person für das Spazieren gehen. Also jeweils nach Vorn, Rechts und Links sehend. Also ein wenig Stoff gekauft, ein Muster für eine Jacke (noch mit dem Gedanken da etwas in der Form eines Brustgurtes wie für eine GoPro zu schneidern) und drauf los genäht.

Naja nicht ganz, das hat doch etwas gedauert.


An den Ärmel kommt eine Tasche:

jacke_tasche_aermel.jpg

Sowohl links und rechts (rechts nicht abgebildet).

jacke_aermeltasche.jpg

Die gleiche auf die Brust; deshalb ist auch der Reißverschluss so schief.

jacke_tasche_brust.jpg

Innen zwei großzügige Taschen zum Halten einer Power-Bank, dem Kabel dazu und eventuell irgendwelchen Krams.

jacke_innentasche.jpg

Ans Ende der Handytaschen habe ich ein kleines Loch geschnitten innen für das Ladekabel:

jacke_kabel.jpg

Eine Paspeltasche rechts und links, nahe der Seitennaht, da kommen die Flossen rein. Das dient auch der Armposition und somit der Orientierung der Tasche an der Schulter und dadurch der Drehung des Handys (wenn auch gering).

jacke_paspeltasche.jpg

Und ein solider Haken darf nicht fehlen!

jacke_haken.jpg

Fazit

Gute Idee! Nur hab ich gemerkt, dass ich beim Reinfummeln des Handys diese leider einmal gesperrt habe und somit hat es auch keine Bilder gemacht. Aber da hilf der geführte Modus, erst einschalten, dann kann ich das Handy nicht mehr sperren oder sonst damit interagieren.

Schulter rechts Beispiel Schulter Links Beispiel Nach vorn Beispiel

Altes iPhone 4 zur Seite (iPhone 8 nach vorn wird noch verarbeitet) Beispiel Theoretisch könnte ich also mit drei Handys gleichzeitig aufnehmen, hab nur keine drei.


Rucksack

geruest_in_rucksack.jpg

Idee

Angelehnt an Tordans Versuche wollte ich auch höher hinaus. Da ich aber nun mein iPhone 8 nehmen wollte und keine GoPro kaufen, wollte ich es nicht versuchen das am Rad anzubringen aufgrund meiner schlechten Erfahrungen mit Halterungen am Lenker.

geruest_ganz.jpg

Das ganze besteht aus Verpackungsmaterial einer Tischplatte, diese Teile waren rundherum als Schutz der Kante in der Pappe mit dabei, nun kleingesägt haben sie doch noch einen nutzen. Und Lochband und vielen kleinen Schrauben.

geruest_unten.jpg

Kurz abgehobelt für einen sicheren Halt am Besenstiel (beim Schneefegen zerbrochen, nicht extra hierfür geopfert). Diese beiden Löcher hab ich vorgebohrt, die anderen alle nicht, da war mir das nicht so wichtig, ich wollt erst wissen, ob das überhaupt funktioniert mit diesem Prototypen.

geruest_ball_mount.jpg

Genauso am anderen Ende, dann aber einfach übertrieben mit Lochband. Am Ende wackelt es noch immer ein wenig, aber das muss so gehen.

geruest_stiel_anbgebracht.jpg

Diesen “Fuß” habe ich angebracht, da das ganze sonst im Rucksack verrutscht (vorne - hinten), hiermit ist es nun nahezu rutschfrei fixiert. Außerdem gibt das dem Ganzen ein Gewicht am unteren Ende und hebt nicht so leicht von meinem Rücken ab.

geruest_fuss.jpg

Da das ganze noch drohte Windschief sich zu verziehen habe ich den Hohlraum kurzerhand “bespannt”:

geruest_bespannt_2.jpg

So passt das dann in den Rucksack, ist dort also nicht permanent fixiert:

geruest_halb_rucksack.jpg

Am oberen Ball kann ich nun meinen RAM-Mount anbringen und mein Handy, dann noch den Bildausschnitt justieren mithilfe von meiner Apple Watch (live zusehen). Dann starte ich Mapillary und Fahre los.

Fazit

Die Konstruktion sieht nicht so prickelnd aus, aber funktioniert super, und der Rucksack verbirgt das Schreinerische Grauen. Beispiel

Das ganze könnte noch ein wenig weiter vom Kopf weg sein nach hinten, mit dem Helm stoße ich da manchmal hinten an. Beispiel


Auto

Ja gut, Ram Mount mit Saugnapf an die Frontscheibe innen, leicht nach rechts ausrichten, hoch, damit die Motorhaube nicht drauf ist, und los. Damit mache ich Tags super Bilder mit dem Handy. Nur mag ich nicht extra mit dem Diesel umherfahren, nur um Bilder zu machen.

Das benutze ich also nur, wenn ich mal mit dem Auto wo hinfahre, wo ich noch keine Bilder gemacht habe, dann kann ich aber auch mal einen kleinen Umweg fahren.

Wenn ich stehe ist alles Scharf und nicht verwackelt. Beispiel

Aber ich stehe ja nicht immer… Beispiel

Sobald es Dunkel wird, sieht es nicht mehr so gut aus. Beispiel