OpenCV: solvePnP unidades tvec e direções dos eixos
Eu estou tentando encontrar a posição relativa da câmera no tabuleiro de xadrez (ou o contrário) - eu me sinto bem com a conversão entre diferentes sistemas de coordenadas, por exemplo. como sugeridoAqui. Decidi usar o tabuleiro de xadrez não apenas para calibração, mas também para a determinação da posição atual, já que posso usar ofindChessboardCorners
para obter oimagePoints
(e isso funciona bem).
Eu li muito sobre este assunto e sinto que eu entendo osolvePnP
saídas (mesmo que eu seja completamente novo paraopenCV
e visão computacional em geral). Infelizmente, os resultados que recebo desolvePnP
e medindo fisicamente a configuração do teste são diferentes: a translação na direção z é desligada em aprox. 25%.x
ey
as direções estão completamente erradas - várias ordens de grandeza e direção diferente da que eu li para ser o sistema de coordenadas da câmera (x apontando para cima a imagem, y para a direita, z longe da câmera). A diferença persiste se eu convertertvec
ervec
a câmera posar em coordenadas mundiais.
Minhas perguntas são:
Quais são as direções dos eixos dos sistemas de coordenadas de câmera e mundo?FazsolvePnP
saída a tradução nas mesmas unidades que eu especificar oobjectPoints
?Eu especifiquei a origem do mundo como o primeiro dosobjectPoints
(um dos cantos do tabuleiro de xadrez). Tudo bem e étvec
a tradução para exatamente esse ponto a partir das coordenadas da câmera?Este é o meu código (eu anexeipro forma como ele não joga nenhuma exceção etc.). Eu usei imagens em escala de cinza para obter a matriz intrínseca da câmera e os coeficientes de distorção durante a calibragem, então decidi executar a localização em tons de cinza também.chessCoordinates
é uma lista de localização dos pontos do tabuleiro de xadrez em mm em relação à origem (um dos pontos de canto).camMatrix
edistCoefficients
vêm da calibração (realizada usando o mesmo tabuleiro de xadrez eobjectPoints
).
camCapture=cv2.VideoCapture(0) # Take a picture of the target to get the imagePoints
tempImg=camCapture.read()
imgPts=[]
tgtPts=[]
tempImg=cv2.cvtColor(tempImg[1], cv2.COLOR_BGR2GRAY)
found_all, corners = cv2.findChessboardCorners(tempImg, chessboardDim )
imgPts.append(corners.reshape(-1, 2))
tgtPts.append(np.array(chessCoordinates, dtype=np.float32))
retval,myRvec,myTvec=cv2.solvePnP(objectPoints=np.array(tgtPts), imagePoints=np.array(imgPts), cameraMatrix=camMatrix, distCoeffs=distCoefficients)