c++ - solucion - sistema de ecuaciones diferenciales lineales ejercicios resueltos
Extraiga la traducción y la rotación de la matriz fundamental (2)
Estoy tratando de recuperar vectores de traducción y rotación a partir de una Matriz fundamental computada. Utilizo OpenCV y el enfoque general es de wikipedia. Mi código es así:
//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;
Al final, trato de comparar la rotación estimada con la que he calculado usando el tablero de ajedrez que está en cada Imagen (planeo obtener los parámetros extrínsecos sin el tablero de ajedrez). Por ejemplo, entiendo esto:
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]
Entonces, claramente, parece haber un problema, simplemente no puedo entender qué podría ser.
EDITAR: Aquí están los resultados que obtuve con el vt no transpuesto (obviamente desde otra escena):
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]
Aquí está mi matriz de cámara calculada, el error fue bastante bajo (alrededor de 0,17 ...).
[1699.001342509651, 0, 834.2587265398068;
0, 1696.645251354618, 607.1292618175946;
0, 0, 1]
Aquí están los resultados que obtengo al tratar de reproyectar un cubo ... Cámara 0, el cubo está alineado con el eje, la rotación y la traslación son (0, 0, 0). imagen http://imageshack.us/a/img802/5292/bildschirmfoto20130110u.png
y el otro, con los epilines de los puntos en la primera imagen. imagen http://imageshack.us/a/img546/189/bildschirmfoto20130110uy.png
Por favor, eche un vistazo a este enlace:
http://isit.u-clermont1.fr/~ab/Classes/DIKU-3DCV2/Handouts/Lecture16.pdf .
Consulte la página 2. Hay dos posibilidades para R. La primera es U W VT y la segunda es U WT VT. Usaste el segundo. Prueba el primero.
El algoritmo de 8 puntos es el método más simple para calcular la matriz fundamental, pero si se tiene cuidado, se puede realizar bien. La clave para obtener los buenos resultados es una correcta normalización cuidadosa de los datos de entrada antes de construir las ecuaciones para resolver. Muchos de los algoritmos pueden hacerlo. La coordenada del punto de los píxeles debe cambiarse a las coordenadas de la cámara, lo hace en esta línea:
Mat E = At() * F * A;
Sin embargo, esta suposición no es precisa. Si se conoce la matriz de calibración de cámara K, entonces puede aplicar inversa al punto x para obtener el punto expresado en coordenadas normalizadas.
X_{norm}= K.inv()*X_{pix}
donde X_{pix}(2)
, z es igual a 1.
En el caso del 8PA, una simple transformación de puntos mejora y, por lo tanto, en la estabilidad de los resultados. La normalización sugerida es una traducción y escalado de cada imagen para que el centroide de los puntos de referencia esté en el origen de las coordenadas y la distancia RMS de los puntos del origen sea igual a /sqrt{2}
. Tenga en cuenta que se recomienda que la condición de singularidad se aplique antes de la desnormalización.
Referencia: compruebalo si: sigues interesado