2013-06-13 2 views
6

- Mise à jour 2-distance Calculer (écart) OpenCV

L'article suivant est vraiment utile (bien qu'il utilise à la place Python de C++) si vous utilisez une seule caméra pour calculer la distance: Find distance from camera to object/marker using Python and OpenCV

Meilleur lien est Stereo Webcam Depth Detection. L'implémentation de ce projet open source est vraiment claire.

Voici la question originale. Pour mon projet, j'utilise deux caméras (vision stéréoscopique) pour suivre des objets et calculer la distance. Je les ai calibrés avec l'exemple de code d'OpenCV et j'ai généré une carte de disparité.

J'ai déjà mis en œuvre une méthode pour suivre les objets basés sur la couleur (cela génère une image de seuil).

Ma question: Comment puis-je calculer la distance aux objets colorés suivis à l'aide de la carte/matrice de disparité?

Ci-dessous vous pouvez trouver un extrait de code qui obtient les coordonnées x, y et z de chaque pixel. La question: Est-ce que Point.z est en cm, pixels, mm? Puis-je obtenir la distance de l'objet suivi avec ce code?

Merci d'avance!

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); 

- Mise à jour 1 -

Par exemple, je généré cette image seuillée (de la caméra à gauche). J'ai presque la même chose de la bonne caméra.

enter image description here

Outre l'image de seuil haut, l'application génère une carte de disparité. Comment puis-je obtenir les coordonnées Z des pixels de la main dans la carte de disparité?

En fait, je veux obtenir toutes les coordonnées Z des pixels de la main pour calculer la valeur Z moyenne (distance) (en utilisant la carte de disparité).

Répondre

1

Le calcul pour convertir la disparité (en pixels ou pourcentage de la largeur de l'image) à la distance réelle est assez bien documenté (et pas très difficile) mais je vais le documenter ici aussi.

ci-dessous est un exemple donné une image de disparité (en pixels) et une largeur d'image d'entrée de 2K (2048 pixels de large) Image:

Convergence La distance est déterminée par la rotation entre les lentilles de caméra. Dans cet exemple, ce sera 5 mètres. La distance de convergence de 5 (mètres) signifie que la disparité des objets à 5 mètres est 0.

CD = 5 (meters)   

inverse de la distance de convergence est la suivante: 1/CD

IZ = 1/5 = 0.2M 

Taille du capteur de la caméra en mètres

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

La largeur d'un pixel sur le capteur en mètres

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

La distance focale de votre caméras en mètres

FL = 0.07 //70mm lens 

entraxe: La distance du centre de la lentille gauche au centre de la lentille droite

IA = 0.0025 //2.5mm 

La combinaison des paramètres physiques de votre plate-forme caméra

A = FL * IA/PW 

Caméra Disparité ajustée: (Pour la vue de gauche uniquement, la vue de droite utilise une valeur positive [valeur de disparité])

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

De là, vous pouvez calculer la distance réelle en utilisant l'équation suivante:

realDistance = 1/(IZ – AD) 

Cette équation ne fonctionne que pour les systèmes de caméra « pincement », les plates-formes de caméra parallèles utilisera une équation légèrement différente pour éviter les valeurs de l'infini , mais je vais en rester là pour le moment. Si vous avez besoin des trucs parallèles, faites le moi savoir.

Questions connexes