Triangolazione

Dotiamo i nostri robot di occhi per guardare e analizzare il nostro mondo

Triangolazione

Messaggiodi pasquale.marinaro il mar 25 mag 2010, 10:03

Salve a tutti, mi sono appena registrato.
Complimenti per il forum.

Sto affrontando un problema di stereo visione.
Ho due telecamere, le ho calibrate utilizzando il pattern di opencv (la schacchiera). Ho effettuato le correzioni epipolari e ho ottenuto la mappa di disparità e quella di profondità. L'ultimo passo, se non sbaglio, è la triangolazione.
Identificato un punto in entrambe le immagini (con coordinate x y), come posso ottenere le sue coordinate 3D? Quali funzioni di opencv devo utilizzare?

Grazie
pasquale.marinaro
Novellino
 
Messaggi: 5
Iscritto il: mar 25 mag 2010, 9:51

Re: Triangolazione

Messaggiodi Myzhar il mar 25 mag 2010, 15:25

OpenCV mette a disposizione la funzione "inversa" rispetto a quello che chiedi:
cvProjectPoints2
http://opencv.willowgarage.com/document ... ectpoints2

Però puoi trovare un'interessante soluzione leggendo questo thread del Gruppo ufficiale OpenCV:
http://thread.gmane.org/gmane.comp.lib. ... ocus=13302
--------------------
......Myzhar......
...forum admin...
--------------------
Avatar utente
Myzhar
Forum Admin
 
Messaggi: 118
Iscritto il: ven 6 mar 2009, 15:35
Località: Marina di Massa

Re: Triangolazione

Messaggiodi pasquale.marinaro il mer 26 mag 2010, 11:37

ho dato un'occhiata ai link.
Però non mi è tutto chiaro. In particolare nell'equazione
Immagine
si parla di matrice dei parametri intrinseci ed estrinseci (di cui sono in possesso) di una sola telecamera . Sbaglio? Allora l'altra telecamera?

grazie
pasquale.marinaro
Novellino
 
Messaggi: 5
Iscritto il: mar 25 mag 2010, 9:51

Re: Triangolazione

Messaggiodi Myzhar il gio 27 mag 2010, 11:34

Forse quest'approccio non è effettivamente il migliore.

Un modo per "rigirare" la frittata è il seguente:
- calibrazione
- stereoRectify (per calcolare Q)
- reprojectImageTo3D

con l'ultima funzione ottieni un'immagine floating point di cui ogni pixel contiene le coordinate 3D del rispettivo punto della mappa di disparità.

Sto attualmente utilizzando questo approccio per un progetto a cui sto lavorando, se decidi di seguirlo ci lavoreremo in parallelo.
--------------------
......Myzhar......
...forum admin...
--------------------
Avatar utente
Myzhar
Forum Admin
 
Messaggi: 118
Iscritto il: ven 6 mar 2009, 15:35
Località: Marina di Massa

Re: Triangolazione

Messaggiodi pasquale.marinaro il gio 27 mag 2010, 15:14

In precedenza ho utilizzato matlab e il suo toolbox per l'image processing.
Il processo che utilizzavo per la triangolazione era piuttosto complesso e fatto in casa.

Con opencv sono aperto a qualunque strada.

L'approccio seguito fino ad ora è il seguente (ripreso dal libro learning opencv):
riporto alcune righe di codice che ritengo più importanti.


cvStereoCalibrate( &_objectPoints, &_imagePoints1,
&_imagePoints2, &_npoints,
&_M1, &_D1, &_M2, &_D2,
imageSize, &_R, &_T, &_E, &_F,
...);

cvInitUndistortRectifyMap(&_M1,&_D1,&_R1,&_P1,mx1,my1);
cvInitUndistortRectifyMap(&_M2,&_D2,&_R2,&_P2,mx2,my2);

cvRemap( frameTelecameraSx, img1r, mx1, my1 );
cvRemap( frameTelecameraDx, img2r, mx2, my2 );

cvFindStereoCorrespondenceBM( img1r, img2r, disp, BMState);

cvReprojectImageTo3D(disp, image3D, Q);

image3D e Q sono output.

al momento utilizzo 2 telecamere differenti e la mappa di disparità è inguardabile.
al più presto provvederò a recuperare 2 telecamere uguali.

Comunque, volendo, poi, effettuare ad esempio, shape recognition, bisognerebbe farlo sulla mappa di disparità? Oppure effettuarlo sui 2 frame originali, individuare le 2 ROI (nei 2 frame) e poi applicare il processo per il calcolo della mappa di disparità alle 2 ROI?

Mah, sono in alto mare.
pasquale.marinaro
Novellino
 
Messaggi: 5
Iscritto il: mar 25 mag 2010, 9:51

Re: Triangolazione

Messaggiodi Myzhar il gio 27 mag 2010, 15:35

Il tuo è un procedimento analogo al mio... io non ho bisogno di rettificare le immagini perché lo sono già e mi hanno fornito le matrici di calibrazione.

L'approccio che proponi in fondo è difficile da scegliere a priori.
Identificare l'oggetto nelle due immagini è un'operazione pesante, ma sicuramente più precisa.
L'altra è meno precisa, ma tutto dipende dalla mappa di disparità generata.
--------------------
......Myzhar......
...forum admin...
--------------------
Avatar utente
Myzhar
Forum Admin
 
Messaggi: 118
Iscritto il: ven 6 mar 2009, 15:35
Località: Marina di Massa

Re: Triangolazione

Messaggiodi pasquale.marinaro il mar 15 giu 2010, 15:59

Ciao, ancora non sono entrato in possesso di due telecamere uguali. Comunque la mappa di disparità generata è migliorata. Sto agendo sulla struttura BMState. Non ho trovato molta documentazione a riguardo, ma variando alcuni parametri c'è un netto miglioramento. Sai come funziona di preciso?

Una volta utilizzata la funzione reprojectImageTo3D, in output ottengo una matrice(Mat3D). Ad ogni coppia di coordinate x,y corrispondono tre coordinate X Y Z del mondo reale?
Come faccio a ricavarmele? E' corretto utilizzare la funzione cvGet3D()?

Inoltre, la matrice di output Mat3D, come viene dichiarata?
Ho provato:
int size[] = {imageSize.height, imageSize.width, 3};
CvMatND* Mat3D= cvCreateMatND( 3,size, CV_16SC3 );

cvReprojectImageTo3D(disparityMap, Mat3D, Q, 0);
infine :
coordinata_Reale_X = cvGet3D(Mat3D, x,y,1);

teoricamente è corretto?

a me da un errore : Bad flag (parameter or structure field) (unrecognized or unsupport array type) in cvGetMat


grazie
pasquale.marinaro
Novellino
 
Messaggi: 5
Iscritto il: mar 25 mag 2010, 9:51

Re: Triangolazione

Messaggiodi pasquale.marinaro il mar 7 set 2010, 11:44

Ci sono novità?
pasquale.marinaro
Novellino
 
Messaggi: 5
Iscritto il: mar 25 mag 2010, 9:51


Torna a Visione Artificiale

Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti

cron