6

Ci sono molti post sulla ricostruzione 3D da viste stereo di calibrazione interna nota, alcuni dei quali sono excellent. Ho letto uno lotto e, in base a ciò che ho letto, sto cercando di calcolare la mia ricostruzione di una scena 3D con la pipeline/algoritmo sottostante. Stabilirò il metodo quindi farò domande specifiche in fondo.Ricostruzione 3D da due telecamere calibrate - dov'è l'errore in questa pipeline?

0. calibrare le telecamere:

  • Ciò significa recuperare la fotocamera calibrazione matrici K e K per la macchina fotografica 1 e la macchina fotografica 2. Questi sono matrici 3x3 incapsulamento di ogni telecamera parametri interni: lunghezza focale, offset del punto principale/centro dell'immagine. Questi non cambiano, dovresti farlo solo una volta, beh, per ogni telecamera, purché non si ingrandisca o non si modifichi la risoluzione in cui si registra.
  • Fare ciò offline. Non discutere.
  • Utilizzo le chiavi e le routine di scacchiera, ma questa funzionalità è inclusa anche nello Matlab Camera Calibration toolbox. Le routine di OpenCV sembrano funzionare bene.

1. Fondamentale Matrix F:

  • Con le telecamere ora impostato come un impianto stereo. Determina la matrice fondamentale (3x3) di quella configurazione usando le corrispondenze in punti tra le due immagini/viste.
  • Il modo in cui ottieni le corrispondenze dipende da te e dipenderà molto dalla scena stessa.
  • Sto usando OpenCV findFundamentalMat() per ottenere F, che fornisce un certo numero di opzioni metodo saggio (algoritmo a 8 punti, RANSAC, LMEDS).
  • è possibile verificare la matrice risultante collegandolo nell'equazione che definisce la matrice fondamentale: x'Fx = 0 dove x' ed x sono il punto immagine raw corrispondenze (x, y) in coordinate omogenee (x, y, 1) e uno dei tre vettori viene trasposto in modo che la la moltiplicazione ha senso. Più vicino a zero per ogni corrispondenza, meglio F sta obbedendo alla sua relazione. Questo equivale a verificare quanto bene la F ricavata si mappa effettivamente da un piano dell'immagine ad un altro. Ottengo una deflessione media di ~ 2px usando l'algoritmo a 8 punti.

2. Essential Matrix E:

  • calcolare la matrice Essential direttamente da F e le matrici di calibrazione.
  • E = K T FK

3. vincolo interno su E:

  • E deve rispettare determinati vincoli.In particolare, se decomposto da SVD in USV.t, i valori singolari dovrebbero essere = a, a, 0. I primi due elementi diagonali di S dovrebbero essere uguali e il terzo zero.
  • Sono stato sorpreso di leggere here che se questo non è vero quando si verifica per esso, si potrebbe scegliere di fabbricare una nuova matrice essenziale dalla scomposizione precedente in questo modo: E_new = U * diag(1,1,0) * V.t che è ovviamente garantito per obbedire al vincolo. In pratica hai impostato S = (100.010.000) artificialmente.

4. complete Matrici obiettivo di proiezione:

  • Esistono due fotocamera proiezione matrici P e P 2 . Questi sono 3x4 e rispettano la relazione x = PX. Inoltre, P = K[R|t] e quindi K_inv.P = [R|t] (in cui la calibrazione della videocamera è stata rimossa).
  • La prima matrice P (esclusa la matrice di calibrazione K) può essere impostato per [I|0] allora P (escluse K) è R|t
  • Calcolare la rotazione e traslazione tra le due telecamere R, t dal decomposizione di E. Ci sono due modi possibili per calcolare R (U*W*V.t e U*W.t*V.t) e due modi per calcolare t (± terza colonna di U), il che significa che ci sono quattro combinazioni di Rt, solo una delle quali è valida.
  • Calcola tutte e quattro le combinazioni e scegli quella che corrisponde geometricamente alla situazione in cui un punto ricostruito è davanti a entrambe le fotocamere. Effettivamente, eseguendo e calcolando il risultante P = [R | t] e triangolando la posizione 3d di alcune corrispondenze in coordinate normalizzate per garantire che abbiano una profondità positiva (z-coord)

