使用M5StickV(UNIT-V)实现颜色捕捉与自动跟踪
本帖最后由 vany5921 于 2019-12-12 20:32 编辑简单介绍一下OpenMV,OpenMV在2017年初开始在国内逐渐流行起来,与Pixy对标,随着用户群体的不断增多和开源代码的不断迭代,有越来越多的用户对其进行了第三方移植,时至今日产品已经逐渐成熟,也出现了相对完整的中文教程。OpenMV基于micropython进行编程,使用起来不算复杂,但是API太多,也涉及到一些图像处理算法,所以想要玩好并不是那么容易的。下面简单编写部分代码来进行演示,纯新手可以查找openmv相关api说明。
https://www.bilibili.com/video/av79004175/
import sensor, image, time, lcd#导入相关的包,其中sensor与image是必要的,lcd与time可选
#print("Letting auto algorithms run. Don't put anything in front of the camera!")
lcd.init()#初始化lcd
lcd.rotation(2) #屏幕图像进行旋转
sensor.reset() #复位图像传感器
sensor.set_pixformat(sensor.RGB565) #设置颜色格式
sensor.set_framesize(sensor.QVGA)#设置图像大小
sensor.skip_frames(time = 2000)#跳过前两秒图像
clock = time.clock() #启动计时器
# 捕捉图像中心50x50像素的颜色阈值。
r = [(320//2)-(50//2), (240//2)-(50//2), 50, 50]
#print("Auto algorithms done. Hold the object you want to track in front of the camera in the box.")
#print("MAKE SURE THE COLOR OF THE OBJECT YOU WANT TO TRACK IS FULLY ENCLOSED BY THE BOX!")
for i in range(60):#显示60帧中心矩形作为提示
img = sensor.snapshot()
img.draw_rectangle(r)
lcd.display(img)
lcd.draw_string(10, 100, "Learning thresholds...") #屏幕进行文字提示,下面开始进行目标捕捉
threshold = # 设置颜色阈值
for i in range(60):#捕获60帧目标直方图计算阈值
img = sensor.snapshot()
hist = img.get_histogram(roi=r)
lo = hist.get_percentile(0.05) # 获取1%范围的直方图的CDF(根据需要调整)!
hi = hist.get_percentile(0.95) # 获取1%范围的直方图的CDF(根据需要调整)!
# 平均百分位值。
threshold = (threshold + lo.l_value()) // 2
threshold = (threshold + hi.l_value()) // 2
threshold = (threshold + lo.a_value()) // 2
threshold = (threshold + hi.a_value()) // 2
threshold = (threshold + lo.b_value()) // 2
threshold = (threshold + hi.b_value()) // 2
for blob in img.find_blobs(, pixels_threshold=50, area_threshold=50, merge=True, margin=2): #查找符合条件的色块(像素数和区域面积根据实际效果调整)
img.draw_rectangle(blob.rect()) #绘制符合条件区域
img.draw_cross(blob.cx(), blob.cy()) #绘制十字
img.draw_rectangle(r) #绘制50*50矩形
lcd.display(img) #屏幕显示
img.clear() #清屏
lcd.draw_string(0, 0, "Tracking colors...") #显示文字
def find_max(blobs): #定义查找满足条件的最大色块
max_size=0
for blob in blobs:
if blob*blob > max_size:
max_blob=blob
max_size = blob*blob
return max_blob
#根据前面计算的阈值来寻找跟踪目标
while(True):
img = sensor.snapshot() #捕获图像,
blobs = img.find_blobs(, pixels_threshold=50, area_threshold=50, merge=True, margin=2) #根据设定条件查找色块
if blobs:#查到后取出最大色块
max_blob = find_max(blobs)
img.draw_rectangle(max_blob.rect()) # 绘制最大色块
img.draw_cross(max_blob.cx(), max_blob.cy())#绘制十字
lcd.display(img)#屏幕进行显示
实用的例子
页:
[1]