机器视觉:智能车大赛视觉组技术文档——OpenArt结合OpenMV实现色块检测
摘要: 色块检测是机器视觉中的基础技术,适用于目标定位与跟踪。相比YOLO,色块检测计算量小、帧率高(可达30FPS),但稳定性稍逊。OpenMV通过HSV/LAB颜色空间转换和阈值分割实现色块检测,其中HSV的色相(H)独立于光照,提升检测鲁棒性。操作步骤包括:图像采集→颜色空间转换→阈值分割→连通区域分析。OpenMV IDE内置阈值选择器可快速确定颜色范围,通过调整LAB参数使目标区域二值化
系列文章目录
机器视觉:智能车大赛视觉组技术文档——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. 色块检测的核心步骤
- 图像采集:通过摄像头获取实时图像;
- 颜色空间转换:将RGB图像转为HSV图像;
- 阈值分割:根据目标颜色的HSV范围,过滤出符合条件的像素(变为白色),其他像素变为黑色(得到二值化图像);
- 色块提取:对二值化图像进行连通区域分析,提取色块的中心坐标、宽高、面积等特征;
- 结果输出:通过屏幕显示、串口通信等方式输出色块信息,用于后续控制逻辑。
二、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")
代码解析
- 摄像头初始化:关闭自动增益和白平衡是关键——这两个功能会自动调整图像亮度和色偏,导致HSV值不稳定,影响检测精度。
- 色块查找:
image.find_blobs()是核心函数,返回符合条件的色块列表。通过调整area_threshold和pixels_threshold,可过滤掉小面积噪声(如反光点)。 - 结果可视化:
draw_rectangle()和draw_cross()用于在图像上标注色块,方便直观观察;同时打印色块的中心坐标、大小等信息,可用于后续控制(如让小车跟踪色块中心)。
效果演示

由于博主目前手上没有openart,所以找了一下之前本来想用色块检测的方案,这个方案是先去蓝色赛道的反阈值(就是并非选取蓝色赛道,而是过滤蓝色赛道),然后在非蓝色赛道的ROI里面在去非白色赛道来选取红色箱子。所以可以看到图中有两个框。
四、总结
本文从原理到实践,详解了如何用OpenMV实现色块检测:
- 基于LAB颜色空间的阈值分割是核心,能有效抵抗光照干扰;
- OpenMV阈值选择器是快速确定颜色范围的利器,大幅降低调试难度;
- 通过
find_blobs()函数可轻松提取色块特征,结合标注和数据输出,能快速对接实际应用。
希望本文能帮助你快速掌握OpenMV色块检测,在OpenArt的创意项目中实现更多有趣的交互功能!
更多推荐

所有评论(0)