Ho 4 punti complanari in un video (o immagine) che rappresenta un quad (non necessariamente un quadrato o un rettangolo) e vorrei poter visualizzare un cubo virtuale su sopra di loro dove gli angoli del cubo si trovano esattamente agli angoli del video quad.Posa telecamera di calcolo con matrice di omografia basata su 4 punti complanari
Poiché i punti sono complanari, posso calcolare l'omografia tra gli angoli di un quadrato unitario (cioè [0,0] [0,1] [1,0] [1,1]) e le coordinate video del quad.
Da questa omografia dovrei essere in grado di calcolare una posa corretta della telecamera, cioè [R | t] dove R è una matrice di rotazione 3x3 e t è un vettore di traduzione 3x1 in modo che il cubo virtuale si trovi sul quad video.
Ho letto molte soluzioni (alcune su SO) e ho provato a implementarle ma sembrano funzionare solo in alcuni casi "semplici" (come quando il video quad è un quadrato) ma nella maggior parte dei casi non funzionano.
Ecco i metodi che ho provato (molti di questi sono basati sugli stessi principi, solo il calcolo della traduzione è leggermente diverso). Sia K la matrice intrinseca della telecamera e H l'omografia. Calcoliamo:
A = K-1 * H
Let a1, a2, a3 essere i vettori colonna di A e r1, r2, r3 i vettori colonna della matrice di rotazione R.
r1 = a1/||a1||
r2 = a2/||a2||
r3 = r1 x r2
t = a3/sqrt(||a1||*||a2||)
Il problema è che questo non funziona nella maggior parte dei casi. Per verificare i miei risultati, ho confrontato R e t con quelli ottenuti con il metodo solvePnP di OpenCV (utilizzando i seguenti punti 3D [0,0,0] [0,1,0] [1,0,0] [1,1 , 0]).
Poiché visualizzo il cubo allo stesso modo, ho notato che in ogni caso solvePnP fornisce risultati corretti, mentre la posa ottenuta dall'omografia è per lo più errata.
In teoria dal momento che i miei punti sono complanari, è possibile calcolare la posizione da un omografia, ma non riuscivo a trovare il modo corretto per calcolare la posizione da H.
Eventuali approfondimenti su ciò che sto facendo male ?
Modifica dopo aver provato @ metodo di Jav_Rock
Ciao Jav_Rock, grazie mille per la risposta, ho cercato il tuo approccio (e molti altri) che sembra essere più o meno OK. Tuttavia, ho ancora problemi con il calcolo della posa basato su 4 punti complanari. Per verificare i risultati, mi confronto con i risultati di solvePnP (che sarà molto meglio a causa dell'approccio di minimizzazione dell'errore di riproiezione iterativo).
Ecco un esempio:
- Cubo giallo: risolvere PNP
- Black Cube: la tecnica di Jav_Rock
- Ciano (e viola) cubo (s): alcune altre tecniche indicate lo stesso identico risultato
Come potete vedere, il cubo nero è più o meno OK, ma non sembra ben proporzionato, anche se i vettori sembrano ortonormali.
EDIT2: Ho normalizzato v3 dopo aver calcolato che (al fine di far rispettare ortonormalità) e sembra per risolvere alcuni problemi pure.
Così solvepnp di OpenCV fornisce risultati corretti, mentre l'implementazione è sbagliato? – nav
Sì solvePnP fornisce risultati corretti mentre la mia implementazione usando solo omografie non fornisce i corretti vettori di rotazione/traduzione. – JimN
Se condividi il tuo codice, possiamo esaminarlo e vedere come può essere risolto. Una cosa che potresti aver dimenticato è applicare l'ortonormalità della matrice di rotazione. – fireant