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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2031|回复: 1

使用M5StickV(UNIT-V)实现颜色捕捉与自动跟踪

[复制链接]
发表于 2019-12-12 20:15 | 显示全部楼层 |阅读模式
本帖最后由 vany5921 于 2019-12-12 20:32 编辑

    简单介绍一下OpenMV,OpenMV在2017年初开始在国内逐渐流行起来,与Pixy对标,随着用户群体的不断增多和开源代码的不断迭代,有越来越多的用户对其进行了第三方移植,时至今日产品已经逐渐成熟,也出现了相对完整的中文教程。OpenMV基于micropython进行编程,使用起来不算复杂,但是API太多,也涉及到一些图像处理算法,所以想要玩好并不是那么容易的。下面简单编写部分代码来进行演示,纯新手可以查找openmv相关api说明。

    [mw_shl_code=python,true]
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 = [0, 0, 0, 0, 0, 0]  # 设置颜色阈值
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[0] = (threshold[0] + lo.l_value()) // 2
    threshold[1] = (threshold[1] + hi.l_value()) // 2
    threshold[2] = (threshold[2] + lo.a_value()) // 2
    threshold[3] = (threshold[3] + hi.a_value()) // 2
    threshold[4] = (threshold[4] + lo.b_value()) // 2
    threshold[5] = (threshold[5] + hi.b_value()) // 2
    for blob in img.find_blobs([threshold], 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[2]*blob[3] > max_size:
            max_blob=blob
            max_size = blob[2]*blob[3]
    return max_blob


#根据前面计算的阈值来寻找跟踪目标
while(True):   
    img = sensor.snapshot() #捕获图像,
    blobs = img.find_blobs([threshold], 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)  #屏幕进行显示
[/mw_shl_code]
发表于 2020-2-22 01:37 来自手机 | 显示全部楼层
实用的例子
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-27 17:33 , Processed in 0.075537 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表