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 quindiK_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
eU*W.t*V.t
) e due modi per calcolare t (± terza colonna di U), il che significa che ci sono quattro combinazioni diRt
, 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 controxEx = 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?
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