Transformación de perspectiva a vista de pájaro desde la calibración de la cámara opencv python

Estoy tratando de hacer que la perspectiva a vista de pájaro se transforme a partir de matrices intrínsecas, extrínsecas y coeficientes de distorsión de la cámara.

Traté de usar la respuesta deesta pregunta.

La imagen utilizada es la imagen de muestra left02.jpg del repositorio oficial de github de opencv

Calibré la cámara y encontré las matrices intrínsecas, extrínsecas y los coeficientes de distorsión.

No distorsioné la imagen y encontré la pose. Para verificar si los parámetros son correctos.

Las ecuaciones que utilicé para encontrar la matriz de transformación de perspectiva son (Consulte el enlace anterior):

Hr = K * R.inv() * K.inv() donde R es una matriz rotacional (de cv2.Rodrigues ()) y K se obtiene de cv2.getoptimalnewcameramatrix ()

     [ 1  0  |         ]
Ht = [ 0  1  | -K*C/Cz ]
     [ 0  0  |         ]

DóndeC=-R.inv()*T Donde T es vector traslacional decv2.solvePnP() y Cz es el tercer componente del vector C

La transformación requerida es:H = Ht * Hr

El código que usé para construir la ecuación anterior es:

K = newcameramtx # from cv2.getoptimalnewcameramatrix()
ret,rvec,tvec = cv2.solvePnP(world_points,corners2,K,dist) 
R,_ = cv2.Rodrigues(rvec)
_,R_inv = cv2.invert(R)
_,K_inv = cv2.invert(K)
Hr = np.matmul(K,np.matmul(R_inv,K_inv))
C = np.matmul(-R_inv,tvec)
Cz = C[2]
temp_vector = np.matmul(-K,C/Cz)
Ht = np.identity(3)
for i,val in enumerate(temp_vector):
    Ht[i][2] = val
homography = np.matmul(Ht,Hr)
warped_img =cv2.warpPerspective(img,homography,(img.shape[1],img.shape[0]))
# where img is the above undistored image with visualized pose

La imagen deformada resultante no es correcta.

Si elimino la traducción de la homografía usando el siguiente código

homography = Hr.copy()
warped_img =cv2.warpPerspective(img,homography,(img.shape[1],img.shape[0]))

Me sale la siguiente imagen

Creo que la imagen de arriba muestra que mi parte rotacional es correcta pero mi traducción es incorrecta.

Como la matriz traslacional (Ht) es una matriz aumentada, no estoy seguro de si mi construcción de la matriz anterior es correcta.

Específicamente quiero averiguar la transformación de la perspectiva a vista de pájaro a partir de la calibración de la cámara.

Entonces, ¿cómo corrijo las ecuaciones anteriores para obtener la vista perfecta de la imagen del tablero de ajedrez?

¿Podría alguien explicar también las matemáticas sobre cómo se derivan las ecuaciones anteriores para Ht y Hr? No tengo mucha exposición al álgebra lineal, por lo que estas ecuaciones no son muy obvias para mí.

ACTUALIZAR:

homography = np.matmul(Ht,Hr)
warped_img =cv2.warpPerspective(img,homography,(img.shape[1],img.shape[0]),flags=cv2.WARP_INVERSE_MAP)
El indicador cv2.WARP_INVERSE_MAP me dio un resultado diferente

¡Todavía no es el resultado que estoy buscando!

Respuestas a la pregunta(1)

Su respuesta a la pregunta