2012-08-24 9 views
6

Tengo un marcador plano donde ejecuté el algoritmo SIFT para extraer características. Luego ejecuto un detector para encontrar este marcador en la escena y extraer las características nuevamente. Emparejé los puntos y extraje la homografía de los pares coincidentes con OpenCV usando findHomography().Proyección de un punto 2D desde un marcador a la imagen con homografía computada

Ahora quiero proyectar los puntos 2D detectados en el marcador con la homografía calculada para comparar las posiciones con los puntos 3D medidos de la escena y calcular el error de reproyección . Estoy confundido con las coordenadas de píxeles, centímetros, matrices de calibración, no sé qué conversiones debería hacer primero.

¿Alguien sabe un enlace sobre esto o puede explicar el método?

Respuesta

6

Si llama a la matriz de homografía H, la matriz de cámara K (necesaria para convertir a píxeles) sería algo como esto, dependiendo de su resolución.

Mat K= Mat::zeros(3,3,CV_32FC1); 
K.at<float>(0,0)=500.0f;   
K.at<float>(0,2)=320.0f;  // width/2  
K.at<float>(1,1)=500.0f;  
K.at<float>(1,2)=240.0f;  // height/2 
K.at<float>(2,2)=1.0f; 

Si sus puntos marcadores son puntos de vector de 2D:

vector<Point2f> marker_point; //containing coordinates in centimeters 

entonces la proyección iba a ser así, con el resultado de un punto 3D en coordenadas de píxeles.

Mat point(3,1,CV_32FC1);   
point.at<float>(0) = marker_point.x; 
point.at<float>(1) = marker_point.y; 
point.at<float>(2) = 1.0f; 
point = H* point; 
point = point/point.at<float>(2);  //Normalize 
point = K* point;     //to pixels 
Cuestiones relacionadas