2014-11-24 13 views
6

Desidero calcolare le informazioni di profondità da 2 immagini da una telecamera in movimento. Usando Sensor.TYPE_ROTATION_VECTOR ho quaternioni per entrambe le immagini e la relativa quaternoin da Img1 a Img2.Rotazione dell'immagine dai dati del sensore di orientamento

Img1

enter image description here

q1 = 0.7545 - 0.1137i - 0.2715j - 0.5865k 

Img2

enter image description here

q2 = 0.7706 - 0.2252i - 0.3511j - 0.4817k 

e relativa quaternoin è:

qr = -0.9850 + 0.0072i + 0.1329j - 0.1097k 

vale a dire, la matrice di rotazione relativa è,

|0.9406 -0.2142 -0.2635 | 
|0.2180 0.9758 -0.0150 | 
|0.2604 -0.0433  0.9645 | 

E 'questa la matrice di getPerspectiveTransform dà?

Quando uso questa matrice rotazionale 3x3 in warpPerspective, ottengo un'immagine quasi vuota, a parte qualcosa nell'angolo in alto a sinistra. (Forse l'asse attorno al quale viene ruotata l'immagine è sbagliato).

enter image description here

Che cosa sto facendo di sbagliato?

Nota: C'è un piccolo di traduzione nonché tra le 2 immagini (Mi dispiace per le immagini cattive)

Edit 1: Secondo questo link, per la mia Moto G 2nd Generation, ottengo un intrinseco matrix fotocamera come,

K = |-3570 0   1632 | 
    | 0 3554.39 1218.65| 
    | 0  0   1 | 
+0

Da quello che ho capito fino ad ora, devo fare la "correzione delle immagini" per questo. Qualche idea su come farlo con le informazioni disponibili? – harsh

risposta

2

Se ho capito bene, si hanno due immagini scattate da una fotocamera smartphone, di cui si conosce la matrice (almeno approssimativamente) intrinseche, e le relative rotazione 3D tra le pose in cui ° e due immagini dove sono state scattate. Stai anche dicendo che c'è una piccola traduzione tra le due immagini, il che è positivo poiché altrimenti non sarebbe stato possibile calcolare la profondità.

Sfortunatamente, non si dispone di informazioni sufficienti per poter valutare direttamente la profondità. In sostanza, la stima profondità da due immagini richiede di:

1. corrispondenze tra punti Ricerca tra le due immagini

seconda cosa che si vuole fare, questo può essere fatto sia per tutti i punti nelle immagini (cioè in un modo denso) o solo per pochi punti (cioè in modo scarso). Ovviamente quest'ultimo è meno costoso dal punto di vista computazionale, quindi più appropriato per gli smartphone.

  • corrispondenza Dense richiede di rettificare le immagini, in modo da rendere il calcolo trattabili, tuttavia questo sarà probabilmente richiedere molto tempo se eseguita su uno smartphone.La rettifica dell'immagine può essere ottenuta usando un metodo calibrato (che richiede di conoscere la rotazione + traduzione tra le due pose delle immagini, la matrice della macchina fotografica intrinseca e i coefficienti di distorsione della fotocamera) o un metodo non calibrato (che richiede di sapere corrispondenze sparse tra le due immagini e la matrice fondamentale, che può essere stimata dalle partite).

  • La corrispondenza sparsa richiede l'abbinamento di caratteristiche salienti (ad esempio SURF o SIFT o più efficienti) tra le due immagini. Questo ha il vantaggio di essere più efficiente rispetto alla corrispondenza densa e anche più accurato.

2. triangolare la punti corrispondenti a stimare la profondità

Triangolazione richiede conoscere i parametri intrinseci (matrice fotocamera e coefficienti di distorsione) ei parametri estrinseci (relativa rotazione e traslazione tra le pose formare cui le immagini dove sono state scattate).


Nel tuo caso, supponendo che il matrice di rotazione e la fotocamera intrinseci relativi sono sufficientemente accurati (che dubito), manca ancora la definizione ed i coefficienti di distorsione.

Tuttavia, è ancora possibile applicare l'approccio classico per la triangolazione stereo, che richiede una calibrazione accurata della fotocamera e una stima della posa relativa completa (cioè rotazione + traduzione).

La calibrazione della fotocamera consente di stimare una matrice intrinseca accurata e i coefficienti di distorsione associati. Questa operazione è consigliata in quanto la tua fotocamera non sarà esattamente la stessa delle fotocamere degli altri telefoni (anche se si tratta dello stesso modello di telefono). Vedi per es. this tutorial, che mostra la metodologia anche se gli esempi di codice sono in C++ (l'equivalente deve esistere per Android).

Dopo aver stimato accuratamente i parametri intrinseci, un modo per stimare la completa posa relativa (ossia rotazione e traslazione) è quello di calcolare la matrice fondamentale (utilizzando includono trovata tra le due immagini), quindi dedurre la matrice essenziale usando la matrice della telecamera, e infine per decomporre la matrice essenziale nella rotazione e traduzione relative. Vedere this link, che fornisce la formula per dedurre la matrice essenziale dalla matrice fondamentale e this link, che spiega come calcolare la rotazione e la traduzione dalla matrice essenziale.


Inoltre, per rispondere alla tua altra domanda legata alla warpPerspective, si avrebbe bisogno di utilizzare K.R.inv(K) o K.inv(R).inv(K), a seconda dell'immagine che si sta deformazione. Questo perché R è una rotazione 3D, che non ha nulla a che fare con le coordinate dei pixel.

Problemi correlati