Dimostrazione algoritmo DLT per la calibrazione di un camera

Messaggioda Nosba » 11/11/2019, 21:10

Salve a tutti,
Sono uno studente del corso di visione computazionale a Verona e sto cercando di capire il funzionamento di un algoritmo per trovare i parametri della matrice di proiezione data un immagine ed n punti noti.

Purtroppo non riesco a capire come viene effettuato un passaggio per il calcolo di questa matrice, scriverò quindi di seguito la procedura come scritta sul libro nella speranza che qualcuno possa spiegarmi il passaggio in questione.

Supponiamo di possedere le coordinate omogenee di n punti rispetto al sistema di riferimento "mondo", li indicherò con \(\displaystyle M_i \) e le coordinate delle loro proiezioni nel sistema di riferimento dell'immagine che indicherò con \(\displaystyle m_i \). Essendo coordinate omogenee le dimensioni dei vettori \(\displaystyle M_i \) e \(\displaystyle m_i \) sono rispettivamente \(\displaystyle 4\times1 \) e \(\displaystyle 3 \times 1 \).
Lo scopo dell'algoritmo è trovare i valori degli elementi della matrice \(\displaystyle P \) di dimensioni \(\displaystyle 3\times 4 \) tale per cui:

\(\displaystyle m_i \simeq PM_i \)

dove il simbolo \(\displaystyle \simeq \) indica "uguale a meno di un fattore di scala".
Siccome \(\displaystyle m_i \) e \(\displaystyle PM_i \) sono uguali a meno di un fattore di scala essi possiedono uguale direzione quindi possiamo scrivere: \(\displaystyle m_i \times PM_i = 0 \).
Ora, sia \(\displaystyle [m_i]_\times \) la matrice tale che dato un vettore \(\displaystyle b \) allora \(\displaystyle m_i \times b = [m_i]_\times b \). Possiamo scrivere quindi che \(\displaystyle [m_i]_\times MP_i = 0 \Leftrightarrow vec([m_i]_\times PM_i) = 0 \) dove \(\displaystyle vec \) è l'operazione di vettorizzazione (il vettore ottenuto incolonnando una sopra l'altra tutte le colonne della matrice).

Ora dobbiamo ricordare la proprietà del prodotto di Kronecker tale per cui siano \(\displaystyle A, B, C \) tre matrici allora: \(\displaystyle vec(ABC) = (C^T \otimes A)vec(B) \) dove \(\displaystyle \otimes \) denota il prodotto di Kronecker.

Grazie a questa proprietà possiamo giungere alla riscrittura finale del nostro sistema iniziale:
\(\displaystyle (M_i^T \otimes [m_i]_\times)vec(P) = 0 \)

Ora possiamo notare che l'equazione appena mostrata rappresenta un sistema omogeneo a 3 equazioni e 12 incognite, ma si può dimostrare che la matrice \(\displaystyle (M_i^T \otimes [m_i]_\times) \) ha rango uguale a 2 e quindi solo due di queste 3 equazioni sono indipendenti. Denotiamo quindi con \(\displaystyle \tilde{A_i} \) la matrice ottenuta rimuovendo l'ultima riga dalla matrice \(\displaystyle (M_i^T \otimes [m_i]_\times) \).
Supponendo di possedere n coppie di punti con n maggiore uguale a 6, possiamo ottenere un sistema a 2n equazioni e 12 incognite che è risolvibile.

È qui che non capisco come, il libro adesso dice che sia \(\displaystyle A = \left[\matrix{\tilde{A_0} \cr . . . \cr \tilde{A_n} } \right] \) possiamo scrivere che:

\(\displaystyle Avec(P^T) = 0 \)


Quello che io non riesco proprio a capire è: Da dove salta fuori quella trasposizione della matrice P?
Nosba
Starting Member
Starting Member
 
Messaggio: 11 di 22
Iscritto il: 10/04/2015, 20:05

Torna a Geometria e algebra lineare

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite