系列文章目录

机器视觉:智能车大赛视觉组技术文档——OpenArt结合OpenMV实现色块检测
机器视觉:智能车大赛视觉组技术文档——用 YOLO3 Nano 实现目标检测并部署到 OpenART
机器视觉:智能车大赛视觉组技术文档——用eIQ工具高效训练分类模型
机器视觉:智能车大赛视觉组技术文档——第20届智能车比赛视觉组视觉模块多种思路分析

前言

在智能车比赛中是否需要用到色块检测需要根据具体情况来决定,一般来说yolo进行定位是会比色块检测更加稳定的,但是计算量较大帧率较低也是必然的,一般来说yolo在openart上面只能跑到15帧,而色块检测可以到二三十帧,所以是否应用色块检测需要根据具体的应用场景来决定。但是由于色块检测的难度是相对较低的,所以作为视觉入门教程是相当合适的。
在比赛之外,在机器视觉领域,色块检测也是一种基础且常用的技术——通过识别图像中特定颜色的区域,实现对目标物体的定位、跟踪或状态判断。无论是智能小车循迹、机械臂抓取目标,还是互动装置的触发响应,色块检测都扮演着重要角色。
本文将从原理出发,详解如何用OpenMV实现色块检测,并结合OpenArt的应用场景提供实践指南。

一、色块检测相关知识

1. 什么是色块检测?

色块检测(Color Blob Detection)是通过识别图像中颜色相近的连通区域(即“色块”),提取其位置、大小、形状等信息的技术。其核心逻辑是:先通过颜色阈值分割出目标颜色区域,再对区域进行形态学处理(如去噪、连通性分析),最终得到完整的色块特征

2. 为什么用HSV颜色空间?

在图像中,颜色通常以RGB(红、绿、蓝)格式存储,但RGB对光照变化敏感(比如同一物体在强光和弱光下的RGB值差异很大),不利于稳定检测。因此,OpenMV的色块检测通常基于HSV或者LAB颜色空间:

  • H(Hue):色相,代表颜色的种类(如红、绿、蓝),范围0-179(OpenMV中简化的取值);
  • S(Saturation):饱和度,代表颜色的鲜艳程度(0为灰色,255为纯色);
  • V(Value):明度,代表颜色的明亮程度(0为黑色,255为最亮)。

HSV的优势在于:H通道独立于光照强度(V通道),即使环境亮度变化,只要H值稳定,就能通过固定阈值锁定目标颜色,大幅提升检测稳定性。

3. 色块检测的核心步骤

  1. 图像采集:通过摄像头获取实时图像;
  2. 颜色空间转换:将RGB图像转为HSV图像;
  3. 阈值分割:根据目标颜色的HSV范围,过滤出符合条件的像素(变为白色),其他像素变为黑色(得到二值化图像);
  4. 色块提取:对二值化图像进行连通区域分析,提取色块的中心坐标、宽高、面积等特征;
  5. 结果输出:通过屏幕显示、串口通信等方式输出色块信息,用于后续控制逻辑。

二、OpenMV阈值选择器:快速确定颜色范围

要实现色块检测,首先需要确定目标颜色的HSV阈值(即H、S、V的最小值和最大值)。OpenMV IDE内置的“阈值选择器”工具可以直观地帮我们完成这一步,具体操作如下:

1. 准备工作

  • 连接OpenMV摄像头到电脑,打开OpenMV IDE;
  • 确保摄像头正常工作(可通过IDE左侧“连接”按钮查看实时画面)。

2. 拍摄样本图像

在IDE中运行一段简单的预览代码,让摄像头对准目标颜色物体(如红色小球),获取包含目标的图像:

import sensor, image, time

sensor.reset()                      # 重置摄像头
sensor.set_pixformat(sensor.RGB565) # 设置像素格式为RGB565(节省内存)
sensor.set_framesize(sensor.QVGA)   # 设置分辨率为QVGA (320x240)
sensor.skip_frames(time = 2000)     # 跳过2秒,等待摄像头稳定
clock = time.clock()                # 初始化时钟

while(True):
    clock.tick()
    img = sensor.snapshot()         # 拍摄一帧图像
    print(clock.fps())              # 打印帧率

运行后,IDE右侧会显示实时画面,调整摄像头角度,让目标颜色清晰出现在画面中。

3. 打开阈值选择器

点击 IDE 顶部菜单栏的「Tools」→「Machine Vision」→「Threshold Editor」,打开阈值选择器窗口:

在这里插入图片描述
窗口左侧为原始图像,右侧为二值化预览(符合阈值的区域显示为白色);
下方滑块对应 LAB 的 6 个参数:LMin、LMax、AMin、AMax、BMin、BMax。或者是灰度的最大值或最小值
可以在图中红色框的地方进行切换
在这里插入图片描述

4. 调整阈值参数

  • 先点击右侧预览窗口中的目标颜色区域,阈值选择器会自动填充初始HSV范围;
  • 拖动滑块微调参数,直到右侧预览中只有目标颜色区域为白色,其他区域为黑色(可勾选“Inverse”反向过滤,适合背景为目标颜色的场景);

在这里插入图片描述

5. 保存阈值

调整完成后,点击阈值选择器底部的「Copy Threshold」,即可复制阈值参数(格式为(HMin, SMin, VMin, HMax, SMax, VMax)),用于后续代码开发。

(4, 84, 10, 74, -15, 64)

需要注意的是,色块检测非常依赖于场景的光源,切换场景的时候最好能重新进行一次阈值选择

三、OpenMV色块检测代码实现

结合上述阈值,我们可以编写完整的色块检测代码,实现实时识别并标注目标色块。以下是一个示例(以检测红色色块为例):

完整代码

import sensor, image, time

# 初始化摄像头
sensor.reset()
sensor.set_pixformat(sensor.RGB565)  # 像素格式:RGB565(支持颜色识别)
sensor.set_framesize(sensor.QVGA)    # 分辨率:320x240(平衡速度与精度)
sensor.skip_frames(time=2000)        # 等待摄像头稳定
sensor.set_auto_gain(False)          # 关闭自动增益(避免颜色值波动)
sensor.set_auto_whitebal(False)      # 关闭自动白平衡(确保颜色稳定)
clock = time.clock()

# 目标颜色的HSV阈值(通过阈值选择器获取,此处以红色为例)
red_threshold = (30, 100, 100, 160, 100, 100)  # 示例阈值,需根据实际调整

while True:
    clock.tick()
    img = sensor.snapshot()  # 获取一帧图像

    # 查找符合阈值的色块
    # 参数说明:
    # - thresholds:颜色阈值
    # - x_stride/y_stride:扫描步长(越大速度越快,精度越低)
    # - area_threshold:最小色块面积(过滤小噪声)
    # - pixels_threshold:最小像素数(同上)
    blobs = img.find_blobs([red_threshold], x_stride=5, y_stride=5,
                           area_threshold=100, pixels_threshold=100)

    # 遍历所有找到的色块
    for blob in blobs:
        # 在图像上绘制色块边界框(红色,线宽2)
        img.draw_rectangle(blob.rect(), color=(255, 0, 0), thickness=2)
        # 在色块中心绘制十字(绿色,线宽2)
        img.draw_cross(blob.cx(), blob.cy(), color=(0, 255, 0), thickness=2)
        # 打印色块信息(中心坐标、宽高、面积)
        print(f"中心坐标:({blob.cx()}, {blob.cy()}),宽高:{blob.w()}x{blob.h()},面积:{blob.area()}")

    # 打印帧率
    print(f"帧率:{clock.fps():.2f} FPS")

代码解析

  1. 摄像头初始化:关闭自动增益和白平衡是关键——这两个功能会自动调整图像亮度和色偏,导致HSV值不稳定,影响检测精度。
  2. 色块查找image.find_blobs()是核心函数,返回符合条件的色块列表。通过调整area_thresholdpixels_threshold,可过滤掉小面积噪声(如反光点)。
  3. 结果可视化draw_rectangle()draw_cross()用于在图像上标注色块,方便直观观察;同时打印色块的中心坐标、大小等信息,可用于后续控制(如让小车跟踪色块中心)。

效果演示

在这里插入图片描述
由于博主目前手上没有openart,所以找了一下之前本来想用色块检测的方案,这个方案是先去蓝色赛道的反阈值(就是并非选取蓝色赛道,而是过滤蓝色赛道),然后在非蓝色赛道的ROI里面在去非白色赛道来选取红色箱子。所以可以看到图中有两个框。

四、总结

本文从原理到实践,详解了如何用OpenMV实现色块检测:

  • 基于LAB颜色空间的阈值分割是核心,能有效抵抗光照干扰;
  • OpenMV阈值选择器是快速确定颜色范围的利器,大幅降低调试难度;
  • 通过find_blobs()函数可轻松提取色块特征,结合标注和数据输出,能快速对接实际应用。

希望本文能帮助你快速掌握OpenMV色块检测,在OpenArt的创意项目中实现更多有趣的交互功能!

Logo

立足具身智能前沿赛道,致力于搭建全球化、开源化、全栈式技术交流与实践共创平台。

更多推荐