OpenMV4 H7 PLUS摄像头颜色识别

使用OpenMV4 H7 PLUS摄像头进行红绿蓝三颜色的识别:

参考:

官网:https://book.openmv.cc
函数库:https://docs.singtown.com/micropython/zh/latest/openmvcam/library/omv.sensor.html?highlight=sensor#module-sensor
环境下载:https://openmv.io/pages/download

函数:

find_blobs函数:

通过find_blobs函数可以找到色块.我们来讨论一下,find_blobs的细节。

image.find_blobs(thresholds, roi=Auto, x_stride=2, y_stride=1, invert=False, area_threshold=10, pixels_threshold=10, merge=False, margin=0, threshold_cb=None, merge_cb=None)

这里的参数比较多。

thresholds是颜色的阈值,注意:这个参数是一个列表,可以包含多个颜色。如果你只需要一个颜色,那么在这个列表中只需要有一个颜色值,如果你想要多个颜色阈值,那这个列表就需要多个颜色阈值。注意:在返回的色块对象blob可以调用code方法,来判断是什么颜色的色块。

red = (xxx,xxx,xxx,xxx,xxx,xxx)
blue = (xxx,xxx,xxx,xxx,xxx,xxx)
yellow = (xxx,xxx,xxx,xxx,xxx,xxx)

img=sensor.snapshot()
red_blobs = img.find_blobs([red])

color_blobs = img.find_blobs([red,blue, yellow])

roi是“感兴趣区”。roi的格式是(x, y, w, h)的tupple元组:

x:ROI区域中左上角的x坐标
y:ROI区域中左上角的y坐标
w:ROI的宽度
h:ROI的高度

left_roi = [0,0,160,240]
blobs = img.find_blobs([red],roi=left_roi)

x_stride 就是查找的色块的x方向上最小宽度的像素,默认为2,如果你只想查找宽度10个像素以上的色块,那么就设置这个参数为10:
blobs = img.find_blobs([red],x_stride=10)

y_stride 就是查找的色块的y方向上最小宽度的像素,默认为1,如果你只想查找宽度5个像素以上的色块,那么就设置这个参数为5:
blobs = img.find_blobs([red],y_stride=5)

invert 反转阈值,把阈值以外的颜色作为阈值进行查找

area_threshold 面积阈值,如果色块被框起来的面积小于这个值,会被过滤掉

pixels_threshold 像素个数阈值,如果色块像素数量小于这个值,会被过滤掉

merge 合并,如果设置为True,那么合并所有重叠的blob为一个。
注意:这会合并所有的blob,无论是什么颜色的。如果你想混淆多种颜色的blob,只需要分别调用不同颜色阈值的find_blobs。

all_blobs = img.find_blobs([red,blue,yellow],merge=True)

red_blobs = img.find_blobs([red],merge=True)
blue_blobs = img.find_blobs([blue],merge=True)
yellow_blobs = img.find_blobs([yellow],merge=True)

margin 边界,如果设置为1,那么两个blobs如果间距1一个像素点,也会被合并。

颜色识别方式:

RGB

三原色的原理不是物理原因,而是由于人的生理原因造成的。人的眼睛内有几种辨别颜色的锥形感光细胞,分别对黄绿色、绿色和蓝紫色(或称紫罗兰色)的光最敏感(波长分别为564、534和420纳米)。

所以RGB经常用于显示器上,用来显示图片。

LAB

Lab颜色空间中,L亮度;a的正数代表红色,负端代表绿色;b的正数代表黄色,负端代表兰色。不像RGB和CMYK色彩空间,Lab颜色被设计来接近人类视觉。

因此L分量可以调整亮度对,修改a和b分量的输出色阶来做精确的颜色平衡。

注意:在OpenMV的查找色块的算法中,运用的就是这个LAB模式!

代码:

import sensor, image, time

#颜色识别LAB域值设定
red_threshold   = (30, 100, 15, 127, 15, 127)
green_threshold   = (20, 70, -127, -10, -64, 120)
blue_threshold   = (10, 80, -96, 32, -100, -20)

sensor.reset() #初始化摄像头
sensor.set_pixformat(sensor.RGB565) #彩色方式
sensor.set_framesize(sensor.LCD) #设置图像像素模式
sensor.skip_frames(time = 2000) # 设置一定时间让新的设置生效。在更改设置后,跳过一些帧,等待感光元件变稳定。
sensor.set_auto_gain(False) # 颜色跟踪必须关闭自动增益
sensor.set_auto_whitebal(False) #关闭白平衡。
sensor.set_auto_exposure(False,33333) #设置曝光,需要更改
# sensor.set_windowing((100,100)) #设置子分辨率

