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 diferenteAinda não é o resultado que estou procurando!