5

Si supponga di avere una buona corrispondenza tra due immagini e tentare di recuperare il movimento della telecamera tra di esse. posso usare OpenCV 3 di nuove caratteristiche, come questo:Stima di posa della camera: come interpreto le matrici di rotazione e di traduzione?

Mat E = findEssentialMat(imgpts1, imgpts2, focal, principalPoint, RANSAC, 0.999, 1, mask); 

int inliers = recoverPose(E, imgpts1, imgpts2, R, t, focal, principalPoint, mask); 

Mat mtxR, mtxQ; 
Mat Qx, Qy, Qz; 
Vec3d angles = RQDecomp3x3(R, mtxR, mtxQ, Qx, Qy, Qz); 

cout << "Translation: " << t.t() << endl; 
cout << "Euler angles [x y z] in degrees: " << angles.t() << endl; 

Ora, ho difficoltà confezionamento mia testa intorno a ciò che R e t realmente significano. Sono la trasformazione necessaria per mappare le coordinate dallo spazio della fotocamera 1 allo spazio della fotocamera due, come in p_2 = R * p_1 + t?

Considerate questo esempio, con la terra-verità corrispondenze etichettati manualmente

enter image description here

L'output che ottengo è questo:

Translation: [-0.9661243151855488, -0.04921320381132761, 0.253341406362796] 
Euler angles [x y z] in degrees: [9.780449804801876, 46.49315494782735, 15.66510133665445] 

cerco di abbinare questo a quello che vedi nell'immagine e mi viene in mente l'interpretazione, che mi dice, mi sono spostato a destra, poiché le coordinate si sono spostate lungo l'asse x negativo, ma mi avrebbe anche detto che mi sono spostato più lontano, come le coordinate hanno lungo l'asse z positivo.

Ho anche ruotato la fotocamera attorno all'asse y (a sinistra, che penso sarebbe una rotazione in senso antiorario attorno all'asse y negativo perché in OpenCV, l'asse y punta verso il basso, non lo fa ?)

Domanda: La mia interpretazione è corretta e se no, qual è quella corretta?

risposta

2

Si scopre che la mia interpretazione è corretta, la relazione p2 = R * p1 + t effettivamente contiene. È possibile verificare questo utilizzando cv::triangulatePoints() e cv::convertPointsFromHomogeneous per ottenere le coordinate 3D dai punti corrispondenti (relativi alla telecamera 1) e quindi applicare l'equazione precedente. La moltiplicazione con la camera matrix della telecamera 2 restituisce le coordinate dell'immagine p2.

1

La tua interpretazione sembra giusta per me. Non sono al 100% circa l'orientamento dell'asse in OpenCV, ma credo che tu abbia ragione sull'asse Y.

Anche l'uscita ha senso, non solo da una prospettiva in codice, ma se si guardano le due immagini, si può immaginare approssimativamente dove punta una rotazione completa di 90 gradi (sarebbe essenzialmente lo stesso angolo ma sul lato opposto lato della vettura)

Questa è una spiegazione abbastanza decente del concetto tramite la meccanica moto del corpo rigido troppo: http://nghiaho.com/?page_id=671

0

Vediamo. Il riquadro delle coordinate della telecamera OpenCV è "X verso destra dell'immagine, Y verso immagine in basso, Z = X x Y verso la scena". Q = [R | t] è la trasformazione delle coordinate da camera2 a camera1, in modo tale che t sia il vettore radicato a camera1, con la punta a camera2, espressa nella cornice camera1. Quindi il tuo vettore di traduzione implica che la videocamera2 si trova a sinistra della telecamera 1, che, date le tue immagini, è possibile solo se la vista laterale dell'auto è nella videocamera2 e la vista frontale dell'auto è nella videocamera 1. Ciò è coerente con un componente Z positivo della traduzione, poiché nella vista laterale l'auto appare più lontana dalla fotocamera.

Questa identificazione è anche coerente con gli angoli di Eulero calcolati: vengono restituiti nella convenzione OpenGL, esprimendo così la rotazione dalla sorgente alla destinazione. Nel tuo caso, una rotazione di 46 gradi attorno all'asse verticale della camera1, in senso antiorario w.r.t. l'asse Y orientato verso il basso, ti porta quasi alla vista laterale che hai.

+0

Ma la componente z positiva mi direbbe che la camera2 si è spostata verso la macchina, ma ciò non si adatta all'interpretazione che la camera2 è l'immagine a sinistra. Cosa mi manca? – oarfish

+0

Rileggi ciò che ho scritto: "t è il vettore radicato su camera1, con la punta su camera2". Una componente Z positiva di t significa solo che il centro di camera2 è davanti al piano XY di camera1, cioè davanti al centro di camera1. Questo è perfettamente plausibile date le vostre immagini: immaginate di estendere il piano dell'immagine nella vista guardando la parte anteriore della macchina, e quindi decidere su quale lato di quel piano dovrebbe essere la telecamera della vista laterale. Inoltre, si prega di votare/accettare la risposta se lo trovi utile. –

+0

Se lo faccio, mi sembra che il centro della telecamera 2 sia * dietro * alla telecamera 1, quindi z dovrebbe essere negativo. Ma non è molto chiaro a causa della rotazione. – oarfish

1

In realtà la tua interpretazione è corretta.

Prima di tutto, l'orientamento dell'asse y è corretto.Per un'illustrazione del sistema di coordinate della telecamera di OpenCV, vedere here.

Il codice restituirà R e t dalla seconda alla prima videocamera. Questo significa che se x1 è un punto nella prima immagine e x2 è un punto nella seconda immagine, la seguente equazione vale x1 = R*x2 + t. Ora nel tuo caso l'immagine giusta (vista frontale) proviene dalla fotocamera 1 e l'immagine sinistra (vista laterale) dell'auto dalla fotocamera 2.

Guardando questa equazione, vediamo che prima di tutto viene applicata la rotazione . Quindi immagina la tua macchina fotografica attualmente le immagini della cornice sinistra. Ora la tua R specifica una rotazione di circa 46 gradi attorno all'asse y. Poiché i punti di rotazione dell'angolo alfa sono gli stessi della controtorsione dell'asse delle coordinate di questo angolo, la tua R ti dice di ruotare verso sinistra. Come lei stesso sottolinea, ciò sembra corretto se si guardano le immagini. Poiché le rotazioni attorno agli altri assi sono piccole e difficili da immaginare, le omettiamo qui. Quindi, dopo aver applicato la rotazione, ti trovi ancora nella stessa posizione in cui è stata presa la cornice sinistra, ma la tua fotocamera punta più o meno sul retro dell'auto o sullo spazio direttamente dietro l'auto.

Ora diamo un'occhiata al vettore di traduzione. Anche la tua interpretazione sullo spostamento a destra e oltre è corretta. Lasciami provare a spiegare perché. Immagina dalla tua posizione attuale, con la nuova direzione della videocamera ti sposti solo verso destra. potresti imbatterti direttamente in macchina o dover tenere la videocamera sopra il cofano del motore. Quindi, dopo esserti spostato a destra, devi anche allontanarti per raggiungere la posizione da cui hai preso l'immagine giusta.

Spero che questa spiegazione ti abbia aiutato a immaginare il movimento che la tua R e la descrivono.

Problemi correlati