2013-07-02 14 views
5

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 lo objectPoints?
  • 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) 

risposta

9

Le coordinate della videocamera sono le stesse delle coordinate dell'immagine. Quindi hai l'ascia x puntata nella parte destra della fotocamera, l'asse y è rivolto verso il basso e z sta puntando nella direzione in cui si trova la fotocamera. Questo è un sistema di asce in senso orario, e lo stesso si applicherebbe alla scacchiera, quindi se hai specificato l'origine, diciamo, nell'angolo in alto a destra della scacchiera, x ax va lungo il lato più lungo a destra e y lungo il lato più corto di la scacchiera, z ax sarebbe rivolta verso il basso, a terra.

Risolvi PnP invia la traduzione nelle stesse unità delle unità in cui è stata specificata la lunghezza dei campi della scacchiera, ma potrebbe anche utilizzare le unità specificate nella calibrazione della telecamera, poiché utilizza la matrice della telecamera.

Tvec punta all'origine delle coordinate del mondo in cui è stato posizionato l'oggetto di calibrazione. Quindi se hai inserito il primo punto oggetto in (0,0), questo è il punto in cui tvec punterà a.

+0

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. –

3

Quali sono le direzioni di macchina fotografica e del mondo coordinare assi sistemi?

L'angolo 0,0,0 delle schede è tale che l'asse X X & è verso il resto dei punti d'angolo. L'asse Z punta sempre lontano dalla scacchiera. Ciò significa che di solito punta un po 'nella direzione della telecamera.

Does solvePnP restituisce la traduzione nelle stesse unità di cui ho specificato gli oggettiPunti?

ho specificato l'origine mondo come il primo dei objectPoints (uno degli angoli scacchiera). Va bene ed è tvec la traduzione esattamente a quel punto dalle coordinate della telecamera?

Sì, questo è piuttosto comune. Nella maggior parte dei casi, il primo angolo della camma è impostato su 0,0,0 e gli angoli successivi vengono impostati sul piano z = 0 (ad esempio (1,0,0), (0,1,0), ecc.) .

Il televisore, combinato con la rotazione, punta verso quel punto dalla cornice delle coordinate della scheda verso la telecamera. In breve; il tvec & rvec fornisce la traduzione inversa (mondo -> fotocamera). Con alcune geometrie di base puoi calcolare la trasformazione che mette camera -> mondo.

+0

Grazie mille per una rapida risposta. Che dire degli assi del sistema di coordinate della telecamera - dove "puntano"? "Il televisore, combinato con la rotazione, punta verso quel punto dal riquadro di coordinate della scheda ** verso ** la telecamera." Secondo [questo] (http://stackoverflow.com/questions/14515200/python-opencv-solvepnp-yields-wrong-translation-vector) tvec è nelle coordinate della telecamera (non "verso la telecamera"). È questo che vuoi dire? –

+0

Penso (ma non ne sono del tutto sicuro) che il sistema di coordinate della fotocamera Z punti lontano dalla fotocamera (nella direzione in cui "guarda"). Quello che voglio dire è che c'è una differenza tra il frame delle coordinate del mondo e il frame delle coordinate della telecamera. È possibile convertire un punto che si trova nella "cornice della scheda" nella "cornice della telecamera" utilizzando rvec e tvec. Se si desidera convertire un punto dalla cornice della telecamera alla cornice del mondo, è necessario utilizzare l'inverso di entrambi. – Nallath

+0

Grazie, ho già lavorato con grande aiuto dalla risposta di cui sopra e anche dal tuo. Tutto ha molto senso ora. Saluti. –

Problemi correlati