Erstellung und Präsentation von Panoramen

Aus FunkFeuer Wiki
Zur Navigation springen Zur Suche springen

Folgendes ist eine Niederschrift meiner Erfahrungen, und kann keine absoluten Wahrheiten anbieten.

1. Aufnahme der Einzelbilder

Um das Zusammenfügen des Panoramas möglichst einfach zu machen, und dabei möglichst wenige sichtbare Verschiebungen zu produzieren folgende Tipps:

  • Bilder mit zwischen 20% und 30% Überschneidung aufnehmen.
  • Position möglichst Konstant halten (Am besten ein Stativ verwenden)
  • Den Drehpunkt möglichst Nahe am Knotenpunkt (Am Besten einen "Nodalpunktadapter" / Panorama-Stativ-Kopf, sind leider recht teuer (im 3-Stelligen €-Bereich, z.B.), kann man aber mit sowas [1] auch um einen 2-Stelligen €-Betrag selber basteln - so wie hier: Medium:Selbst_gebastelter_Nodalpunktadapter_(DSC_0034).jpg)).

2. Zusammensetzen des Panoramas

Ich habe die besten Ergebnisse mit Hugin erreicht.

  • Falls Wolken auf den Bildern zu sehen sind, umbedingt das Feature "Celeste" vor der Erkennung der Kontrollpunkte aktivieren. (Datei -> Einstellungen -> Kontrollpunkt-Detektor -> Cpfind+Celeste -> Als Standard verwenden)
  • Um Panoramas die Breiter als ca 70.000 Pixel sind zusammenzufügen, muss man aufgrund eines Bugs das ganze Toolset selbst komplieren - Mit hugin 2013.0 und enblend 4.2 lassen sich Panoramas erstellen, die bis zu 2^31 Pixel haben. Mein größtes damit erstelltes Panorama hat 253.352 x 8.476 Pixel - siehe [2]

2.1. Riesige Panoramen mit mehr als 2^31 Pixel

  1. Weitwinkel Fotos "ganz normal" (siehe oben) zu einem 360° Panorama verarbeiten, und die Würfelseiten vorm tiling aufheben.
  2. Tele-Fotos ebenfalls normal verarbeiten (Kette Hugin -> Nona -> Enblend). Enblend schmiert ab weil das Zielbild mehr als 2^31 Pixel hat (signed integer ?! schlechte Pizza? Addressierung mit signed variable..??) -> Die Ausgabe von Nona aufheben.
  3. Aus den von Nona vorverarbeiteten Bildern mit Enblend 4 Teilstücke (die den Weitwinkel-Würfel-Seiten entsprechen) mittels Enblend zusammenfügen.
  4. Die Teilstücke mittels Hugin+Nona von Zylindrisch auf Rectlinear verzerren
  5. Mit Gimp die Weitwinkel-Würfel-Seiten auf die Größe der Tele-Ausschnitte hochskalieren und den Teleausschnitt als Layer darüber legen, als TIF exportieren.
  6. Mit Imagemagick und ein paar Shell-Scripts die ich geschrieben habe (siehe [3] ) Die Würfelseiten in Tiles für den Salado-Player zerteilen.

Beispiel eines so erstellten Panoramas mit 400.000 Pixel Breite: [4]

3. Präsentation des Panoramas

  • Pannellum - Für 360° Panoramas unter 8.200 Pixel Breite, Technologie: Javascript + WebGL --> Beispiel: [5]
  • SaladoPlayer 1.3.5 Für 360° Panoramas bis zu 70.000 Pixel Breite, Technologie: Flash --> Beispiel: [6]
    • Um ein Equirectlinear Panorama (=Output von Hugin) mit SaladoPlayer präsentieren zu können, muss es mit dem SaladoConverter in ein Deep Zoom cubic panorama umgewandelt werden.
    • Um vom SaladoConverter akzeptiert zu werden, muss das Panorama genau halb so viele Pixel in der Höhe haben, wie in der Breite. In den meisten Fällen hat man keine komplette Kugel, sondern oben und unten fehlt ein Stück. Es ist wesentlich weniger Rechenaufwand diese schwarzen Streifen oben & unten nachträglich mit Gimp hinzuzufügen, als Hugin anzuweisen ein volles 360° * 180° Panorama auszugeben.
    • Alternative: erect2cubic (Vorteile: schneller & braucht weniger RAM, produziert weniger Artifakte (linien) & Pixelverhältnis muss nicht 2:1 sein, aber Horizont muss weiterhin zentriert sein; Nachteil: Input-Bild darf maximal 2^31 Pixel haben.)
      • Installation: sudo cpan -> install Panotools::Script
      • Verwendung: erect2cubic --erect=equirectlinear-input.tif --ptofile=cube.pto; nona -o prefix cube.pto
      • Tiling mittels imgcnv (siehe unten) Für die Umsortierung der Tiles ins Salado-Format hab ich ein script geschrieben: [7]
  • PanoJS3 für die "flache" Darstellung von Bildern, die zu groß sind, um sie direkt als JPG in einer vernünftigen Größe von wenigen MB in einem Stück vom Browser darstellen zu lassen. Siehe auch das panojs github repository. Technologie: Nur Javascript. --> Beispiel: [8]
    • Zum zerstückeln des Bildes in Tiles entweder das Inkludierte Python-Script verwenden, oder der Weg den ich gewählt habe: bioImageConvert
    • imgcnv -i MY_INPUT_IMAGE.tif -o MY_OUT_FOLDER/MY_OUT_BASE_NAME.jpg -t jpeg -tile 512
  • Zur Ausrichtung von Panoramen (Norden genau in die Mitte = 0° im Saladoplayer) hat sich die Verwendung von wolframalpha.com bewährt: Einfach in das Suchfeld Koordinaten, "sun" und Datum + Uhrzeit eingeben, und einer der ausgegeben Blöcke mit dem Titel "Sky position from 48° 12' 52.87" North | 16° 20' 29.76" East at 2:48 pm" hat dann die genaue Gradangabe in welche Richtung die Sonne zu dem Zeitpunkt an dem Ort gestanden ist. In diesem Fall 218,3°

Limits, Bugs & Workarounds verwendeter Tools

  • enblend und damit hugin stürzt ab, wenn ein Input oder Output file mehr als 2^31 Pixel haben sollte.
    • größt mögliches 360° x 180° equirectlinear Panorama das mit enblend generiert werden kann ist somit 65534 x 32767
    • Workaround: Hochauflösend braucht man bei unsrer Art von Panoramen eigentlich nur den Horizont
    • Also das Panorama auf 2 Schritte generieren, einmal mit hoher Auflösung und sehr schmal den Horizont (z.B. so wie [9] und mit einer geringeren Auflösung den Hintergrund. Anschließend skaliert man den Hintergrund mit Gimp (oder ähnlichem) auf die Größe des Horizonts und legt diesen darüber.
  • der SaladoConverter stürzt ebenfalls bei zu großen Input-Bildern ab, jedoch hat er eine etwas höhere mir nicht genau bekannte Grenze.
    • Das größte von mir damit erfolgreich konvertierte Panorama hatte 75692 x 37846 Pixel (siehe [10])
    • Mittels direktem aufrufen der einzelnen Teile des Converters konnte ich auch ein 80844 x 40422 Pixel großes Panorama konvertieren, jedoch hat das Artifakte produziert (siehe [11] Artefakte sieht man nur wenn man nah ranzoomt (Linien))