Verfasst am: 04.07.2012, 18:55
Titel: Rekonstruktion 3D - Koordinaten aus Kamerabild mit Nebenbed.
Hallo Alle,
bin mit diesem Thema gerade etwas überfordert. Habe leider kein gutes Buch (mehr) zur Hand und meine Recherche im Internet hat zwar viele Hits ergeben, aber nichts was mir geholfen hat. Eher hat es zu mehr Verwirrung geführt
Also ich habe folgendes Problem:
Ich habe ein Ortsfestes Welt-Koordinatensystem. Starr hierin befindet sich eine Kamera (d.h. Neigung und Ortsvektor der Kamera bleiben unverändert!). Die 4x4 Transformationsmatrix für die Umrechnung von Welt-KoSy in Kamera-KoSy ist bekannt.
In einem Vermessungschritt habe ich mit der "Camera Calibration Toolbox for Matlab" ( http://www.vision.caltech.edu/bouguetj/calib_doc/ ) habe ich die Kamera-Kalibrierungsmatrix errechnen lassen. Als Werte ergaben sich:
Code:
Calibration results (with uncertainties):
Focal Length: fc = [1017.215231012.54901] ± [NaNNaN]
Principal point: cc = [319.50000239.50000] ± [NaNNaN]
Skew: alpha_c = [0.00000] ± [NaN] => angle of pixel axes = 90.00000 ± NaN degrees
Distortion: kc = [0.000000.000000.000000.000000.00000] ± [NaNNaNNaNNaNNaN]
Pixel error: err = [0.115960.14469]
Note: The numerical errors are approximately three times the standard deviations (for reference).
Hiermit kann ich also beliebige 3D-Punkte so umrechnen, dass sie perspektivisch korrekt im 2D-Bild angezeigt werden. Schön und gut.
Nun möchte ich das ganze umgekehrt machen, also von 2D-Koordinaten in 3D-Koordinaten umrechnen. Ich weiß, dass bei der Projektion natürlich Informationen verloren gehen und damit das Problem nicht ohne Nebenbedingung gelöst werden kann. Hierfür möchte ich die Nebenbedingung Z_Welt = 0 anwenden. D.h. im Welt-KoSy hat der Punkt eine Z-Koordinate null. Anders gesagt: der Punkt liegt auf dem Boden
Einen Lösungsansatz, bei dem ich dachte er hilft, habe ich in der Diplomarbeit "Entwicklung eines Systems zur visuellen Positionsbestimmung von Interaktionspartnern" ( http://aiweb.techfak.uni-bielefeld......-theses/Savas2005-DIP.pdf ) S. 59 gefunden. Hier wird eine Pseudo-Inverse verwendet. Aber der darin erwähnte Vektor p_4 ist bei mir ein Nullvektor (siehe obige Formel für P) und damit wird der Vektor C~ ebenfalls Null. Damit kann ich den Punkt nicht wie gewünscht berechnen...
Kann mir jemand, der das vllt schon mal gemacht hat, weiterhelfen? Wäre super nett, Danke!
P.S.: Sorry, musste den Beitrag auf zwei Posts aufteilen. Irgendwie wurde er sonst nicht korrekt angezeigt.
_________________
So nur mal kurz zur Zusammenfassung. Du hast EINE Kamera kalibriert. Nun hast du die intrinsischen Parameter (Brennweite etc.) und die extrinsischen Parameter (Rotation und Translation). Somit weißt du nun wo sich die Kamera in Beziehung auf das Weltkoordinaten System befindet.
Jetzt willst du aus einem Kamerabild (2D) ein 3D Bild erzeugen, dass sich auf der Z_welt = 0 befindet?
Diesen Zusammenhang versteh ich nicht. Wenn du ein 2D Kamera Bild auf ein Weltkoordinatensystem ab bildest, wobei Z_welt = 0 ist, dann ist es ja kein 3D Bild mehr?
Noch zu dem Thema:
Wenn du ein Kamerabild hast und die Transformationsmatrix dann kannst du für einen Pixelpunkt auf dem Kamerabild eine Linie (Strahl) in den Raum. Sprich mit einen Kamerabild könntest du unendlich viele Punkte entlang dieser Linie generieren. Du brauchst noch ein zweites Bild von einer zweiten Kamera die um einen Winkel zur ersten Verschoben ist. Stichwörter Stereo Vision, Triangulation etc.
Vielleicht kannst du deine Frage nochmals präzisieren, damit ich wirklich weiß was du meinst
Danke erst mal für die Hilfe! Habs wohl etwas undeutlich formuliert.
Ja, ich habe EINE einzige Kamera, die ich vermessen habe. Diese ist fest auf einem stativ und leicht nach unten auf den Boden geneigt ausgerichtet.
In das Kamerabild habe ich Wege auf dem Boden eingezeichnet (z.B. die Trajektorie eines Roboters). D.h. ich habe die Koordinaten dieser Trajektorie in das Kamera-Koordinatensystem transformiert und dann projiziert, so dass der Weg "perspektivisch" korrekt angezeigt wurde.
NUN will ich umgekehrt einen Pixel aus meinem Bild nehmen und herausfinden, welche X- und Y-Koordinate dieser Punkt im "realen" 3D-Koordinatensystem hatte unter der Annahme, dass der Punkt auf dem Boden ist, also Z = 0.
Habe mich mit einem Gläschen Rotwein nochmal an die verlinkte Diplomarbeit gesetzt und meinen Fehler gefunden
Sollte es für jemanden hilfreich sein, hier ein Beispielcode wie ich von 3D-Kosy in Bild-Pixel und zurück rechne:
% Transformationsmatrix von 3D-Welt-KoSy in 3D-Kamera-Kosy (Ursprung auf CCD-Chip)
%
% Die Kamera ist so ausgerichtet, dass sie ca. in Richtung der pos. X-Achse des Welt-Kosy % zeigt. Im Kamerabild zeigt die pos. y-Achse dann nach links, die pos. z-Achse nach oben.
R_World_to_Cam = [-0.0113242625465167-0.9998220536853440.0151163536128891141.173585444427;
0.00842007509644635-0.0152123858102325-0.9998488106455871611.96528372161;
0.999900032304804-0.01119557284742610.00859117128537919847.090629282911;
0001];
% Projektions- und Transformationsmatrix P
P = K * R_World_to_Cam;
% Beliebige Punkte X_World in Welt-Koordinatensystem [mm] (homogene Koordinaten) % bilden zusammen ein Viereck mit Kantenlänge 10m x 4m
X_World_1 = [20000; 2000; 0; 1];
X_World_2 = [20000; -2000; 0; 1];
X_World_3 = [10000; 2000; 0; 1];
X_World_4 = [10000; -2000; 0; 1];
% Transformiere und Projiziere von 3D-World -> 2D-Picture
X_Pic_1 = P * X_World_1;
X_Pic_2 = P * X_World_2;
X_Pic_3 = P * X_World_3;
X_Pic_4 = P * X_World_4;
% normiere die homogenen Koordinaten (3tes Element muss 1 sein!)
X_Pic_1 = X_Pic_1 / X_Pic_1(3);
X_Pic_2 = X_Pic_2 / X_Pic_2(3);
X_Pic_3 = X_Pic_3 / X_Pic_3(3);
X_Pic_4 = X_Pic_4 / X_Pic_4(3);
% Jetzt nehme man vier beliebige Pixel aus dem Kamera-Bild... % (einfach von oben berechneten 30px nach rechts und 40px nach unten)
X_Pic_backtransform_1 = X_Pic_1(1:3) + [30; 40; 0];
X_Pic_backtransform_2 = X_Pic_2(1:3) + [30; 40; 0];
X_Pic_backtransform_3 = X_Pic_3(1:3) + [30; 40; 0];
X_Pic_backtransform_4 = X_Pic_4(1:3) + [30; 40; 0];
% ... und transformiere sie nach Ilker Savas, "Entwicklung eines Systems % zur visuellen Positionsbestimmung von Interaktionspartnern" zurück
M_Mat = P(1:3,1:3); % Matrix M is the "top-front" 3x3 part
p_4 = P(1:3,4); % Vector p_4 is the "top-rear" 1x3 part
C_tilde = - inv( M_Mat ) * p_4; % calculate C_tilde
% Invert Projection with Side-Condition ( Z = 0 ) and Transform back to % World-Coordinate-System
X_Tilde_1 = inv( M_Mat ) * X_Pic_backtransform_1;
X_Tilde_2 = inv( M_Mat ) * X_Pic_backtransform_2;
X_Tilde_3 = inv( M_Mat ) * X_Pic_backtransform_3;
X_Tilde_4 = inv( M_Mat ) * X_Pic_backtransform_4;
% Alles plotten figure(1);
% erst die Vogelperspektive des Welt-KoSy... subplot(1,2,1);
xlabel('Y-Welt');
ylabel('X-Welt');
grid on;
axis([-30003000022000]);
hold on;
P.S.: Habe jetzt auch rausgefunden, dass diese "Rück-Rechnung" auch "Inverse Perspective Mapping" genannt wird bzw. diesem Vorgehen ähnelt.
_________________
- EliteTUM
_____________________________________
Ilker Savas
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 22.11.2012, 23:23
Titel: Freut mich sehr, dass meine Diplomarbeit mal geholfen hat!
Ich freue mich sehr, dass Dir meine Diplomarbeit geholfen hat! Ich hätte nie gedacht, dass die irgendwann mal von jemandem gebraucht werden könnte, aber umso schöner, dass ich auf diesen Forumsbeitrag gestoßen bin und danke Dir, dass du meine Arbeit vorbildlich als Quelle genannt hast! Noch viel Erfolg in der Bildverarbeitung!
Eine (positive) Angewohnheit aus der Zeit meiner eigenen Diplomarbeit.
_________________
- EliteTUM
_____________________________________
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.