使用M5StickV(UNIT-V)实现颜色捕捉与自动跟踪-Arduino中文社区 - Powered by Discuz! Archiver

vany5921 发表于 2019-12-12 20:15

使用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)#屏幕进行显示

laai 发表于 2020-2-22 01:37

实用的例子
页: [1]
查看完整版本: 使用M5StickV(UNIT-V)实现颜色捕捉与自动跟踪