Sto provando a trovare la posizione relativa della telecamera sulla scacchiera (o viceversa) - Mi sento OK con la conversione tra diversi sistemi di coordinate, ad es. come suggerito here. Ho deciso di utilizzare la scacchiera non solo per la calibrazione ma anche per determinare la posizione attuale in questa fase, dal momento che posso usare lo findChessboardCorners
per ottenere lo imagePoints
(e questo funziona correttamente).OpenCV: solvePnP tvec unità e direzioni degli assi
Ho letto molto su questo argomento e sento di comprendere le uscite solvePnP
(anche se sono completamente nuovo a openCV
e alla visione del computer in generale). Sfortunatamente, i risultati che ottengo da solvePnP
e misurando fisicamente il setup del test sono diversi: la traslazione in direzione z è disattivata di ca. 25%. x
e le direzioni sono completamente errate: diversi ordini di grandezza e direzione diversa da quella che ho letto per essere il sistema di coordinate della telecamera (x che indica l'immagine, y a destra, z lontano dalla fotocamera). La differenza persiste se converto tvec
e rvec
in pose fotografiche in coordinate del mondo.
Le mie domande sono:
- Quali sono le direzioni di macchina fotografica e del mondo coordinare assi sistemi?
- Il
solvePnP
invia la traduzione nelle stesse unità di cui specifichi loobjectPoints
? - Ho specificato l'origine del mondo come il primo dello
objectPoints
(uno degli angoli della scacchiera). Va bene ed ètvec
la traduzione esattamente a quel punto dalle coordinate della telecamera?
Questo è il mio codice (allego è pro forma in quanto non genera alcuna eccezione, ecc). Ho usato le immagini in scala di grigi per ottenere la matrice intrinseca della telecamera e i coefficienti di distorsione durante la calibrazione, così ho deciso di eseguire la localizzazione anche in scala di grigi. chessCoordinates
è un elenco di punti dei punti della scacchiera in mm rispetto all'origine (uno dei punti d'angolo). camMatrix
e distCoefficients
provengono dalla calibrazione (eseguita utilizzando la stessa scacchiera e 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)
Ottima risposta, grazie mille. Sono già venuto a conoscenza di alcune di queste cose da qualche parte prima, ma è bello avere un po 'di rassicurazione. Inoltre, la spiegazione degli assi del sistema coordiale è estremamente utile, dal momento che non mi sono imbattuto in qualcosa del genere. Saluti. –