2013-06-13 21 views
6

- Update 2-berechnen Abstand (Disparität) OpenCV

Der folgende Artikel wirklich nützlich ist (obwohl es Python anstelle von C++ verwenden), wenn Sie eine einzelne Kamera verwenden um den Abstand zu berechnen: Find distance from camera to object/marker using Python and OpenCV

Best Link ist Stereo Webcam Depth Detection. Die Umsetzung dieses Open-Source-Projekts ist wirklich klar.

Unten ist die ursprüngliche Frage.

Für mein Projekt verwende ich zwei Kameras (Stereo Vision), um Objekte zu verfolgen und die Entfernung zu berechnen. Ich habe sie mit dem Beispielcode von OpenCV kalibriert und eine Disparitätskarte erstellt.

Ich habe bereits eine Methode zur Verfolgung von Objekten basierend auf Farbe implementiert (dies erzeugt ein Schwellenwertbild).

Meine Frage: Wie kann ich den Abstand zu den verfolgten farbigen Objekten mit Hilfe der Disparitätskarte/Matrix berechnen?

Unten finden Sie ein Code-Snippet, das die x-, y- und z-Koordinaten jedes Pixels erhält. Die Frage: Ist Point.z in cm, Pixel, mm?

Kann ich mit diesem Code die Entfernung zum verfolgten Objekt ermitteln?

Vielen Dank im Voraus!

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 -

Zum Beispiel erzeugen ich dieses schwellen Bild (von der linken Kamera). Ich habe fast das gleiche von der richtigen Kamera.

enter image description here

Neben dem obigen Schwellenbild, erzeugt die Anwendung eine Disparitätskarte. Wie kann ich die Z-Koordinaten der Pixel der Hand in der Disparitätskarte erhalten?

Ich möchte eigentlich alle Z-Koordinaten der Pixel der Hand erhalten, um den durchschnittlichen Z-Wert (Abstand) zu berechnen (unter Verwendung der Disparitätskarte).

Antwort

1

Die Mathematik für Disparität Umwandlung (in Pixeln oder Bildbreite (%) bis zur tatsächlichen Entfernung ist ziemlich gut dokumentiert (und nicht sehr schwierig), aber ich werde es auch hier dokumentieren.

Unten ist ein Beispiel eines Disparitätsbild (in Pixel) und eine Eingangsbildbreite von 2K (2048 Pixel breit) Bild gegeben:

Konvergenzabstand durch die Drehung zwischen Kameralinsen bestimmt ist. In diesem Beispiel wird es 5 Meter sein. Konvergenzentfernung von 5 (Meter) bedeutet, dass die Disparität von Objekten in 5 Metern Entfernung 0 ist.

CD = 5 (meters)   

Inverse der Konvergenzabstand: 1/CD

IZ = 1/5 = 0.2M 

Größe des Sensors der Kamera in Metern

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

Die Breite eines Pixels auf dem Sensor in Metern

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

Die Brennweite Ihres Kameras in Metern

FL = 0.07 //70mm lens 

Achsenabstand: Der Abstand von der Mitte der linken Linse in der Mitte des rechten Linse

IA = 0.0025 //2.5mm 

Die Kombination des physikalischen Parameters der Kamera rig

A = FL * IA/PW 

Kameraadjustierte Disparität: (Nur für linke Ansicht, rechte Ansicht würde positiven [Disparitätswert] verwenden)

Von hier aus können Sie tatsächliche Entfernung anhand der folgenden Gleichung berechnen:

realDistance = 1/(IZ – AD) 

Diese Gleichung für „toe-in“ Kamerasysteme nur arbeitet, parallel Kamera-Rigs wird eine etwas andere Gleichung verwenden, um unendlich Werte zu vermeiden , aber ich lasse es für jetzt hier. Wenn Sie das parallele Zeug brauchen, lassen Sie es mich wissen.