web-dev-qa-db-fra.com

OpenCV: Comment calculer la distance entre la caméra et l'objet en utilisant l'image?

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?

33
swapna

Comment calculer la distance étant donné un objet de taille connue

Vous devez savoir l'une des 2 choses à l'avance

  • Distance focale (en mm et pixels par mm)
  • Taille physique du capteur d'image (pour calculer les pixels par mm)

Je vais utiliser la distance focale car je ne veux pas google pour la fiche technique du capteur.

Calibrer la caméra

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 .

Matrice de calibrage de la caméra (caméra arrière iPhone 5S)

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]
  • f_x = 2803
  • f_y = 2805
  • c_x = 1637
  • c_y = 1271

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.

Pixels par millimètre

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 

Taille de l'objet en pixels

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

Petite ride

L'objet mesure 41 pixels dans une vidéo prise avec la caméra à 640 x 480.

Convertir px/mm dans la résolution inférieure

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.

Formule de distance

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.

Approche de triangles similaires

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.

45

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.

1
Abhishek Thakur
  1. Pour obtenir une cartographie entre le monde réel et la caméra sans aucune information préalable de la caméra, vous devez calibrer la caméra ... ici vous pouvez trouver une théorie
  2. Pour calculer la profondeur, c'est-à-dire la distance entre la caméra et l'objet, vous avez besoin d'au moins deux images du même objet prises par deux caméras différentes ... ce qui est communément appelé la technique de vision stéréo.
0
rotating_image