it-swarm.com.de

Extrahieren Sie die Translation und Rotation aus der Grundmatrix

Ich versuche, Translations- und Rotationsvektoren aus einer berechneten Grundmatrix abzurufen. Ich benutze OpenCV und der allgemeine Ansatz stammt aus Wikipedia. Mein Code ist wie folgt:

//Compute Essential Matrix
Mat A = cameraMatrix(); //Computed using chessboard
Mat F = fundamentalMatrix(); //Computed using matching keypoints
Mat E = A.t() * F * A;

//Perfrom SVD on E
SVD decomp = SVD(E);

//U
Mat U = decomp.u;

//S
Mat S(3, 3, CV_64F, Scalar(0));
S.at<double>(0, 0) = decomp.w.at<double>(0, 0);
S.at<double>(1, 1) = decomp.w.at<double>(0, 1);
S.at<double>(2, 2) = decomp.w.at<double>(0, 2);

//V
Mat V = decomp.vt; //Needs to be decomp.vt.t(); (transpose once more)

//W
Mat W(3, 3, CV_64F, Scalar(0));
W.at<double>(0, 1) = -1;
W.at<double>(1, 0) = 1;
W.at<double>(2, 2) = 1;

cout << "computed rotation: " << endl;
cout << U * W.t() * V.t() << endl;
cout << "real rotation:" << endl;
Mat rot;
Rodrigues(images[1].rvec - images[0].rvec, rot); //Difference between known rotations
cout << rot << endl;

Am Ende versuche ich, die geschätzte Rotation mit der zu vergleichen, die ich mit dem Schachbrett in jedem Bild berechnet habe (ich plane, die extrinsischen Parameter ohne das Schachbrett zu erhalten). Zum Beispiel bekomme ich das:

computed rotation:
[0.8543027125286542, -0.382437675069228, 0.352006107978011;
  0.3969758209413922, 0.9172325022900715, 0.03308676972148356;
  0.3355250705298953, -0.1114717965690797, -0.9354127247453767]

real rotation:
[0.9998572365450219, 0.01122579241510944, 0.01262886032882241;
  -0.0114034800333517, 0.9998357441946927, 0.01408706050863871;
  -0.01246864754818991, -0.01422906234781374, 0.9998210172891051]

Es scheint also ein Problem zu geben, ich kann einfach nicht herausfinden, woran es liegen könnte.

EDIT: Hier sind die Ergebnisse, die ich mit dem nicht transponierten vt erhalten habe (offensichtlich aus einer anderen Szene):

computed rotation: 
[0.8720599858028177, -0.1867080200550876, 0.4523842353671251;
 0.141182538980452, 0.9810442195058469, 0.1327393312518831;
-0.4685924368239661, -0.05188790438313154, 0.8818893204535954]
real rotation
[0.8670861432556456, -0.427294988334106, 0.2560871201732064;
 0.4024551137989086, 0.9038194629873437, 0.1453969040329854;
-0.2935838918455123, -0.02300806966752995, 0.9556563855167906]

Hier ist meine berechnete Kameramatrix, der Fehler war ziemlich gering (ca. 0,17 ...).

[1699.001342509651, 0, 834.2587265398068;
  0, 1696.645251354618, 607.1292618175946;
  0, 0, 1]

Hier sind die Ergebnisse, die ich erhalte, wenn ich versuche, einen Würfel neu zu projizieren ... Kamera 0, der Würfel ist achsenausgerichtet, Rotation und Translation sind (0, 0, 0). image http://imageshack.us/a/img802/5292/bildschirmfoto20130110u.png

und die andere mit den Epilinien der Punkte im ersten Bild. image http://imageshack.us/a/img546/189/bildschirmfoto20130110uy.png

16
Teris

Bitte schauen Sie sich diesen Link an:

http://isit.u-clermont1.fr/~ab/Classes/DIKU-3DCV2/Handouts/Lecture16.pdf .

Siehe Seite 2. Es gibt zwei Möglichkeiten für R. Die erste ist UWVT und die zweite ist UWTVT. Du hast die zweite benutzt. Versuchen Sie es zuerst.

10
user1993497

Der 8-Punkte-Algorithmus ist die einfachste Methode zur Berechnung der Grundmatrix. Wenn Sie jedoch vorsichtig vorgehen, können Sie diese Methode gut ausführen. Der Schlüssel, um gute Ergebnisse zu erzielen, ist eine sorgfältige Normalisierung der Eingabedaten, bevor die zu lösenden Gleichungen erstellt werden. Viele Algorithmen können das. Die Pixelpunktkoordinate muss in Kamerakoordinaten geändert werden. Dies geschieht in der folgenden Zeile:

Mat E = A.t() * F * A;

Diese Annahme ist jedoch nicht korrekt. Wenn die Kamerakalibrierungsmatrix K bekannt ist, können Sie den Punkt x invertieren, um den in normalisierten Koordinaten ausgedrückten Punkt zu erhalten.

X_{norm}= K.inv()*X_{pix} wobei X_{pix}(2), z gleich 1 ist.

Beim 8PA verbessert sich eine einfache Transformation der Punkte und damit die Stabilität der Ergebnisse. Die vorgeschlagene Normalisierung ist eine Verschiebung und Skalierung jedes Bildes, so dass der Schwerpunkt der Referenzpunkte am Ursprung der Koordinaten liegt und der RMS Abstand der Punkte vom Ursprung gleich \sqrt{2} ist. Es wird empfohlen, die Singularitätsbedingung vor der Denormalisierung durchzusetzen.

Hinweis: Überprüfen Sie, ob: Sie sind immer noch interessiert

0
MichalSzczep