Transformação de perspectiva de visão panorâmica de calibração de câmera opencv python

Estou tentando transformar a perspectiva da visão panorâmica das matrizes intrínsecas da câmera, extrínsecas e coeficientes de distorção.

Eu tentei usar a resposta deesta Pergunta, questão.

A imagem usada é a imagem de amostra left02.jpg do repositório oficial do opencv github

Calibrei a câmera e encontrei as matrizes intrínsecas, extrínsecas e os coeficientes de distorção.

Desvirei a imagem e encontrei a pose. Para verificar se os parâmetros estão corretos.

As equações que usei para encontrar a matriz de transformação de perspectiva são (consulte o link acima):

Hr = K * R.inv() * K.inv() onde R é matriz rotacional (de cv2.Rodrigues ()) e K é obtido de cv2.getoptimalnewcameramatrix ()

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

OndeC=-R.inv()*T Onde T é o vetor translacional decv2.solvePnP() e Cz é o terceiro componente do vetor C

A transformação necessária é:H = Ht * Hr

O código que eu usei para construir a equação acima é:

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

A imagem distorcida resultante não está correta.

Se eu remover a tradução da homografia usando o código abaixo

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

Estou recebendo a seguinte imagem

Acho que a imagem acima mostra que minha parte rotacional está correta, mas minha tradução está errada.

Como a matriz translacional (Ht) é uma matriz aumentada, não tenho certeza se minha construção da matriz acima está correta.

Eu quero especificamente descobrir a transformação da perspectiva do olho do pássaro a partir da calibração da câmera.

Então, como faço para corrigir as equações acima para ter uma visão perfeita da imagem do tabuleiro de xadrez

Alguém poderia também explicar a matemática de como as equações acima para Ht e Hr são derivadas? Como não tenho muita exposição à álgebra linear, essas equações não são muito óbvias para mim.

ATUALIZAR:

homography = np.matmul(Ht,Hr)
warped_img =cv2.warpPerspective(img,homography,(img.shape[1],img.shape[0]),flags=cv2.WARP_INVERSE_MAP)
O sinalizador cv2.WARP_INVERSE_MAP me deu um resultado diferente

Ainda não é o resultado que estou procurando!

questionAnswers(1)

yourAnswerToTheQuestion