clock = time.clock() # 跟踪FPS帧率

def find_MaxBlob(colour_blobs):#获取找到颜色的最大值函数
    max_size = 0
    for blob in colour_blobs:
        if blob[2]*blob[3] > max_size: #blob[2]*blob[3]为面积
            max_Blob = blob
            max_size = blob[2]*blob[3]
    return max_Blob

while(True):
    clock.tick() # 追踪两个snapshots()之间经过的毫秒数.
    img = sensor.snapshot() # 拍一张照片并返回图像。 
    colour_blobs = img.find_blobs([red_threshold, green_threshold, blue_threshold], area_threshold=200)
    #area_threshold=200为面积阀值可根据目标自由设置
    
    #find_blobs(thresholds, invert=False, roi=Auto)
    #(1)thresholds为颜色阈值,是一个元组,需要用括号[ ]括起来。
    #(2)invert=1,反转颜色阈值,invert=False默认不反转。
    #(3)roi设置颜色识别的视野区域,roi是一个元组, roi = (x, y, w, h),代表从左上顶点(x,y)开始的宽为w高为h的矩形区域,roi不设置的话默认为整个图像视野。
    '''
        这个函数返回一个列表:
        [0]代表识别到的目标颜色区域左上顶点的x坐标,
        [1]代表左上顶点y坐标,
        [2]代表目标区域的宽,
        [3]代表目标区域的高,
        [4]代表目标区域像素点的个数,
        [5]代表目标区域的中心点x坐标,
        [6]代表目标区域中心点y坐标,
        [7]代表目标颜色区域的旋转角度(是弧度值,浮点型,列表其他元素是整型),
        [8]代表与此目标区域交叉的目标个数,
        [9]代表颜色的编号(它可以用来分辨这个区域是用哪个颜色阈值threshold识别出来的)。
    ''' 

    if colour_blobs: #如果识别到颜色
        max_Blob =  find_MaxBlob(colour_blobs)  #获取最大值
        img.draw_cross(max_Blob[5], max_Blob[6]) # cx, cy  画出中心
        print(max_Blob[8])   #获取颜色对应32位二进制转换的数值:1红、2绿、4蓝

    else:
        pass

        print("FPS %f" % clock.fps()) # 注意: 当连接电脑后,OpenMV会变成一半的速度。当不连接电脑,帧率会增加。
  • 12
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
引用\[1\]:硬件为正点原子战舰板,其实STM32103和STM32104都差不多一样用,摄像头为07725.(硬件都是小事,原理都一样) ①识别物体形状(目前矩形和圆形) ②识别物体颜色(颜色可以识别多种,(可调控)) ③可以一次识别多个物体(可调控) ④可以一次识别多个物体颜色 。 引用\[2\]:    daodanjishui物联网核心原创技术之注释最详细、代码最简单的STM32+摄像头+显示屏的颜色跟踪电路软硬件方案。    市面上有各种开源STM32+摄像头+显示屏构成颜色跟踪系统,但是有复杂的有简单的,如果想快速入门STM32带显示屏和摄像头的颜色跟踪,这个方案会给你一个快捷高效的方案。一、注释最详细、代码最简单的STM32+摄像头+显示屏的颜色跟踪电路软硬件方案是什么?。引用\[3\]:文章目录 STM32库函数开发系列文章目录前言一、注释最详细、代码最简单的STM32+摄像头+显示屏的颜色跟踪电路软硬件方案是什么?二、使用步骤1.准备硬件2.准备正点原子开源摄像头的代码3.准备阿莫论坛的颜色跟踪代码4.修改源码和组合源码(这部分原创) 三、运行与调试总结。 回答: STM32F1摄像头颜色识别是指使用STM32F1系列微控制器搭配摄像头和显示屏,通过编程实现对物体颜色的识别。可以使用正点原子战舰板或者其他类似的硬件,搭配07725摄像头进行颜色跟踪。这个方案注释详细,代码简单,适合快速入门STM32带显示屏和摄像头的颜色跟踪。可以实现识别物体形状(目前矩形和圆形)、识别物体颜色(可调控,可以识别多种颜色)、一次识别多个物体(可调控)以及一次识别多个物体颜色。具体的使用步骤包括准备硬件、准备正点原子开源摄像头的代码、准备阿莫论坛的颜色跟踪代码,然后进行源码的修改和组合,最后进行运行与调试。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [颜色识别 STM32摄像头 物体形状识别 图像处理 二值化](https://blog.csdn.net/weixin_42718050/article/details/105877048)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [注释最详细、代码最简单的STM32+摄像头+显示屏的颜色跟踪电路软硬件方案](https://blog.csdn.net/niruxi0401/article/details/119685347)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值