2012-02-14 24 views
14

Estoy trabajando con una homografía calculada por OpenCV. Actualmente uso esta homografía para transformar puntos usando la función a continuación. Esta función realiza la tarea que requiero, sin embargo, no tengo idea de cómo funciona realmente.Homografía OpenCV, Transforme un punto, ¿qué está haciendo este código?

¿Puede alguien explicar, línea por línea exactamente, la lógica/teoría detrás de las últimas 3 líneas de código, entiendo que esto transforma el punto x, y, pero estoy claro por qué esto funciona:

¿Por qué se calculan Z, px y py de esta manera, a qué corresponden los elementos en h?

Sus comentarios son muy apreciados :)

double h[9]; 
homography = cvMat(3, 3, CV_64F, h); 
CvMat ps1 = cvMat(MAX_CALIB_POINTS/2,2,CV_32FC1, points1); 
CvMat ps2 = cvMat(MAX_CALIB_POINTS/2,2,CV_32FC1, points2); 

cvFindHomography(&ps1, &ps2, &homography, 0); 

... 

// This is the part I don't fully understand 
double x = 10.0; 
double y = 10.0; 
double Z = 1./(h[6]*x + h[7]*y + h[8]); 
px = (int)((h[0]*x + h[1]*y + h[2])*Z); 
py = (int)((h[3]*x + h[4]*y + h[5])*Z); 

Respuesta

28

cvFindHomography() devuelve una matriz usando homogenous coordinates:

coordenadas homogéneas son omnipresentes en los gráficos por ordenador, ya que permiten realizar operaciones habituales como la traslación, rotación, escalado y proyección en perspectiva para implementar como operaciones matriciales

Qué está pasando en el código: El punto cartesiano p_origin_cartesian(x,y) se transforma en coordenadas homogéneas, luego se aplica la matriz de transformación de perspectiva 3x3 h y el resultado se convierte de nuevo a coordenadas cartesianas p_transformed_cartesian(px,py).

ACTUALIZACIÓN

En detalle:

Convertir p_origin_cartesian-p_origin_homogenous:

(x,y) => (x,y,1) 

Do transformación de perspectiva:

p_transformed_homogenous = h * p_origin_homogenous = 

(h0,h1,h2) (x) (h0*x + h1*y + h2) (tx) 
(h3,h4,h5) * (y) = (h3*x + h4*y + h5) = (ty) 
(h6,h7,h8) (1) (h6*x + h7*y + h8) (tz) 

Conversor.210-p_transformed_cartesian:

(tx,ty,tz) => (tx/tz, ty/tz) 

Su código traducido:

px = tx/tz; 
py = ty/tz; 
Z = 1/tz; 
+0

Hola, gracias por sus comentarios hasta el momento, así que lo que está haciendo Z? – Jayson

+0

z es la tercera coordenada en las coordenadas homogéneas tridimensionales. Explicar cómo funcionan las coordenadas homogéneas iría demasiado lejos aquí. Pero p_homogenous (x, y, z) corresponde a p_cartesian (x/z, y/z). – Ben

+0

ahhh gracias, empezando a tener sentido ahora. – Jayson

0

OpenCV implementación de Python siguiente @Ben responder

p = np.array((x,y,1)).reshape((3,1)) 
temp_p = M.dot(p) 
sum = np.sum(temp_p ,1) 
px = int(round(sum[0]/sum[2])) 
py = int(round(sum[1]/sum[2])) 
Cuestiones relacionadas