41 votos

Cómo calcular la matriz de homografía H a partir de los puntos correspondientes (Homografía plana 2d-2d)

He revisado este hilo Mapeo de un cuadrilátero irregular a un rectángulo

Si conozco los 4 puntos correspondientes en la imagen digamos
p1->p1'
p2->p2'
p3->p3'
p4->p4'

entonces cómo calcular pi(x,y) a partir de pi'(x,y)

enter image description here enter image description here

no sé cómo calcular los elementos de la matriz H de Homografía a partir de esos 8 puntos conocidos
[x']= [h11 h12 h13] [x]
[y']= [h21 h22 h23] [y]
[(1)]=[h31 h32 (1)] [(1)]

[Disculpe. No estoy seguro de si debo ampliar esta pregunta, o crear una nueva, ya que no puedo publicar comentarios en los hilos]

Quiero hacer la misma pregunta, pero utilizando valores absolutos para poder visualizarlo. Digamos que mis puntos en el plano de la imagen son:

p[0] = x:407 y:253
p[1] = x:386 y:253
p[2] = x:406 y:232
p[3] = x:385 y:232

estos puntos están en un plano de imagen de 500px de ancho x 333px de alto con 0,0 en la esquina superior izquierda. Estos puntos representan una imagen de un plano real donde se encuentra un cuadrado de 30mm de lado. Asumiendo que esta imagen fue tomada por una cámara fija en el origen del eje Z.

Entonces, sé que la distancia física entre p0,p1 ; p0,p2 ; p1,p3; p2,p3 son 30mm.

Pero, ¿es posible obtener las X,Y,Z de cada uno de estos puntos utilizando sólo esta información anterior?

0 votos

Gracias chicos. después de buscar mucho encontré esta biblioteca de wiimote por brian brianpeek.com/page/wiimotelib . en su código se implementa el cálculo de la matriz warp. eso es lo que realmente estaba buscando.

35voto

Bruno Mairlot Puntos 149

Se puede calcular la matriz de homografía H con sus ocho puntos con un sistema matricial tal que los cuatro puntos de correspondencia $(p_1, p_1'), (p_2, p_2'), (p_3, p_3'), (p_4, p_4')$ se escriben como $2\times9$ matrices como:

$p_i = \begin{bmatrix} -x_i \quad -y_i \quad -1 \quad 0 \quad 0 \quad 0 \quad x_ix_i' \quad y_ix_i' \quad x_i' \\ 0 \quad 0 \quad 0 \quad -x_i \quad -y_i \quad -1 \quad x_iy_i' \quad y_iy_i' \quad y_i' \end{bmatrix}$

A continuación, es posible apilarlos en una matriz $P$ para calcular:

$PH = 0$

Como por ejemplo:

$PH = \begin{bmatrix} -x_1 \quad -y_1 \quad -1 \quad 0 \quad 0 \quad 0 \quad x_1x_1' \quad y_1x_1' \quad x_1' \\ 0 \quad 0 \quad 0 \quad -x_1 \quad -y_1 \quad -1 \quad x_1y_1' \quad y_1y_1' \quad y_1' \\ -x_2 \quad -y_2 \quad -1 \quad 0 \quad 0 \quad 0 \quad x_2x_2' \quad y_2x_2' \quad x_2' \\ 0 \quad 0 \quad 0 \quad -x_2 \quad -y_2 \quad -1 \quad x_2y_2' \quad y_2y_2' \quad y_2' \\ -x_3 \quad -y_3 \quad -1 \quad 0 \quad 0 \quad 0 \quad x_3x_3' \quad y_3x_3' \quad x_3' \\ 0 \quad 0 \quad 0 \quad -x_3 \quad -y_3 \quad -1 \quad x_3y_3' \quad y_3y_3' \quad y_3' \\ -x_4 \quad -y_4 \quad -1 \quad 0 \quad 0 \quad 0 \quad x_4x_4' \quad y_4x_4' \quad x_4' \\ 0 \quad 0 \quad 0 \quad -x_4 \quad -y_4 \quad -1 \quad x_4y_4' \quad y_4y_4' \quad y_4' \\ \end{bmatrix} \begin{bmatrix}h1 \\ h2 \\ h3 \\ h4 \\ h5 \\ h6 \\ h7 \\ h8 \\h9 \end{bmatrix} = 0$

Mientras que la adición de una restricción adicional $|H|=1$ para evitar la solución obvia de $H$ siendo todo ceros. Es fácil utilizar la SVD $P = USV^\top$ y seleccionar el último vector singular de $V$ como la solución a $H$ .

Tenga en cuenta que esto le da una homografía DLT (transformación lineal directa) que minimiza el error algebraico. Este error no tiene sentido geométrico, por lo que la homografía calculada puede no ser tan buena como se espera. Normalmente se aplican mínimos cuadrados no lineales con una función de coste mejor (por ejemplo, error de transferencia simétrica) para mejorar la homografía.

Una vez que tengas tu matriz de homografía $H$ se pueden calcular las coordenadas proyectadas de cualquier punto $p(x, y)$ como:

$\begin{bmatrix} x' / \lambda \\ y' / \lambda \\ \lambda \end{bmatrix} = \begin{bmatrix} h_{11} & h_{12} & h_{13} \\ h_{21} & h_{22} & h_{23} \\ h_{31} & h_{32} & h_{33} \end{bmatrix}. \begin{bmatrix} x \\ y \\ 1 \end{bmatrix}$

0 votos

Las matrices p_i de 8x2 parecen ser 9x2 en la respuesta.

0 votos

@anorm Deberían ser 9x2. Creo que 8x2 es sólo un error tipográfico

2 votos

@marcman h33 se ha puesto a 1. Por eso su 8.

8voto

Wiktor Walc Puntos 718

En lugar de tomar la SVD del sistema, hay una manera más fácil de resolver esto. ya que el último componente en el $H$ El vector se considera como $1$ podemos añadir una ecuación de restricción más $(h9=1)$ (ya que $h_{33}$ se considera $1$ ) a este conjunto y convertir $P$ matriz en $9\times 9$ matriz y el sistema se volverá no homogéneo.

$PH = \begin{bmatrix} -x_1 & -y_1 & -1 & 0 & 0 & 0 & x_1x_1' & y_1x_1' & x_1' \\ 0 & 0 & 0 & -x_1 & -y_1 & -1 & x_1y_1' & y_1y_1' & y_1' \\ -x_2 & -y_2 & -1 & 0 & 0 & 0 & x_2x_2' & y_2x_2' & x_2' \\ 0 & 0 & 0 & -x_2 & -y_2 & -1 & x_2y_2' & y_2y_2' & y_2' \\ -x_3 & -y_3 & -1 & 0 & 0 & 0 & x_3x_3' & y_3x_3' & x_3' \\ 0 & 0 & 0 & -x_3 & -y_3 & -1 & x_3y_3' & y_3y_3' & y_3' \\ -x_4 & -y_4 & -1 & 0 & 0 & 0 & x_4x_4' & y_4x_4' & x_4' \\ 0 & 0 & 0 & -x_4 & -y_4 & -1 & x_4y_4' & y_4y_4' & y_4' \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1\\ \end{bmatrix} \begin{bmatrix}h1 \\ h2 \\ h3 \\ h4 \\ h5 \\ h6 \\ h7 \\ h8 \\h9 \end{bmatrix} = \begin{bmatrix}0 \\ 0 \\ 0 \\ 0 \\ 0 \\ 0 \\ 0 \\ 0 \\1 \end{bmatrix}$

Este es un $Ax=b$ tipo de problema que puede resolverse mucho más rápido que el cálculo de la SVD.

2 votos

Hay algunos casos especiales en los que el noveno elemento es cero

3voto

winSharp93 Puntos 7124

Después de un tiempo estoy respondiendo a mi propia pregunta (de una manera que puedo entender.Espero que pueda ayudar a otras personas también)

Siento mucho no tener una buena base matemática, pero hay un GAP entre la información que la mayoría de la gente proporciona a partir de fórmulas copiadas/pegadas encontradas en google y lo que yo puedo entender. Veo, por cierto, que muchas fórmulas tienen algunos errores que confunden a los que buscan una respuesta.

Así que,

Básicamente, tienes 2 colecciones de 4 puntos, los rectángulos A y B.

A = { p1x,p1y ; p2x,p2y ; p3x,p3y ; p4x,p4y }

B = { p1x,p1y ; p2x,p2y ; p3x,p3y ; p4x,p4y }

Quiero asignar un punto del rectángulo A al rectángulo B.

A continuación, construyo una caja de 8 x n matriz (M1), donde n es el número de puntos * 2(x,y). (el resultado será una matriz de 8x8)

for each point:
{xA, yA, 1, 0, 0, 0, -xA*xB, -yA*xB}
{0, 0, 0, xA, yA, 1, -xA*yB, -yA*yB}

También hago una matriz de 1 x 8 (M2) con los puntos "objetivo"(B). El resultado debe ser 1x8 y no 8x1.

for each point:
{xB}
{yB}

A continuación, vamos a encontrar la llamada matriz H. Estoy usando esta fórmula:

H = ( M1 transpose * M1 )inv * ( M1 transpose * M2)

El resultado es una matriz de 3 x 3 (H).

Por último, cualquier punto 2d del rectángulo A puede encontrarse en el rectángulo B mediante esta operación:

point_in_A = (x,y,1)
tempMatrix (1x3) = H(3x3) * point_in_A(1x3)
tempMatrix will be (x, y, scale);

utilizando los valores de tempMatrix que aparecen a continuación:

result xy_in_B = (x / scale , y / scale);

Eso es todo.

11 votos

Por favor, usa Latex.

4 votos

Hola, lamentablemente esta no es la mejor solución. Usted está encontrando el 3x3 homografía como solución a un sistema lineal sobreespecificado en ocho incógnitas, suponiendo que el noveno es una (también falta en su respuesta). Esto funciona siempre que el noveno elemento de H es distinto de cero. Pero hay casos especiales en los que es cero y entonces este método falla. Es mejor utilizar el truco de la SVD para los mínimos cuadrados totales (consulte, por ejemplo, el libro de Hartley-Zisserman para conocer el algoritmo y los detalles).

3 votos

@MithleshUpadhyay OP puede tener un Alergia al látex . En este caso, Soporte de MathJax de SE puede ser una buena alternativa :-)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X