Comment utiliser OpenMV pour la mesure de distance
Tutoriel vidéo 10 - Mesure de distance et mesure de la taille d'un objet : https://singtown.com/learn/50001/
Tutoriel vidéo 33 - Mesure de distance optique ToF : https://singtown.com/learn/50539/
La première méthode :\ Utiliser apriltag, Apriltag peut effectuer un positionnement 3D. Pour une mise en œuvre spécifique, veuillez vous référer à notre tutoriel :\ http://book.openmv.cc/image/apriltag.html
La deuxième méthode :\ OpenMV utilise une caméra monoculaire. Si vous souhaitez mesurer une distance, vous devez sélectionner un objet de référence et utiliser le rapport de taille de cet objet de référence pour calculer la distance.
Cette section présente la deuxième méthode, comment calculer la distance entre la caméra et une balle de ping-pong à partir de la taille de la balle de ping-pong dans l'image de la caméra.
Comme chacun sait, plus la balle de ping-pong est éloignée de la caméra, plus sa taille dans la caméra est petite, alors quelle est la question ?\ Quelle est cette relation ?\ (Remarque : le problème de géométrie mathématique abordé ici ne concerne que la partie trigonométrie des mathématiques du lycée. Si vous ne souhaitez pas le lire, vous pouvez directement passer à la conclusion)
Pour simplifier le problème, regardons l'image :\

D'après la relation géométrique dans la caméra à gauche, on peut établir :

On a donc (Formule 1)

D'après la relation géométrique dans l'environnement réel à droite, on peut établir :

En substituant (Formule 1), on obtient (Formule de conclusion) :

Ce qui précède est la relation que nous voulions finalement connaître !\ Que signifie-t-elle ?\ Lm, à gauche du signe égal, est la longueur, et Bpix est le nombre de pixels occupés par la balle dans la caméra (pixels de diamètre). À droite du signe égal, Rm est le rayon réel de la balle, Apix est un pixel fixe, et a est la moitié de l'angle de vue.\ Donc ! Donc ! Donc ! Donc ! Donc ! Donc ! Donc !\ Cette formule nous indique :
实际长度和摄像头里的像素成反比
Simplifié
距离 = 一个常数/直径的像素
Bon, nous connaissons désormais la relation, et elle est si élégante et simple !\ Les étapes concrètes consistent d'abord à mesurer la valeur de cette constante. Il suffit de placer la balle à 10 cm de la caméra, d'imprimer la valeur en pixels du diamètre dans la caméra, puis de la multiplier pour obtenir la valeur de k !
Ensuite, distance = cette constante / pixels dans la caméra, c'est aussi simple que cela.
Voici le code d'OpenMV :
# Measure the distance
#
# This example shows off how to measure the distance through the size in imgage
# This example in particular looks for yellow pingpong ball.
import csi, image, time
csi0 = csi.CSI()
# For color tracking to work really well you should ideally be in a very, very,
# very, controlled enviroment where the lighting is constant...
yellow_threshold = ( 56, 83, 5, 57, 63, 80)
# You may need to tweak the above settings for tracking green things...
# Select an area in the Framebuffer to copy the color settings.
csi0.reset() # Initialize the camera sensor.
csi0.pixformat(csi.RGB565) # use RGB565.
csi0.framesize(csi.QQVGA) # use QQVGA for speed.
csi0.snapshot(frames=10) # Let new settings take affect.
csi0.auto_whitebal(False) # turn this off.
clock = time.clock() # Tracks FPS.
K=5000#the value should be measured
while(True):
clock.tick() # Track elapsed milliseconds between snapshots().
img = csi0.snapshot() # Take a picture and return the image.
blobs = img.find_blobs([yellow_threshold])
if len(blobs) == 1:
# Draw a rect around the blob.
b = blobs[0]
img.draw_rectangle(b[0:4]) # rect
img.draw_cross((b[5], b[6])) # cx, cy
Lm = (b[2]+b[3])/2
length = K/Lm
print(length)
#print(clock.fps()) # Note: Your OpenMV Cam runs about half as fast while
# connected to your computer. The FPS should increase once disconnected.
Voici le résultat obtenu, la distance est affichée via le port série.