WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Rekonstruktion 3D - Koordinaten aus Kamerabild mit Nebenbed.

 

EliteTUM
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 70
Anmeldedatum: 21.04.11
Wohnort: München
Version: ---
     Beitrag Verfasst am: 04.07.2012, 19:55     Titel: Rekonstruktion 3D - Koordinaten aus Kamerabild mit Nebenbed.
  Antworten mit Zitat      
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 Smile

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.21523   1012.54901 ] ± [ NaN   NaN ]
Principal point:       cc = [ 319.50000   239.50000 ] ± [ NaN   NaN ]
Skew:             alpha_c = [ 0.00000 ] ± [ NaN  ]   => angle of pixel axes = 90.00000 ± NaN degrees
Distortion:            kc = [ 0.00000   0.00000   0.00000   0.00000  0.00000 ] ± [ NaN   NaN   NaN   NaN    NaN ]
Pixel error:          err = [ 0.11596   0.14469 ]

Note: The numerical errors are approximately three times the standard deviations (for reference).


Die 3x3 Kamera-Kalibrierungsmatrix K ist entsprechend:

Code:
K = [1.017215234570303e+03, 0, 3.195000000000000e+02;
0, 1.012549014668498e+03,2.395000000000000e+02;
0, 0, 1.0000];


Die 3 x 4 Projektionsmatrix P für die Projektions von 3D-Koordinaten im Kamera-KoSy in 2D-Pixel-Koordinaten ist entsprechend dann:

Code:
P = K * [eye(3), zeros(3,1)];

_________________

- EliteTUM
_____________________________________
Private Nachricht senden Benutzer-Profile anzeigen


EliteTUM
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 70
Anmeldedatum: 21.04.11
Wohnort: München
Version: ---
     Beitrag Verfasst am: 04.07.2012, 19:59     Titel:
  Antworten mit Zitat      
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 Wink

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... Sad

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.
_________________

- EliteTUM
_____________________________________
Private Nachricht senden Benutzer-Profile anzeigen
 
Goofy9020
Forum-Century

Forum-Century


Beiträge: 164
Anmeldedatum: 10.08.11
Wohnort: ---
Version: 2009a, 2010b
     Beitrag Verfasst am: 05.07.2012, 11:07     Titel:
  Antworten mit Zitat      
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 Smile

lg Goofy
Private Nachricht senden Benutzer-Profile anzeigen
 
EliteTUM
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 70
Anmeldedatum: 21.04.11
Wohnort: München
Version: ---
     Beitrag Verfasst am: 05.07.2012, 16:48     Titel:
  Antworten mit Zitat      
Hallo,

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 Very Happy
Sollte es für jemanden hilfreich sein, hier ein Beispielcode wie ich von 3D-Kosy in Bild-Pixel und zurück rechne:

Code:
% Clean-Up First
clear all;
close all;
clc;

% Kamera-Kalibrierungsmatrix
K = [1.017215234570303e+03, 0, 3.195000000000000e+02, 0;
0, 1.012549014668498e+03,2.395000000000000e+02, 0;
0, 0, 1.0000, 0;
0, 0, 0, 0];

% 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.999822053685344   0.0151163536128891   141.173585444427;
0.00842007509644635   -0.0152123858102325   -0.999848810645587   1611.96528372161;
0.999900032304804   -0.0111955728474261   0.00859117128537919   847.090629282911;
0   0   0   1];

% 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;

mue_N_1 = -C_tilde(3) / X_Tilde_1(3);
mue_N_2 = -C_tilde(3) / X_Tilde_2(3);
mue_N_3 = -C_tilde(3) / X_Tilde_3(3);
mue_N_4 = -C_tilde(3) / X_Tilde_4(3);

% Do the inversion of above steps...
X_World_backtransform_1 = mue_N_1 * inv( M_Mat ) * X_Pic_backtransform_1 + C_tilde;
X_World_backtransform_2 = mue_N_2 * inv( M_Mat ) * X_Pic_backtransform_2 + C_tilde;
X_World_backtransform_3 = mue_N_3 * inv( M_Mat ) * X_Pic_backtransform_3 + C_tilde;
X_World_backtransform_4 = mue_N_4 * inv( M_Mat ) * X_Pic_backtransform_4 + C_tilde;


% Alles plotten
figure(1);
% erst die Vogelperspektive des Welt-KoSy...
subplot(1,2,1);
xlabel('Y-Welt');
ylabel('X-Welt');
grid on;
axis([-3000 3000 0 22000]);
hold on;


plot( -X_World_1(2), X_World_1(1), 'bo' );
plot( -X_World_2(2), X_World_2(1), 'bo' );
plot( -X_World_3(2), X_World_3(1), 'bo' );
plot( -X_World_4(2), X_World_4(1), 'bo' );
line([-X_World_1(2) -X_World_2(2) -X_World_4(2) -X_World_3(2) -X_World_1(2)], [X_World_1(1) X_World_2(1) X_World_4(1) X_World_3(1) X_World_1(1)], 'Color', 'blue' );

plot( -X_World_backtransform_1(2), X_World_backtransform_1(1), 'ro' );
plot( -X_World_backtransform_2(2), X_World_backtransform_2(1), 'ro' );
plot( -X_World_backtransform_3(2), X_World_backtransform_3(1), 'ro' );
plot( -X_World_backtransform_4(2), X_World_backtransform_4(1), 'ro' );
line([-X_World_backtransform_1(2) -X_World_backtransform_2(2) -X_World_backtransform_4(2) -X_World_backtransform_3(2) -X_World_backtransform_1(2)], [X_World_backtransform_1(1) X_World_backtransform_2(1) X_World_backtransform_4(1) X_World_backtransform_3(1) X_World_backtransform_1(1)], 'Color', 'red' );


hold off;

% ...dann das Kamera-Bild
subplot(1,2,2);
hold on;
image(ones(480,640).*255);
colormap(gray(256));
axis([0 640 -480 0]);
line([X_Pic_1(1) X_Pic_2(1) X_Pic_4(1) X_Pic_3(1) X_Pic_1(1)], -1*[X_Pic_1(2) X_Pic_2(2) X_Pic_4(2) X_Pic_3(2) X_Pic_1(2)], 'Color', 'blue' );
line([X_Pic_backtransform_1(1) X_Pic_backtransform_2(1) X_Pic_backtransform_4(1) X_Pic_backtransform_3(1) X_Pic_backtransform_1(1)], -1*[X_Pic_backtransform_1(2) X_Pic_backtransform_2(2) X_Pic_backtransform_4(2) X_Pic_backtransform_3(2) X_Pic_backtransform_1(2)], 'Color', 'red' );
hold off;


P.S.: Habe jetzt auch rausgefunden, dass diese "Rück-Rechnung" auch "Inverse Perspective Mapping" genannt wird bzw. diesem Vorgehen ähnelt.
_________________

- EliteTUM
_____________________________________
Private Nachricht senden Benutzer-Profile anzeigen
 
Ilker Savas

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.11.2012, 00:23     Titel: Freut mich sehr, dass meine Diplomarbeit mal geholfen hat!
  Antworten mit Zitat      
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! Smile

Ilker Savas
 
EliteTUM
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 70
Anmeldedatum: 21.04.11
Wohnort: München
Version: ---
     Beitrag Verfasst am: 23.11.2012, 00:32     Titel:
  Antworten mit Zitat      
Eine (positive) Angewohnheit aus der Zeit meiner eigenen Diplomarbeit. Smile
_________________

- EliteTUM
_____________________________________
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.