ho avuto un compito:Aperto CV - diversi metodi per SFM
Abbiamo un sistema di lavoro in cui una telecamera fa un halfcircle intorno ad una testa umana. Conosciamo la matrice della telecamera e la rotazione/traduzione di ogni fotogramma. (Distorsione e altro ... ma voglio prima lavorare senza questi parametri)
Il mio compito è che ho solo la matrice della telecamera, che è costante su questa mossa, e le immagini (più di 100). Ora devo ottenere la traduzione e la rotazione da una cornice all'altra e confrontarla con la rotazione e la traduzione nel mondo reale (dal sistema che ho, ma solo per il confronto, anch'io lo provo!)
Primi passi I fatto fino a questo momento:
- utilizzare il robustMatcher dal Cookbook OpenCV - works finde - 40-70 Corrisponde a ciascun frame: visibile sembra molto buono!
- Ottengo la matrice fondamentale con getFundamental(). Io uso i robusti punti di robustMatcher e RANSAC.
- Quando ho ricevuto la F posso ottenere l'Essentialmatrix E con il mio CameraMatrix K in questo modo:
cv::Mat E = K.t() * F * K; //Found at the Bible HZ Chapter 9.12
Ora abbiamo bisogno di estrarre R e t fuori E con SVD. A proposito, la posizione di camera1 è solo zero perché dobbiamo iniziare da qualche parte.
cv::SVD svd(E);
cv::SVD svd(E);
cv::Matx33d W(0,-1,0, //HZ 9.13
1,0,0,
0,0,1);
cv::Matx33d Wt(0,1,0,//W^
-1,0,0,
0,0,1);
cv::Mat R1 = svd.u * cv::Mat(W) * svd.vt; //HZ 9.19
cv::Mat R2 = svd.u * cv::Mat(Wt) * svd.vt; //HZ 9.19
//R1 or R2???
R = R1; //R2
//t=+u3 or t=-u3?
t = svd.u.col(2); //=u3
Questo è il mio stato attuale!
I miei piani sono:
- triangolare tutti i punti per ottenere punti 3D
- Registrati cornice i con cornice i ++
- visualizzarli indica in qualche modo il mio 3D!
Ora le mie domande sono:
- è questo matcher robusta datato? c'è un altro metodo?
- È sbagliato utilizzare questi punti come descritto al mio secondo passaggio? Devono essere convertiti con distorsione o qualcosa del genere?
- Che cos'è questo estratto qui? È la rotazione e la traduzione tra camera1 e camera2 con il punto di vista di camera1?
- Quando leggo alla bibbia o ai giornali o altrove scopro che ci sono 4 possibilità su come R e t possono essere! 'P '= [UWV^T | + u3] o [UWV^T | -u3] o [UW^TV^T | + u3] oder [UW^TV^T | -u3]' P'è il projectionmatrix della seconda immagine. Ciò significa che t potrebbe essere - o + e R potrebbero essere totalmente diversi ?! Ho scoperto che dovrei calcolare un punto in 3D e scoprire se questo punto è davanti a entrambe le telecamere, quindi ho trovato la matrice corretta! Ho trovato un po 'di questo codice a internet e ha appena detto questo non è più il calcolo:
cv::Mat R1 = svd.u * cv::Mat(W) * svd.vt
et = svd.u.col(2); //=u3
Perché questo è corretto? Se non lo è, come farei questa triangolazione in OpenCV? Ho confrontato questa traduzione con la traduzione che mi viene data. (In primo luogo ho dovuto trasferire la traduzione e la rotazione in relazione a camera1 ma ora ho capito!) Ma non è la stessa cosa. I valori del mio programma sono solo lascia chiamarlo saltare da più troppo meno. Ma dovrebbe essere più costante perché la telecamera si muove in un cerchio costante. Sono sicuro che alcuni assi potrebbero essere cambiati. So che la traduzione è solo da -1 fino a 1 ma pensavo di poter estrarre un fattore dai miei risultati ai miei valori di confronto e quindi dovrebbe essere simile.
Qualcuno ha già fatto qualcosa del genere?
Molte persone eseguono una calibrazione della fotocamera utilizzando una scacchiera, ma non posso utilizzare questo metodo per ottenere i parametri estrinseci.
So che lo sfm visivo può farlo in qualche modo. (A YouTube è un video in cui qualcuno gira intorno ad un albero e ricava da queste immagini una ricostruzione di questo albero usando la sfm visiva) Questo è praticamente lo stesso di quello che devo fare.
Ultima domanda:
C'è qualcuno che sa un modo semplice per visualizzare i miei punti in 3D? Preferisco MeshLab. Qualche esperienza con questo?
@ Shambool: Grazie per il vostro aiuto. Sono andato un po 'oltre con le mie ricerche. Dovrei davvero usare il undistortPoints. Ho pensato che puoi ottenere l'estrinseco con la calibrazione. Ma sembra che mi sia sbagliato. –
Ma non ero interessato alla calibrazione perché ho già la matrice della fotocamera (intrinseca). È importante sapere che la matrice R e t dipende dal primo sistema di coordinate della telecamera. Il prossimo passo: ottenere il giusto R e t a causa delle 4 opzioni. Sì, può essere fatto con triangolazione. (e SVD o Horn's closed form per ottenere le quattro opzioni) –
Ma tu dici solo che è possibile e descrittivo matematico alla bibbia, ma io speravo in qualcuno che lo avesse già fatto e volesse condividere il suo codice. Ultimo: yes ply file dovrebbe essere il migliore con Meshlab. Voglio tornare agli youtubevideos: no non hanno fatto una calibrazione. Usano come 150.000 Flikrimages da Roma, Ragusa o un albero e fanno una sfm. Quindi loro assoluti non possono avere una calibrazione! Ma la cosa cattiva per la mia domanda è anche solo risolvere questo problema R e t. Se qualcuno vuole condividere il suo codice, sarebbe davvero utile. –