Cómo usar OpenMV para medir distancias
Vídeo tutorial 10 - Medición de distancia y medición del tamaño de objetos: https://singtown.com/learn/50001/
Vídeo tutorial 33 - Medición óptica de distancia con ToF: https://singtown.com/learn/50539/
El primer método:\ Usando apriltag, Apriltag puede realizar un posicionamiento 3D. Para la implementación concreta, consulta nuestro tutorial:\ http://book.openmv.cc/image/apriltag.html
El segundo método:\ OpenMV utiliza una cámara monocular. Si quieres lograr la medición de distancia, necesitas seleccionar un objeto de referencia y usar la relación de tamaño del objeto de referencia para calcular la distancia.
Esta sección comparte el segundo método: cómo calcular la distancia entre la cámara y una pelota de ping pong a partir del tamaño de la pelota en la cámara.
Como todos sabemos, cuanto más lejos esté la pelota de ping pong de la cámara, menor será el tamaño de la pelota de ping pong en la cámara, así que la pregunta es:\ ¿cuál es exactamente esta relación?\ (Nota: el problema de geometría matemática aquí solo involucra la parte de funciones trigonométricas de las matemáticas de secundaria. Si no quieres leerlo, puedes ir directamente a la conclusión)
Para simplificar el problema, veamos la imagen:\

A partir de la relación geométrica en la cámara de la izquierda, podemos saber:

Así que tenemos (Fórmula 1)

A partir de la relación geométrica en el entorno real de la derecha, podemos saber:

Sustituyendo (Fórmula 1) obtenemos (Fórmula de conclusión):

¡Lo anterior es la relación que finalmente queríamos conocer!\ ¿Qué significa esto?\ Lm en el lado izquierdo de la igualdad es la longitud, y Bpix son los píxeles que ocupa la bola en la cámara (píxeles del diámetro). En el lado derecho de la igualdad, Rm es el radio real de la bola, Apix es un píxel fijo, y a es la mitad del ángulo de visión.\ ¡Así que! ¡Así que! ¡Así que! ¡Así que! ¡Así que! ¡Así que! ¡Así que!\ Esta fórmula nos dice:
实际长度和摄像头里的像素成反比
Simplificado:
距离 = 一个常数/直径的像素
Bien, ya conocemos la relación, ¡y es tan elegante y sencilla!\ Los pasos concretos consisten en medir primero el valor de esta constante. Sin más rodeos: primero coloca la bola a 10cm de la cámara, imprime el valor en píxeles del diámetro en la cámara, y luego multiplícalo para obtener el valor de k.
Entonces distancia = esta constante / píxeles en la cámara, así de fácil.
Aquí está el código de 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.
El resultado es este, la distancia se imprime a través del puerto serie.