Distance à l'objet en utilisant un appareil photo stéréo
Est-il un moyen de calculer la distance à l'objet spécifique en utilisant la caméra stéréo?
Est-il une équation ou quelque chose pour obtenir la distance à l'aide de disparité ou de l'angle?
source d'informationauteur pasanbsb | 2011-06-05
Vous devez vous connecter pour publier un commentaire.
REMARQUE: Tout ce qui est décrit ici peut être trouvé dans l'Apprentissage d'OpenCV livre dans les chapitres sur le calibrage de la caméra et de la vision stéréo. Vous devriez lire ces chapitres pour obtenir une meilleure compréhension des étapes ci-dessous.
Une approche qui ne vous obligent pas à mesurer tout l'appareil intrinsèques et extrinsics vous-même est d'utiliser openCVs les fonctions de calibration. Caméra intrinsèques (la distorsion de l'objectif/l'inclinaison, etc) peut être calculé avec cv::calibrateCamera, tandis que le extrinsics (relation entre la gauche et la droite de la caméra) peut être calculé avec cv::stereoCalibrate. Ces fonctions prennent un certain nombre de points de coordonnées en pixels et tente de les mapper à l'objet du monde réel coordonnées. CV a une manière simple pour obtenir ces points, imprimer en noir et blanc de l'échiquier et l'utilisation du cv::findChessboardCorners/cv::cornerSubPix fonctions de les extraire. Autour de 10-15 paires d'images des échiquiers devrait le faire.
Les matrices calculées par les fonctions de calibration peuvent être sauvegardés sur le disque de sorte que vous n'avez pas à répéter ce processus chaque fois que vous démarrez votre application. Vous obtenez bien des matrices ici qui vous permettent de créer une rectification de la carte (cv::stereoRectify/cv::initUndistortRectifyMap) qui peuvent ensuite être appliqués à vos images à l'aide de cv::reconfigurer. Vous bénéficiez également d'un joli appelé matrice Q, ce qui est un écart à la profondeur de la matrice.
La raison pour redimensionner vos images, une fois que le processus est complet pour une paire d'images (en supposant que votre étalonnage est correct), chaque pixel/objet dans une image peuvent être trouvés sur le même ligne dans l'autre image.
Il existe quelques façons dont vous pouvez aller à partir d'ici, en fonction du type de caractéristiques que vous recherchez dans l'image. Une façon est d'utiliser CVs stéréo correspondance fonctions, telles que la Stéréo de Bloc Correspondant ou Semi Mondial de Bloc Correspondant. Cela vous donnera une disparité carte pour l'ensemble de l'image qui peut être transformé pour les points 3D à l'aide de la Q de la matrice (cv::reprojectImageTo3D).
La chute de ceci est que moins il y a beaucoup d'informations de la texture dans l'image, le CV n'est pas vraiment très bons à la construction d'un réseau dense de disparité de la carte (vous obtiendrez des espaces où elle ne pouvait pas trouver la bonne disparité pour un pixel donné), donc une autre approche consiste à trouver les points que vous souhaitez adapter vous-même. Disons que vous avez trouvé la fonction/objet en x=40,y=110 dans l'image de gauche et x=22 dans l'image de droite (puisque les images sont rectifiées, ils devraient avoir la même valeur de y). La disparité est calculé comme d = 40 - 22 = 18.
Construire un cv::Point3f(x,y,d), dans notre cas (40,110,18). Trouver d'autres points intéressants de la même façon, puis de l'envoyer à tous les points de cv::perspectiveTransform (avec le Q de la matrice la matrice de transformation, essentiellement cette fonction est cv::reprojectImageTo3D mais pour éparses disparité des cartes), et la sortie sera de points dans un XYZ-le système de coordonnées avec la caméra de gauche au centre.
Je travaille toujours sur elle, donc je ne vais pas poster code source complet encore. Mais je vais vous donner un concept de solution.
Vous aurez besoin des données en entrée (pour les deux appareils):
Vous pouvez mesurer le dernier vous-même, en plaçant l'appareil sur un morceau de papier et le dessin de deux lignes et la mesure d'un angle entre ces lignes.
Les caméras n'ont pas à être aligné en quelque sorte, vous avez seulement besoin d'être en mesure de voir votre objet dans les deux caméras.
Maintenant calculer un vecteur à partir de chaque appareil photo de votre objet. Vous avez (X,Y) les coordonnées des pixels de l'objet de chaque caméra, et vous avez besoin de calculer un vecteur (X,Y,Z). Notez que dans le cas simple où l'objet est vu à droite dans le milieu de la caméra, la solution serait tout simplement (caméra.PointOfInterest - caméra.Position).
Une fois que vous avez les deux vecteurs pointant vers votre cible, les lignes définies par ces vecteurs devraient se croiser en un point dans un monde idéal. Dans le monde réel, ils ne seraient pas à cause de petites erreurs de mesure et de la résolution limitée de caméras. Donc, utiliser le lien ci-dessous pour calculer le vecteur de distance entre les deux lignes.
La Distance entre les deux lignes
Dans ce lien: P0 est votre première position de came, Q0 est votre deuxième position de came et u et v sont des vecteurs de départ à la position de la caméra et pointant vers votre cible.
Vous n'êtes pas intéressé à la distance réelle, qu'ils veulent pour calculer. Vous avez besoin du vecteur Wc - on peut supposer que l'objet est dans le milieu de Wc. Une fois que vous avez la position de votre objet dans l'espace 3D, vous obtenez également quelle que soit la distance que vous aimez.
Je vais poster le code source complet bientôt.
J'ai le code source pour la détection de visage humain et renvoie, non seulement la profondeur, mais également monde réel coordonnées avec caméra de gauche (ou à droite de la caméra, je ne me souviens pas) être à l'origine. Il est adapté à partir du code source à partir d'Apprentissage "OpenCV" et de se référer à certains sites web pour qu'il fonctionne. Le résultat est en général assez précis.