Photogrammetrie/Vermessen mit der Digitalkamera:
Vielleicht sind Sie auch schon vor der Herausforderung gestanden, einen Plan Ihres Gartens zu zeichnen. Sofern Sie kein Vermessungs-Profi sind und sich mit Theodoliten und Nivellieren auskennen, müssen Sie sich mit einem Maßband aushelfen. Mitunter kann das ganz schön viel Arbeit sein.Da wäre es doch eine angenehme Möglichkeit, wenn man Ihren Fotoapparat dazu verwenden kann. Die dazu erforderliche Methode nennt sich terrestrische Photogrammetrie und wird zumeist mit hochwertigen und teuren Präzissionsgeräten betrieben. Für einen vertieften Einstieg können Sie bei wikipedia nachsehen. Für jene Vermessungsaufgaben, die keine hohe Genauigkeit erfordern, beschreibe ich im folgenden, wie Sie mit freier Software zu einem 3d-Modell kommen. Arbeit ist es trotzdem, aber vielleicht macht diese auch Spass. Noch ein Hinweis. Falls Sie sich mit dieser Methode spielen, geschieht das auf Ihre Verantwortung, ich hafte für keine Folgen, prüfen Sie stets Ihre Arbeit sorgfältig.
1. Die Werkzeuge:
Soweit mir bekannt ist, gibt es zwei freie Softwarepakete, die uns dabei helfen können:stereo-0.2b ist eine Unix/Linux Software, die es ermöglicht aus zwei Aufnahme und einigen Passpunkte räumliche Koordinaten abzuleiten. Nun fehlt es jedoch zumeist an Passpunkten mit bekannten Koordinaten.
Panotools (siehe auch Panotools-Wiki und die alte Website von Panotools) ist eine Unix/Linux/Windows Software, die in erster Linie der Erstellung von Panoramen dient. Ein Tool (PTStereo) ermöglicht die Auswertung von Fotografien zur Berechnung von räumlichen Dreiecks-Gitternetzen. Da es mit den Panotools auch möglich ist, die Vermessung unter bestimmten Voraussetzungen ohne Passpunkte durchzuführen und eine Schnittstelle zur 3d-Software Blender3d besteht, habe ich die Panotools für meine Arbeiten gewählt. Für jemanden, der bereits mit Photgrammetrischen Aufgaben vertraut ist, wird die in diesem Artikel verwendete Nomenklatur merkwürdig sein. Ich habe bei allen Variablenbezeichnungen auf die Gebräuche der PanoTools zurückgegriffen.
Was benötigt man nun?:
1.) Panotools, beachten Sie, dass Sie auch PTStereo erhalten. Dies gibt es nur als Programm, aber nicht als Quelltext.
2.) Hugin oder ein ähnliches Programm, um auf den Bildern die Messpunkte zu erfassen. Dies geht auch mit dem ptpicker aus den Panotools (den wir sowieso für die Erstellung der Dreiecke zwischen den Messpunkten brauchen werden). Die Erfassung der Messpunkte geht aber meiner Meinung nach mit Hugin leichter.
3) Ein 3d-Programm, dass VRML-Files lesen und bearbeiten kann, ich schlage Blender3d vor.
2. Die Vorbereitung:
Leider sind insbesondere die Panotools nicht so leicht zu installieren wie gewohnt. Ich beschreibe den Weg für Linux, unter Windows funktioniert es ähnlich.Eventuell sind die Panotools bei Ihrer Distribution enthalten, achten Sie darauf, dass Sie auch PTStereo haben. Sonst besorgen Sie sich die Programme von den oben angeführten Quellen. Sie erhalten dort auch schon fertig kompilierte Fassungen, für unsere Zwecke genügen die alten Versionen von home.no.net/dmaurer/~dersch.
Nun wird es etwas kompliziert. Das Java-Archiv ptpicker.jar können Sie nach /usr/local/bin kopieren. Leider hat Java eine standardmäßige Einschränkung im Hinblick auf den Arbeitsspeicher, der Sie hindert, große Dateien zu öffnen. Um das zu umschiffen haben ich ein kleines Script geschrieben (heißt bei mir ptpicker.start), nach /usr/local/bin kopiert und dort die Rechte dafür so vergeben, dass es ausführbar ist (chmod o+x).
#! /bin/sh
cd /usr/local/bin
/usr/lib/java/bin/java -Xmx225m -jar /usr/local/bin/ptpicker.jar
Die Option "-Xmx225m " teilt 225 Mb Speicher zu, bei Bedarf anpassen.
ptpicker erwartet, dass das Verzeichnis "Helpers" mit den Hilfsprogrammen in jenem Verzeichnis steht, aus dem ptpicker.jar ausgeführt wird. Bei mir wird mit dem oben angeführten Script ptpicker.jar in /usr/local/bin ausgeführt, daher habe ich Helpers nach /usr/local/bin kopiert.
Weiters muss die Bibliothek libpano12.so an der richtigen Stelle sein (z.B. /usr/lib und z.B. für das Java-System in /usr/lib/jvm/java-1.4.2-sun-1.4.2.05/jre/lib/i386). Bei Windows sollte man sie glaube ich nach /Windows/Sytem kopieren.
Damit Sie von überall auf die Hilfsprogramme wie PTOptimizer zugreifen können, ist es weiters angenehm, diese auch nach /usr/local/bin zu kopieren.
Besonders zickig ist das Hilfsprogramm PTStereo, das wir für die Berechnung des räumlichen Modelles brauchen. Ohne fremde Hilfe findet es in Linux nämlich seine Templates (Muster) für die Ausgabe der VRML-Dateien nicht. In jenem Verzeichnis, in dem Sie PTStereo ausführen, muss ein Link auf die Helpers sein (dort werden die Templates gesucht). Hierzu ein Beispiel:
Die Templates befinden sich in /usr/local/bin/Helpers/Templates
Sie starten PTStereo von /home/testuser/photogrammetrie
...> erstellen Sie folgenden Link: ln -s /usr/local/bin/Helpers "/home/testuser/photogrammetrie/(null)"
Ist alles in bischen merkwürdig, funktioniert aber. Vergessen Sie die " " nicht! Ich habe mir angewöhnt, PTStereo von /usr/local/bin zu starten und dort daher den Link eingebaut. Dann funktioniert auch der Aufruf von PTStereo vom ptpicker aus.
Damit sind die Tücken von PTStereo noch nicht ganz behoben. Die VRML Dateien, die damit standardmäßig produziert werden, können von Blender nicht geöffnet werden. Sie müssen daher in den Templates zwei Dateien ändern:
Datei VRML_HEADER:
#VRML V1.0 ascii
# This is an adopted VRML_HEADER to produce vrml-files for Blender 2.41
# please use the adopted INDEXED_FACE_FMT
# Konrad Stania, 2006, released under GPL
# 'Switch' is used as a hack, to ensure it is not part of the drawing
und die Datei INDEXED_FACE_FMT:
# This is an adopted INDEXED_FACE_FMT to produce VRML for Blender
# Stania, 2006, GPL
Separator {
Switch {
Def Grid
Separatur {
Coordinate3 {
point [
%s
]
}
IndexedFaceSet {
coordIndex [
%s
]
}
}
# Hidden Objects, in invisible layers
}
# Visible Objects
Separator
Separator {
MatrixTransform {
matrix
1.000000 0.000000 0.000000 0.000000
0.000000 1.000000 0.000000 0.000000
0.000000 0.000000 1.000000 0.000000
0.000000 0.000000 0.000000 1.000000
}
USE Grid
}
}
}
Damit ist das schlimmste überstanden. Installieren Sie jetzt nur noch hugin und blender und es kann losgehen.
3. Die Arbeit:
Für unsere Photogrammetrische Arbeit benötigen wir zwei Bilder, die das zu vermessende Objekt von zwei Standpunkten aus abbilden:
(Stereoskopische Anordung)
Sie benötigen natürlich nicht zwei Kameras (außer wenn sich Ihr Objekt bewegt). In der Praxis nehmen Sie die Aufnahmen hintereinander auf.
Das Ziel unserer Arbeit ist es, die beiden Aufnahmen so vorzunehmen, dass ein möglichst genaues Modell entsteht. Hierzu kann man wie folgt vorgehen.
3.1 Die richtige Kamera wählen und diese kalibrieren:
Mit den Panotools können Sie viele optische Fehler korrigieren, manchmal kommt man damit aber auch an sein Ende. Meine Versuche habe ich mit einer EOS 300d (6 MPix) und einem Sigma 12-24 mm durchgeführt. Man sollte bei der Kamera folgendes beachten:*) Das Objektiv sollte nicht wackeln, eine Abweichung der Achse des Objektivs zum Bildmittelpunkt ist korrigierbar, wenn das Wackeln aber von Aufnahme zu Aufnahme stattfindet, dann ist man am Ende.
*) Sowohl der Zoom als auch die Entferungseinstellung verändern den Bildwinkel, wählen Sie daher eine konstante Zoomeinstellung (bzw. ein Objektiv mit Festbrennweite) und verändern Sie die Entferungseinstellung nicht (z.B. 12mm und unendlich, Schärfe reicht durch Abblenden auf Blende 16 sehr weit in den Nahbereich). Der Autofokus sollte abgeschalten sein.
Mit der Kalibrierung der Kamera möchte ich erreichen, dass der Bildwinkel genau bekannt ist, die Verzeichnungen und die Abweichung des Bildmittelpunkte von der optischen Achse korrigiert sind. Dazu gehe ich wie folgt vor:
*) Ein Panorama aufnehmen, das erste Foto sollte sich z.B. 60 Prozent mit dem zweiten und den letzten überlagern (am besten Sie verwenden ein Stativ und achten darauf, dass die Kamera horizontal steht, keine Rotation der Objektivachse zwischen den Aufnahmen). Zwischen dem ersten, dem zweiten und dem letzen Bild (in der Zeichnung die Nummer 0, 1 und 5) werden viele Passpunkte (bis zum Rand) gesetzt, das Bild 0 dient der Erstellung der Korrekturfunktion für die Verzeichnungen. Die restlichen Bilder (in der Zeichnung 2, 3 und 4) werden mit wenigen Passpunkte verbunden.
(Zur Kalibierung des Objektivs und der Kamera wird ein komplettes Panorama aufgenommen)
Beachten Sie, dass sich das Objektiv um den Nodalpunkt drehen sollte. Das ist jener Punkt, in dem die Lichtstrahlen zusammenlaufen. Dieser liegt mitunter weit vor dem Stativgewinde der Kamera. Ein Drehen um das Stativgewinde führt daher zu einem Parallaxenfehler, der sich besonders bei nahen Zielen auswirkt. Drehen Sie daher beim Kalibrieren der Kamera diese um den Nodalpunkt oder verwerten Sie zur Kalibrierung nur sehr weit entfernte Ziele, bei denen die beim Drehen entstehende Parallaxe keine Rolle spielt. Den Nodalpunkt können Sie dadurch bestimmen, dass Sie die Kamera auf eine Schiene montieren, die eine Verschiebung des Drehpunktes entlang der Objektivachse ermöglich. Zielen Sie nun von einem sehr nahen auf ein weites Ziel, drehen Sie die Kamera und verändern Sie den Drehpunkt entlang der Objektivachse, bis sich das nahe Ziel gegenüber dem fernen Ziel bei Drehung nicht mehr verschiebt.
(Mit einigen Teilen aus dem Baumarkt können Sie eine Verbindung zwischen dem Stativkopf und der Kamera bauen, die eine exakte Zentrierung des Nodalpunktes über der Drehachse ermöglicht. Verwendet wurden Schrauben, Stahlwinkel und zur Horizontalverschiebung eine Stahlplatte, in die ein Schlitz geschnitten wurde.)
Falls Sie Hugin verwenden, geben Sie an, dass die Korrektur für die Verzeichnung (a, b, c), der Verschiebung des Bildmittelpunkte (d und e) und der Bildwinkel v vom ersten Bild geerbt werden soll, den Wert Y (=yaw) der weiteren Bilder stellen sie derart ein, dass sie gleichmäßig verteilt im Panorama liegen. Für das erste Bild optimieren Sie daher a, b, c, d, e und v, für den Rest den Pitch p, den yaw y und die Rotation r. Ein Optimizer-Skript könnte wie folgt aussehen:
# PTOptimizer script, written by hugin
p f2 w3000 h1500 v360 n"JPEG q90"
m g1 i0 f0
# image lines
i w3072 h2048 f0 a0.0001 b0.0001 c0.00000 d0.000 e0.0000 g0 p0.00000 r0.0000 t0 v86.7019 y0 u10 n"img_8007.jpg"
i w3072 h2048 f0 a=0 b=0 c=0 d=0 e=0 g0 p0 r0 t0 v=0 y45 u10 n"img_8008.jpg"
i w3072 h2048 f0 a=0 b=0 c=0 d=0 e=0 g0 p0 r0 t0 v=0 y90 u10 n"img_8009.jpg"
i w3072 h2048 f0 a=0 b=0 c=0 d=0 e=0 g0 p0 r0 t0 v=0 y135 u10 n"img_8010.jpg"
i w3072 h2048 f0 a=0 b=0 c=0 d=0 e=0 g0 p0 r0 t0 v=0 y180 u10 n"img_8011.jpg"
i w3072 h2048 f0 a=0 b=0 c=0 d=0 e=0 g0 p0 r0 t0 v=0 y270 u10 n"img_8012.jpg"
# specify variables that should be optimized
v v0 a0 b0 c0 d0 e0
v y1 r1 p1
v y2 r2 p2
v y3 r3 p3
v y4 r4 p4
v y5 r5 p5
v y6 r6 p6
v y7 r7 p7
v y8 r8 p8
Als Ergebnis erhalten Sie für das Erste Bild eine Zeile "o", aus der Sie die Verzeichnungskorrektur-Parameter a, b, c, die Verschiebung des Bildmittelpunktes am Sensor sowie den Bildwinkel v entnehmen können. Bei manchen Objektiven ist es besser nur die Verzeichnungskorrekturen a und b zu verwenden. Rechnen Sie bitte ein Panorama aus (z.B. mit PTStitcher), und prüfen Sie, ob es schön gerade ist und keine Sprünge aufweist. Fehlerquellen können falsche Passpunkte oder Anfangsbedingungen bei der Optimierung sein (z.B. y-Werte ungünstig gewählt).
Bei meinen Arbeiten hat sich gezeigt, dass die Werte für d und e nicht vom ersten Bild in die o-Zeilen der weiteren Bilder übernommen wurden. Diese wären daher händisch nachzutragen, und das Ergebnis mit einem weiteren Lauf des Optimizers zu verbessen. Heben Sie die Rechenergebnisse gut auf. Immer wenn Sie diese Optik benutzen, können sie verwendet werden.
3.2 Die Messaufnahmen durchführen:
Die Genauigkeit der Messung wird sowohl von der Güte der Kamera als auch der Anordung der Kamera bei der Messung bestimmt. Folgende Vorgehensweise wäre günstig:*) Wählen sie einen ausreichenden Abstand der Kameras (Länge der Basis). Gute Ergebnisse dürften sich ergeben, wenn die Basis mindestens 1/10 so lang ist, wie die Distanz zum weitest entfernten Punkt. Meine Testrechnung bei einer Basislänge von ca. 1/20 der Entfernung einen Lagefehler von ca. 3 % cm und bei einer Basislänge von 1/2 der Tiefe von ca. 0,15 % cm.
*) Wenn sie die Kamera exakt horizontal ausrichten und beide Kamerastandorte auf gleicher Höhe sind, wird ihr Modell schon ziemlich richtig im Raum sein. Zur weiteren horziontale Ausrichtung des fertigen Modelles sollten Sie versuchen exakt senkreche Kanten mit zu erfassen. Eine senkrechte Kante kann z.B. auch eine aufgestellt Stange sein. Laternenmasten sind meist schief.
*) Nehmen Sie (eine) Strecke(n) mit auf, deren Länge bekannt ist. Dies hilft beim Einpassen des Modells.
*) Messen Sie die Länge der Basis und verwenden Sie diese als X-Wert für die rechte Kamera. Dann ist das Modell schon ziemlich genau skaliert. Diese Länge ist nicht der Abstand der Stative sondern der Nodalpunkte der Objektive.
*) Bestimmen Sie den Winkel y (=yaw) der Kamerausrichtung exakt. Wenn die vermessenen Punkte alle ziemlich gleich weit von der Kamera entfernt sind, dann kann diese auch durch Optimierung geschehen. Dies wird aber nur selten der Fall sein. Der yaw muss daher gemessen werden. Ich bin dabei wie folgt vorgegangen. Zuerst habe ich an den beiden Kamerastandorten Stative aufgestellt (es genügen einfache Leuchtenstative). Je Kamerastandort habe ich zwei Bilder (Messbild und Verbindungsbild, dass einen Teil des Messbildes umfasst, aber auch den anderen Kamerastandort zeigt). Die beiden Bilder habe ich dann mit Hugin zusammengerechnet und damit den Winkel zwischen der Basis und dem Messbild bestimmt. Nützlich ist dabei, dass man in Hugin ein Bild "verankern" kann (jenen Punkt im Verbindungsbild angeben, der den anderen Kamerastandort zeigt). Als Kameraparameter finden die bei der Kalibrierung angegebenen Wert Anwendung, optimiert werden y, p und r (Messbild). Für die linke Kamera wird anschließend der Wert (90 - y) verwendet, für die rechte Kamera der Wert (y - 90).
(Wählen Sie die Kamerastandorte derart aus, dass sie diese gegenseitig sehen können. Damit sind sie in der Lage, den horizontalen Winkel der Achse der Messbilder (y, yaw) zu bestimmen. Wenn Sie die Kameras horizontal ausrichten, dann haben Sie schon einen guten Anhaltpunkt für die Höhenausrichtung des Modell. Sie müssen dieses dann nur in Blender laden und in der Seitenansicht um 90° zu drehen)
3.2 Die Messungen auswerten:
Laden Sie die Messbilder in hugin, geben Sie die Kameraparameter ein (samt yaw) und erfassen Sie die Messpunkte. Wenn Sie Glück haben, können sie die automatische Erkennung von Punkten verwenden. Speichern Sie die Datei und verlassen Sie hugin. Ab nun wird nur mit den Panotools weiter gearbeitet. Dazu kopieren Sie das Ergebnis von hugin in einen Datei mit der Endung ".txt". Öffnen sie die Datei in einem Editor, Sie werden die Optimierungsparameter geringfügig ändern müssen, bis diese wie folgt aussieht (X, Y und Z sind die Koordinaten der Kameras, geben Sie dabei für das linke Bild X0 Y0 Z0 an und für das rechte Bild X[Länge der Basis] Y0 Z0 an). Beachten Sie bei der Berechnung der Länge der Basis, dass diese nicht vom Stativgewinde aus zu messen ist, sondern von den Nodalpunkten.p f2 w3000 h1500 v360 u10 n"JPEG q90"
i f0 w3072 h2048 y-2.52 p0 r0 v83.6911 n"img_8006.jpg" a0.005475 b-0.004576 c0 d12 e-33 X0 Y0 Z0
i f0 w3072 h2048 y-2.52 p0 r0 v=0 n"img_8005.jpg" a=0 b=0 c=0 d12 e-33 X8.34 Y0 Z0
v r0
v p1 r1
#ab hier folgen die Messpunkte:
speichern Sie die Datei, starten Sie ptpicker und öffnen Sie diese Datei in diesem Programm.
Sie können nun im ptpicker alle Messpunkte anwählen und ein automatisches Triangulieren starten (EDIT/TRIANGULATE). Fall sich dabei Dreiecke ergeben, die nicht passend sind, markieren Sie alle Eckpunkte dieser Dreiecke (EDIT/SELECT) und löschen Sie die Dreiecke (EDIT/REMOVE TRIANGLE). Neue Dreiecke erstellen Sie mit EDIT/SET TRIANGLE.
Anschließend speichern Sie das Projekt und starten Sie entweder PROJEKT/3D stereo direkt aus dem ptpicker oder PTStereo auf der Kommandozeile. Als Ergebnis erhalten Sie ein Dreiecksmodell im VRML-Format, dass Sie in Blender importieren können.
Leider importiert Blender3d die Zuweisung der Bilddaten zu den entstandenen Dreiecken nicht, das heißt Sie erhalten kein mit Texturen versehenes Modell. Um dies doch zu erreichen, habe ich zu folgenden Kunstkniff gegriffen. Der Erste Schritt nach dem Import in Blender3d ist dabei, dass ich die Kamera genau auf den Punkt stelle, von dem aus eine Aufnahme der Stereo-Auswertung gemacht wurde (X-Y-Z Koordinaten, stehen im PanoTools file für PTStereo). Der Kamera habe ich eine Brennweite zugewiesen, wie sie der Aufnahmebrennweite bezogen auf das Kleinbild entspricht und der Kamera als Drehung um die Y Achse den Wert des Yaw aus PanoTools zugewiesen (falls auch ein p und ein r Wert in Panotools verwendet wurde, muss die Kamera auch um die X und Z-Achse gedreht werden). Anschließend wird eine Ansicht als Kameransicht gewählt. Diese sollte nun das Modell so zeigen, wie auf dem Foto aufgenommen (allerdings ohne Kissen- und tonnenförmige Verzeichnungen). Das Geländemodell wird gewählt, in dem in den UV-EditModus gegangen wird. Die "Faces" werden entsprechend dem Kamera-Fenster "ungewrapt", das heißt Bildbereichen zugewiesen. Wenn Sie nun ein Bildfenster öffnen und das aufgenommenen Messbild wählen, können Sie durch skalieren und verschieben das Bild exakt auf das Modell legen. Sie haben nun ein textiertes Model ihres Geländes und können damit z.B. ein Orthofoto (Grundriss mit entzerrtem Foto) erstellen. Falls Ihr Objektiv eine starke Verzeichnung aufweist, können Sie das Messbild vorher in einem Bildbearbeitungsprogramm (z.B. Gimp mit den Pano-Tools Plug-In) entzerren. Verwenden Sie hierbei die bereits bestimmten a,b,c,d und e Werte des Objektivs.
Bitte beachten Sie, dass die Entfernung von der Basis als Z-Achse abgebildet wird, das Modell ist daher z.B. bei horizontaler Ausrichtung der Kameras in der Seitenansicht um 90 Grad zu drehen. Nun können Sie in Blender das Modell prüfen (z.B. ob eine bekannte senkrechte/horizontale Linie exakt senkrecht/horizontal ist, Achtung: Lampenmasten sind selten senkrecht) und den Masstab anpassen.
Falls sie gravierende Fehler feststellen, prüfen Sie, ob Messpunkte richtig identifiziert sind, Bild- oder Optimierungsparameter stimmen.