Ich versuche, Translations- und Rotationsvektoren aus einer berechneten fundamentalen Matrix abzurufen. Ich benutze OpenCV und der allgemeine Ansatz ist von Wikipedia. Mein Code ist wie folgt:Extrahieren von Translation und Rotation aus der Fundamentalmatrix
//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 ich versuche, die geschätzte Rotation auf die vergleichen ich das Schachbrett berechnet unter Verwendung der in jedem Bild ist (ich plane, ohne das Schachbrett die extrinsischen Parameter zu erhalten). Zum Beispiel habe ich diese:
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]
So klar es ein Problem zu sein scheint, kann ich einfach nicht herausfinden, was es sein könnte.
EDIT: Hier sind die Ergebnisse, die ich mit dem untransponiert vt bekam (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 niedrig (etwa 0,17 ...) .
[1699.001342509651, 0, 834.2587265398068;
0, 1696.645251354618, 607.1292618175946;
0, 0, 1]
Hier sind die Ergebnisse bekomme ich, wenn ein Würfel zu projizieren versuchen ... Kamera 0, der Würfel ist Achse ausgerichtet sind, Rotation und Translation (0, 0, 0). image http://imageshack.us/a/img802/5292/bildschirmfoto20130110u.png
und der andere, mit den Epilinen der Punkte im ersten Bild. image http://imageshack.us/a/img546/189/bildschirmfoto20130110uy.png
'decomp.vt' V transponieren, nicht V.Was bekommst du, wenn du "U * W.t() * V" sagst? – yiding
Entschuldigen Sie meine späte Antwort, danke für Ihre Korrektur. Ich hatte das offensichtlich vergessen. Ich habe die Antwort mit den neuen Ergebnissen aktualisiert, leider scheinen sie immer noch nicht richtig zu sein. – Teris
Sollten die berechneten Verzerrungskoeffizienten auch irgendwie in die Essential Matrix multipliziert werden? – Teris