Muchos paquetes gráficos tienen funciones para construir una transformación de 4 puntos a 4 puntos del tipo que usted necesita. Por ejemplo, Qt tiene QTransform::quadToSquare y QTransform::quadToQuad, y OpenCV tiene GetPerspectiveTransform.
La transformación no puede ser lineal o afín, tiene que ser una transformación "en perspectiva".
Si quieres codificarlo tú mismo, este artículo te dice cómo. Las fórmulas de ese artículo se muestran más claramente a continuación:
Si queremos transformar los cuatro puntos (xi,yi) a los cuatro puntos (ui,vi) para i=0,1,2,3 podemos utilizar una transformación de perspectiva de la forma ui=a0xi+a1yi+a2c0xi+c1yi+1;vi=b0xi+b1yi+b2c0xi+c1yi+1 Los ocho coeficientes desconocidos a0,a1,a2,b0,b1,b2,c0,c1 se puede calcular resolviendo el siguiente sistema lineal:
[x0y01000−x0u0−y0u0x1y11000−x1u1−y1u1x2y21000−x2u2−y2u2x3y31000−x3u3−y3u3000x0y01−x0v0−y0v0000x1y11−x1v1−y1v1000x2y21−x2v2−y2v2000x3y31−x3v3−y3v3][a0a1a2b0b1b2c0c1]=[u0u1u2u3v0v1v2v3]
Hay muchos paquetes de software disponibles para resolver sistemas lineales de ecuaciones. Una opción es el libro/paquete "Numerical Recipes", que tiene funciones llamadas ludcmp y lubksb. La primera de ellas calcula la descomposición LU de una matriz, y la segunda utiliza esta descomposición LU para resolver un sistema lineal. Hay una larga discusión sobre cómo usar ludcmp y lubksb aquí .
En su ejemplo particular, tenemos (x0,y0)=(3,5)(x1,y1)=(5,5)(x2,y2)=(2,2)(x3,y3)=(6,1)(u0,v0)=(0,3)(u1,v1)=(3,3)(u2,v2)=(0,0)(u3,v3)=(3,0) El sistema de ecuaciones es 3a0+5a1+a2=05a0+5a1+a2−15c0−15c1=32a0+2a1+a2=06a0+a1+a2−18c0−3c1=33b0+5b1+b2−9c0−15c1=35b0+5b1+b2−15c0−15c1=32b0+2b1+b2=06b0+b1+b2=0 He resuelto este sistema de ecuaciones utilizando Mathematica, y he obtenido a0=3649;a1=−1249;a2=−4849b0=24245;b1=96245;b2=−4849c0=8245;c1=−33245 Por lo tanto, la transformación requerida (después de algunas simplificaciones) es u=60(3x−y−4)8x−33y+245v=24(x+4y−10)8x−33y+245 Puedes confirmar fácilmente que esta transformación mapea correctamente los cuatro puntos dados.