一、Open MV的两种测距方法
1,使用AprilTag标签,它可以提供直接的位置信息
①April Tag是一种特殊的标签,形状类似于二维码,能够直接提供与摄像头距离相关的数据,测距方便。
②但局限于必须在物体上黏贴April Tag标签
2,利用物体的像素数进行测距
①通过固定大小的物体,在特定距离时测量Open MV看到的像素点数,计算出与距离的关系(反比关系)。确定物体与Open MV之间的比例关系(k值)便可计算距离或者大小
②这种测距方式的优点是可以精确地测量已知尺寸的物体,而其缺点是在不同的物体或环境条件下可能需要调整比例系数。
二、如何确定比例系数k
距离 = k值/直径的像素
# 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 sensor, image, time
# For color tracking to work really well you should ideally be in a very, very,
# very, controlled enviroment where the lighting is constant...
green_threshold = ( 76, 96, -110, -30, 8, 66)
# You may need to tweak the above settings for tracking green things...
# Select an area in the Framebuffer to copy the color settings.
sensor.reset() # Initialize the camera sensor.
sensor.set_pixformat(sensor.RGB565) # use RGB565.
sensor.set_framesize(sensor.QQVGA) # use QQVGA for speed.
sensor.skip_frames(10) # Let new settings take affect.
sensor.set_auto_whitebal(False) # turn this off.
clock = time.clock() # Tracks FPS.
K=450#the value should be measured
while(True):
clock.tick() # Track elapsed milliseconds between snapshots().
img = sensor.snapshot() # Take a picture and return the image.
blobs = img.find_blobs([green_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(Lm)
#print(clock.fps()) # Note: Your OpenMV Cam runs about half as fast while
# connected to your computer. The FPS should increase once disconnected.
green_threshold = ( 76, 96, -110, -30, 8, 66)
↑识别的物体的颜色
print(Lm)
↑得到物体的像素数
需要自己提前设定好物体与Open MV的距离并摆好
如图,我的距离设定的是20cm,直径像素输出中可以看出为22.5。
计算出k为450
三、测距的代码
# 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 sensor, image, time
# For color tracking to work really well you should ideally be in a very, very,
# very, controlled enviroment where the lighting is constant...
green_threshold = ( 76, 96, -110, -30, 8, 66)
# You may need to tweak the above settings for tracking green things...
# Select an area in the Framebuffer to copy the color settings.
sensor.reset() # Initialize the camera sensor.
sensor.set_pixformat(sensor.RGB565) # use RGB565.
sensor.set_framesize(sensor.QQVGA) # use QQVGA for speed.
sensor.skip_frames(10) # Let new settings take affect.
sensor.set_auto_whitebal(False) # turn this off.
clock = time.clock() # Tracks FPS.
K=450 #the value should be measured
while(True):
clock.tick() # Track elapsed milliseconds between snapshots().
img = sensor.snapshot() # Take a picture and return the image.
blobs = img.find_blobs([green_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.
四、 测量圆形物体大小和距离的代码
实际大小=k2/直径的像素
K2=4/22.5=0.18
# 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 sensor, image, time
# For color tracking to work really well you should ideally be in a very, very,
# very, controlled enviroment where the lighting is constant...
green_threshold = ( 76, 96, -110, -30, 8, 66)
# You may need to tweak the above settings for tracking green things...
# Select an area in the Framebuffer to copy the color settings.
sensor.reset() # Initialize the camera sensor.
sensor.set_pixformat(sensor.RGB565) # use RGB565.
sensor.set_framesize(sensor.QQVGA) # use QQVGA for speed.
sensor.skip_frames(10) # Let new settings take affect.
sensor.set_auto_whitebal(False) # turn this off.
clock = time.clock() # Tracks FPS.
K=450 #the value should be measured
#实际大小=k2*直径的像素 K = 4cm/25
K2=0.18
while(True):
clock.tick() # Track elapsed milliseconds between snapshots().
img = sensor.snapshot() # Take a picture and return the image.
blobs = img.find_blobs([green_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(Lm)
size = K2*Lm
print(size)
#print(clock.fps()) # Note: Your OpenMV Cam runs about half as fast while
# connected to your computer. The FPS should increase once disconnected.
五、 测量矩形物体大小和距离的代码
在这里,我使用了红色的矩形块,因此将颜色代码稍作了修改,并输出了矩形的长宽
在代码中我也加入K2,用以确定矩形物体的长和宽
# 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 sensor, image, time
# For color tracking to work really well you should ideally be in a very, very,
# very, controlled enviroment where the lighting is constant...
green_threshold = ( 76, 96, -110, -30, 8, 66)
red_threshold = (30, 100 , 15, 127, 15, 127)
# You may need to tweak the above settings for tracking green things...
# Select an area in the Framebuffer to copy the color settings.
sensor.reset() # Initialize the camera sensor.
sensor.set_pixformat(sensor.RGB565) # use RGB565.
sensor.set_framesize(sensor.QQVGA) # use QQVGA for speed.
sensor.skip_frames(10) # Let new settings take affect.
sensor.set_auto_whitebal(False) # turn this off.
clock = time.clock() # Tracks FPS.
K=450 #the value should be measured
#实际大小=k2*直径的像素 K = 4cm/25
K2=0.18
while(True):
clock.tick() # Track elapsed milliseconds between snapshots().
img = sensor.snapshot() # Take a picture and return the image.
blobs = img.find_blobs([red_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(Lm)
size = K2*Lm
#print(size)
h = K2*b[3]
w = K2*b[2]
print("高: %s cm, 宽 %s cm" % ( h, w))
#print(clock.fps()) # Note: Your OpenMV Cam runs about half as fast while
# connected to your computer. The FPS should increase once disconnected.
六、总结
Open MV的两种测距方法,分别是利用April Tag标签和基于物体像素数的方法。其中,April Tag标签方法简单直观,但物体必须贴上对应的标签。基于像素数的方法更为灵活,通过测量固定大小物体在不同距离下的像素点数,计算出与物体距离的固定比例关系,适用于多种物体的测距和大小测量。核心观点是通过数学模型将物体的像素数转换为实际距离或大小信息,实现非接触式测量。