2013-06-13 25 views
6

- Aggiornamento 2-Calcolare la distanza (disparità) OpenCV

Il seguente articolo è veramente utile (anche se sta usando Python invece di C++) se si utilizza una sola telecamera per calcolare la distanza: Find distance from camera to object/marker using Python and OpenCV

migliore collegamento è Stereo Webcam Depth Detection. L'implementazione di questo progetto open source è molto chiara.

Di seguito è la domanda originale.


Per il mio progetto, utilizzo due telecamere (visione stereo) per tracciare gli oggetti e calcolare la distanza. Li ho calibrati con il codice di esempio di OpenCV e generato una mappa di disparità.

Ho già implementato un metodo per tracciare gli oggetti in base al colore (questo genera un'immagine di soglia).

La mia domanda: come posso calcolare la distanza dagli oggetti colorati tracciati usando la mappa/matrice di disparità?

Di seguito è riportato uno snippet di codice che ottiene le coordinate x, yez di ciascun pixel. La domanda: Point.z è in cm, pixel, mm?

Posso ottenere la distanza dall'oggetto monitorato con questo codice?

Grazie in anticipo!

cvReprojectImageTo3D(disparity, Image3D, _Q); 

vector<CvPoint3D32f> PointArray; 
CvPoint3D32f Point; 

for (int y = 0; y < Image3D->rows; y++) {  

    float *data = (float *)(Image3D->data.ptr + y * Image3D->step); 

    for (int x = 0; x < Image3D->cols * 3; x = x + 3) 
    { 
     Point.x = data[x];   
     Point.y = data[x+1];  
     Point.z = data[x+2]; 
     PointArray.push_back(Point); 
     //Depth > 10 
     if(Point.z > 10) 
     { 
      printf("%f %f %f", Point.x, Point.y, Point.z);    
     } 
    } 
} 
cvReleaseMat(&Image3D); 

- Update 1 -

Per esempio ho generato questa immagine thresholded (della telecamera a sinistra). Quasi ho lo stesso della fotocamera giusta.

enter image description here

Oltre dell'immagine soglia sopra, l'applicazione genera una mappa disparità. Come posso ottenere le coordinate Z dei pixel della mano nella mappa disparità?

In realtà voglio ottenere tutte le coordinate Z dei pixel della mano per calcolare il valore Z medio (distanza) (utilizzando la mappa disparità).

risposta

1

La matematica per la conversione di disparità (in pixel o percentuale di larghezza dell'immagine) alla distanza effettiva è abbastanza ben documentato (e non molto difficile) ma lo documenterò anche qui.

Di seguito è riportato un esempio in un'immagine disparità (in pixel) e una larghezza di immagine in ingresso 2K (2048 pixel in orizzontale) immagine:

convergenza distanza è determinata dalla rotazione tra le lenti della fotocamera. In questo esempio sarà 5 metri. La distanza di convergenza di 5 (metri) significa che la disparità di oggetti a 5 metri di distanza è 0.

CD = 5 (meters)   

inversa della distanza convergenza è: 1/CD

IZ = 1/5 = 0.2M 

Dimensione del sensore della telecamera in metri

SS = 0.035 (meters) //35mm camera sensor 

La larghezza di un pixel sul sensore in metri

PW = SS/image resolution = 0.035/2048(image width) = 0.00001708984 

La lunghezza focale del tuo telecamere in metri

FL = 0.07 //70mm lens 

interasse: La distanza dal centro di lente sinistra al centro della lente destra

IA = 0.0025 //2.5mm 

La combinazione dei parametri fisici del vostro impianto di perforazione fotocamera

A = FL * IA/PW 

Disparità regolata dalla fotocamera: (Solo per la vista a sinistra, la vista a destra userebbe il positivo [valore disparità])

AD = 2 * (-[disparity value]/A) 

Da qui si può calcolare la distanza reale utilizzando la seguente equazione:

realDistance = 1/(IZ – AD) 

Questa equazione funziona solo per "toe-in" sistemi di telecamere, fotocamera piattaforme parallele userà un'equazione leggermente diverso per evitare valori infinito ma lo lascerò a questo per ora. Se hai bisogno delle cose parallele fammelo sapere.

Problemi correlati