Calculer la distance (disparité) OpenCV
-- Mise à jour 2 --
La suite de l'article est vraiment utile (même si c'est à l'aide de Python au lieu de C++) si vous êtes en utilisant une seule caméra pour calculer la distance: Trouver la distance entre la caméra et l'objet/marqueur à l'aide de Python et OpenCV
Meilleur lien est Stéréo Webcam Profondeur De Détection. La mise en œuvre de ce projet open source est vraiment clair.
Ci-dessous est la question d'origine.
Pour mon projet, je suis à l'aide de deux caméras (la vision stéréo) pour le suivi d'objets et de calculer la distance. J'ai calibré avec l'exemple de code de OpenCV et a généré un écart carte.
J'ai déjà mis en place une méthode de suivi des objets en fonction de la couleur (ce qui génère un seuil de l'image).
Ma question: Comment puis-je calculer la distance pour le suivi des objets colorés à l'aide de la disparité de la carte/de la matrice?
Vous trouverez ci-dessous un extrait de code qui récupère le x,y et z les coordonnées de chaque pixel. La question: Est-ce Point.z (cm), pixels, mm?
Puis-je obtenir la distance à l'objet suivi avec ce code?
Vous en remercie 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 de 1--
Par exemple, j'ai généré ce thresholded de l'image (de la caméra de gauche). J'ai presque le même de la caméra de droite.
Outre les au dessus du seuil de l'image, l'application génère une disparité de la carte. Comment puis-je obtenir les coordonnées Z des pixels de la main dans la disparité de la carte?
Je veux obtenir toutes les coordonnées Z des pixels de la main pour calculer la moyenne de la valeur Z (distance) (à l'aide de la disparité de la carte).
Vous devez vous connecter pour publier un commentaire.
Voir ce liens: OpenCV: Comment calculer la distance entre la caméra et l'objet à l'aide de l'image?, Trouver la distance d'un appareil à un objet de taille connue, http://answers.opencv.org/question/5188/measure-distance-from-detected-object-using-opencv/
Si cela ne résout pas votre problème, écrire plus de détails - pourquoi il n'est pas de travail, etc.
Le calcul pour la conversion de disparité (en pixels ou en pourcentage de la largeur de l'image) à la distance réelle est assez bien documenté (et pas très difficile), mais je vais le document ici également.
Ci-dessous est un exemple donné une disparité de l'image (en pixels) et une image d'entrée largeur de 2K (2048 pixels dans l'image:
De Convergence de la Distance est déterminée par la rotation entre les lentilles de caméra. Dans cet exemple, il sera de 5 mètres. La Convergence distance de 5 mètres qui signifie que la disparité des objets de 5 mètres est de 0.
Inverse de la convergence de la distance est de: 1 /CD
Taille du capteur de l'appareil en mètres
La largeur d'un pixel sur le capteur en mètres
La longueur focale des caméras mètres
Entre axe de la distance: La distance entre le centre de la lentille gauche vers le centre de la lentille droite
La combinaison des paramètres physiques de votre plate-forme de caméra
Caméra Ajustée disparité: (Pour la vue de gauche uniquement, vue de droite serait d'utiliser positive [disparité valeur])
De là, vous pouvez calculer la distance réelle à l'aide de l'équation suivante:
Cette équation ne fonctionne que pour les "pincement" des systèmes de caméra, en parallèle des supports caméra sera un peu différent de l'équation pour éviter l'infini de valeurs, mais je vais laisser cela pour l'instant. Si vous avez besoin de le parallèle des trucs juste laissez-moi savoir.