2012-08-13 14 views
6

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:

  1. utilizzare il robustMatcher dal Cookbook OpenCV - works finde - 40-70 Corrisponde a ciascun frame: visibile sembra molto buono!
  2. Ottengo la matrice fondamentale con getFundamental(). Io uso i robusti punti di robustMatcher e RANSAC.
  3. 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:

  1. triangolare tutti i punti per ottenere punti 3D
  2. Registrati cornice i con cornice i ++
  3. visualizzarli indica in qualche modo il mio 3D!

Ora le mie domande sono:

  1. è questo matcher robusta datato? c'è un altro metodo?
  2. È sbagliato utilizzare questi punti come descritto al mio secondo passaggio? Devono essere convertiti con distorsione o qualcosa del genere?
  3. Che cos'è questo estratto qui? È la rotazione e la traduzione tra camera1 e camera2 con il punto di vista di camera1?
  4. 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 e t = 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?

risposta

2

Molte persone eseguono una calibrazione della fotocamera utilizzando una scacchiera, ma non posso utilizzare questo metodo per ottenere i parametri estrinseci.

Una scacchiera o una scacchiera viene utilizzata per trovare la matrice/i parametri interni/intrinseci, non i parametri estrinseci. Stai dicendo che hai già la matrice interna, suppongo che è ciò che si intende per

Sappiamo la matrice fotocamera e ...

Questi video che avete visto su youtube hanno fatto la lo stesso, la fotocamera è già calibrata, cioè la matrice interna è nota.

datato? c'è un altro metodo?

Non ho quel libro, quindi non vedo il codice e rispondi a questo.

È sbagliato utilizzare questi punti come descritto al mio secondo passaggio? Devono essere convertiti con distorsione o qualcosa del genere?

È necessario prima annullare la distorsione radiale, vedere undistortPoints.

Che cos'è questo estratto? È la rotazione e la traduzione tra camera1 e camera2 con il punto di vista di camera1?

R è l'orientamento della seconda videocamera nel sistema di coordinate della prima telecamera. E T è la posizione della seconda telecamera in quel sistema di coordinate. Questi hanno diversi usi.

Quando ho letto la Bibbia o giornali o altrove trovo che ci sono 4 possibilità how ....

leggere la relativa sezione della Bibbia, questo è molto ben spiegato lì, triangolazione è un metodo ingenuo, qui viene spiegato un approccio migliore.

Qualcuno conosce un modo semplice per visualizzare i miei punti 3D?

di vederli in MeshLab un modo molto semplice è quello di salvare la coordinata dei punti 3D in un file PLY, questo è un formato estremamente semplice e supportata da MeshLab e quasi tutti gli altri spettatori modello 3D.

+0

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

+0

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

+0

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

1

In questo articolo "Una soluzione efficiente per il problema di posa relativo a cinque punti", Nistér spiega un ottimo metodo per determinare quale delle quattro configurazioni è quella corretta (parlando di R e T).

Ho provato l'accoppiatore robusto e penso che sia tranquillo. I problemi che ha questo matcher sono molto lenti perché usano SURF, forse dovresti provare con altri rivelatori ed estrattori per migliorare la velocità. Credo anche che la funzione in OpenCV che calcola la matrice fondamentale non abbia bisogno del parametro Ransac perché la velocità e la simmetria dei metodi fanno un ottimo lavoro rimuovendo i valori anomali, dovresti provare il parametro a 8 punti.

OpenCV ha la funzione triangolare, questo richiede solo due matrici di proiezione, punti che si trovano nella prima e nella seconda immagine. Controlla il modulo calib3d.

+0

Vale la pena notare che le versioni più recenti di OpenCV ora includono tre funzioni per il recupero della matrice essenziale e la sua decomposizione, basata sul lavoro di Nister. Ho scoperto che la nuova funzione findEssentialMat era molto più robusta della vecchia funzione findFundamentalMat per i miei dati. Stavo avendo un sacco di problemi nel correggere un paio di immagini scattate spostando solo una telecamera; ora sto avendo più fortuna. –

Problemi correlati