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. zgodnie z sugestią here. Postanowiłem użyć szachownicy nie tylko do kalibracji, ale także do rzeczywistego określenia pozycji na tym etapie, ponieważ mogę użyć findChessboardCorners
, aby uzyskać imagePoints
(i to działa OK).OpenCV: solvePnP jednostki tvec i kierunki osi
Przeczytałem wiele na ten temat i mam wrażenie, że rozumiem wyjścia solvePnP
(mimo że jestem całkowicie nowy w stosunku do openCV
i ogólnie widzenia komputerowego). Niestety, wyniki uzyskane z solvePnP
i fizyczny pomiar konfiguracji testu są różne: tłumaczenie w kierunku z jest wyłączone o około. 25%. x
i y
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 dala od kamery). Różnica będzie się utrzymywać, jeśli skonwertuję tvec
i rvec
na położenie kamery we współrzędnych światowych.
Moje pytania są następujące:
- Jakie są kierunki kamera i świat osie współrzędnych Systems'?
- Czy
solvePnP
wypisze tłumaczenie w tych samych jednostkach, co ja określam jakoobjectPoints
? - Podałem pochodzenie świata jako pierwsze z
objectPoints
(jeden z narożników szachownicy). Czy to jest w porządku i czy tłumaczenie jest dokładnie do tego punktu ze współrzędnych kamery?
To jest mój kod (dołączam go jako pro forma ponieważ nie wyrzuca ż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 zdecydowałem się również na lokalizację w skali szarości. chessCoordinates
to lista punktów punktów szachownicy w mm w odniesieniu do punktu początkowego (jeden z punktów narożnych). camMatrix
i distCoefficients
pochodzą z kalibracji (wykonywane przy użyciu tej samej szachownicy i objectPoints
).
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)
Świetna odpowiedź, wielkie dzięki. Zjawiłem się już wcześniej w niektórych z tych rzeczy, ale dobrze jest uzyskać pewną gwarancję. Również wyjaśnienie osi współrzędnych systemu jest niezwykle użyteczne, ponieważ nie spotkałem się z czymś podobnym. Twoje zdrowie. –