OpenCV: rozwiązuje kierunki jednostek i osi TVPnP

Próbuję znaleźć względne położenie kamery na szachownicy (lub na odwrót) - czuję się dobrze z konwersją między różnymi układami współrzędnych, np. jak sugerowanotutaj. Postanowiłem użyć szachownicy nie tylko do kalibracji, ale również do określenia rzeczywistej pozycji na tym etapie, ponieważ mogę korzystać zfindChessboardCorners aby uzyskaćimagePoints (i to działa OK).

Czytałem dużo na ten temat i czuję, że rozumiemsolvePnP wyjścia (chociaż jestem zupełnie nowyopenCV i ogólnie wizja komputerowa). Niestety wyniki otrzymujęsolvePnP i fizyczny pomiar konfiguracji testu jest inny: tłumaczenie w kierunku z jest wyłączone o około. 25%.x iy kierunki są całkowicie błędne - kilka rzędów wielkości i inny kierunek niż to, co przeczytałem jako układ współrzędnych kamery (x skierowany w górę obrazu, y w prawo, z od aparatu). Różnica utrzymuje się, jeśli dokonam konwersjitvec irvec do ułożenia kamery we współrzędnych świata.

Moje pytania to:

Jakie są kierunki osi kamery i światowych układów współrzędnych?RobisolvePnP wyślij tłumaczenie w tych samych jednostkach, które określamobjectPoints?Podałem pochodzenie świata jako pierwsze zobjectPoints (jeden z rogów szachownicy). Czy to w porządku i jesttvec tłumaczenie na dokładnie ten punkt ze współrzędnych kamery?

To jest mój kod (załączam gopro forma ponieważ nie rzuca żadnych wyjątków itp.). Użyłem obrazów w skali szarości, aby uzyskać matrycę wewnętrzną kamery i współczynniki zniekształceń podczas kalibracji, więc postanowiłem wykonać lokalizację również w skali szarości.chessCoordinates to lista lokalizacji punktów szachownicy w mm w odniesieniu do pochodzenia (jednego z punktów narożnych).camMatrix idistCoefficients pochodzą z kalibracji (wykonywane przy użyciu tej samej szachownicy iobjectPoints).

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)

questionAnswers(2)

yourAnswerToTheQuestion