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.
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