5. Triangola in 3D

  • Infine, combinare le matrici di proiezione 3x4 recuperati con le rispettive matrici di calibrazione: P' = K 1 P e P' = K P
  • E triangolare le coordinate 3-spaziali di ciascun punto corrispondenza 2d conseguenza, per la quale sto usando il metodo LinearLS da here.

DOMANDE:

  • ci sono eventuali omissioni e/o errori che ululano in questo metodo?
  • matrice
  • mio F è apparentemente accurata (0,22% deflessione nella mappatura rispetto alle tipiche valori delle coordinate), ma durante il test E contro x'Ex = 0 utilizzando immagine normalizzata corrispondenze l'errore tipico che la mappatura è> 100% della normalizzato stesse coordinate .Il test E contro xEx = 0 è valido e, in caso affermativo, da dove proviene il salto di errore?
  • L'errore nella mia stima della matrice fondamentale è significativamente peggiore quando si utilizza RANSAC rispetto all'algoritmo 8pt, ± 50px nella mappatura tra x e x '. Questo mi preoccupa profondamente.
  • 'Applicare il vincolo interno' rimane ancora molto strano con me - come può essere valido produrre semplicemente una nuova matrice essenziale da una parte della scomposizione dell'originale?
  • Esiste un modo più efficiente di determinare quale combinazione di R e di utilizzare anziché calcolare P e triangolare alcune delle coordinate normalizzate?
  • Il mio errore di re-proiezione finale è di centinaia di pixel nelle immagini a 720p. Sto probabilmente osservando problemi nella calibrazione, nella determinazione delle matrici P o nella triangolazione?
+0

Ho fatto letteralmente questi passaggi esatti e non riesco a capire perché la vita di me. Traccio le mie linee epipolari dopo aver ottenuto F, e hanno un bell'aspetto. Controllo x2'Ex1 = 0 e ottengo e-10 come errore totale per tutti i punti, non so cosa fare! – Gentatsu

risposta

2

L'errore a mio avviso fondamentale matr1ix è significativamente peggiore quando si utilizza RANSAC rispetto all'algoritmo 8pt, ± 50px nel mapping tra xe x'. Questo mi preoccupa profondamente.

L'utilizzo dell'algoritmo 8pt non esclude l'utilizzo del principio RANSAC. Quando si utilizza l'algoritmo 8pt direttamente quali punti si usano? Devi scegliere 8 (buoni) punti da solo.

In teoria è possibile calcolare una matrice fondamentale da qualsiasi punto di corrispondenza e spesso si ottiene una matrice fondamentale degenerata perché le equazioni lineari non sono indipendenti. Un altro punto è che l'algoritmo 8pt utilizza un sistema sovradeterminato di equazioni lineari in modo che un singolo outlier distrugga la matrice fondamentale.

Hai provato a utilizzare il risultato RANSAC? Scommetto che rappresenta una delle soluzioni corrette per F.

matrice

mio F è apparentemente accurata (0,22% deflessione nella mappatura rispetto alle tipiche valori delle coordinate), ma durante il test E contro x'Ex = 0 utilizzando le corrispondenze di immagini normalizzate, l'errore tipico in è che il mapping è> 100% delle stesse coordinate normalizzate. test E contro xEx = 0 valido, e in caso affermativo dove si trova quel salto nell'errore ?

Ancora, se F è degenerato, x' F x = 0 può essere per ogni punto corrispondenza.

Un altro motivo per te errato E potrebbe essere l'interruttore delle telecamere (K1T * E * K2 anziché K2T * E * K1). Ricordati di controllare: x'Ex = 0

'Far rispettare il vincolo interno' siede ancora molto stranamente con me - come può essere valido solo produrre una nuova matrice essenziale da parte della decomposizione dell'originale ?

È spiegato in "Visione multipla della geometria in Computer Vision" di Hartley e Zisserman. Per quanto ne so ha a che fare con la minimizzazione della norma Frobenius di F.

Puoi Google e ci sono risorse pdf.

C'è un modo più efficiente di determinare quale combinazione di R e t a uso di calcolo P e triangolazione alcuni dei normalizzati coordinate?

No, per quanto ne so.

Il mio errore di re-proiezione finale è di centinaia di pixel nelle immagini a 720p. Am Probabilmente mi occupo di problemi nella calibrazione, determinazione delle matrici P o della triangolazione?

La trasformazione del corpo rigido P2 non è corretta perché E non è corretta.