Je suis novice en OpenCV. Je travaille avec la formule suivante pour calculer la distance:
distance to object (mm) = focal length (mm) * real height of the object (mm) * image height (pixels)
----------------------------------------------------------------
object height (pixels) * sensor height (mm)
Y a-t-il une fonction dans OpenCV qui peut déterminer la distance de l'objet? Sinon, une référence à l'exemple de code?
Vous devez savoir l'une des 2 choses à l'avance
Je vais utiliser la distance focale car je ne veux pas google pour la fiche technique du capteur.
Utilisez l'OpenCV calibrate.py
outil et le modèle d'échiquier PNG fourni dans le code source pour générer une matrice d'étalonnage. J'ai pris environ 2 douzaines de photos de l'échiquier sous autant d'angles que possible et j'ai exporté les fichiers sur mon Mac. Pour plus de détails, vérifiez Documents d'étalonnage des caméras d'OpenCV .
RMS: 1.13707201375
camera matrix:
[[ 2.80360356e+03 0.00000000e+00 1.63679133e+03]
[ 0.00000000e+00 2.80521893e+03 1.27078235e+03]
[ 0.00000000e+00 0.00000000e+00 1.00000000e+00]]
distortion coefficients: [ 0.03716712 0.29130959 0.00289784 -0.00262589 -1.73944359]
En vérifiant les détails de la série de photos d'échiquier que vous avez prises, vous trouverez la résolution native (3264x2448) des photos et dans leur JPEG en-têtes EXIF , visible dans iPhoto, vous pouvez trouver la valeur de la distance focale ( 4,15 mm). Ces éléments doivent varier en fonction de l'appareil photo.
Nous devons connaître les pixels par millimètre (px/mm) sur le capteur d'image. De la page sur résection de la caméra nous savons que f_x et f_y sont des longueurs focales multipliées par un facteur d'échelle.
f_x = f * m_x
f_y = f * m_y
Puisque nous avons deux des variables pour chaque formule, nous pouvons résoudre pour m_x et m_y. Je viens en moyenne 2803 et 2805 pour obtenir 2804.
m = 2804px / 4.15mm = 676px/mm
J'ai utilisé OpenCV (C++) pour saisir le Rotated Rect des points et déterminé la taille de l'objet à 41px. Remarquez que j'ai déjà récupéré les coins de l'objet et je demande au rectangle englobant sa taille.
cv::RotatedRect box = cv::minAreaRect(cv::Mat(points));
L'objet mesure 41 pixels dans une vidéo prise avec la caméra à 640 x 480.
3264/676 = 640/x
x = 133 px/mm
Donc, étant donné 41px/133px/mm, nous voyons que la taille de l'objet sur le capteur d'image est de 0,308 mm.
distance_mm = object_real_world_mm * focal-length_mm / object_image_sensor_mm
distance_mm = 70mm * 4.15mm / .308mm
distance_mm = 943mm
Cela se trouve être assez bon. J'ai mesuré 910 mm et avec quelques améliorations, je peux probablement réduire l'erreur.
Les commentaires sont appréciés.
Adrian chez pyimagesearch.com
démontré ne technique différente utilisant des triangles similaires . Nous avons discuté de ce sujet au préalable et il a adopté l'approche triangulaire similaire et j'ai fait les intrinsèques de la caméra.
il n'y a pas une telle fonction disponible en opencv pour calculer la distance entre l'objet et la caméra. voir ceci: Trouver la distance de la caméra à un objet de taille connue
Vous devez savoir que les paramètres dépendent de la caméra et changeront si la caméra est changée.