一、引言
今天我将介绍一个使用python和opencv库实现的实时颜色识别系统。这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红、黄、绿、蓝)。这种技术在机器人视觉、自动化检测和交互式应用中有着广泛的应用前景。
二、系统概述
该系统主要包含以下几个功能:
- 实时视频捕捉
- 在视频帧中划定特定检测区域
- 将检测区域转换为hsv色彩空间
- 分析区域内的色调(h)值
- 根据h值范围判断颜色类型
- 实时显示结果
三、代码解析
1. 导入库
import cv2
我们只需要导入opencv库,它提供了强大的计算机视觉功能,包括图像处理和视频捕捉。
2. 颜色识别函数
def get_color(img): h = [] color_name = none img = cv2.resize(img,(640,400),) # 将彩色图转换为hsv hsv = cv2.cvtcolor(img,cv2.color_bgr2hsv) # 画矩形框 cv2.rectangle(img,(280,180),(360,260),(0,255,0),2) # 依次取出每行每列的h,s,v值放入容器中 for i in range(280,360): for j in range(180,260): h.append(hsv[j,i][0]) # 分别计算出h,s,v的最大最小 h_min = min(h);h_max = max(h) # 判断颜色 if h_min >= 0 and h_max <= 10 or h_min >= 156 and h_max <= 180: color_name='red' elif h_min >= 26 and h_max <= 34 : color_name='yellow' elif h_min >= 35 and h_max <= 77 : color_name='green' elif h_min >= 100 and h_max <= 124 : color_name='blue' print(color_name) return img,color_name
函数功能详解:
图像预处理:
- 首先将输入图像调整为固定尺寸(640×400),确保处理一致性
色彩空间转换:
- 将bgr格式转换为hsv格式,hsv色彩空间更适合颜色识别
- h(色调):表示颜色类型
- s(饱和度):表示颜色的纯度
- v(亮度):表示颜色的明暗程度
检测区域标记:
- 在图像上绘制一个绿色矩形框(280,180)到(360,260),标识检测区域
数据采集:
- 遍历检测区域内每个像素点,收集所有h值
颜色判断:
- 计算区域内h值的最小和最大值
- 根据h值范围判断颜色:
- 红色:0-10或156-180
- 黄色:26-34
- 绿色:35-77
- 蓝色:100-124
3. 主程序循环
cap = cv2.videocapture(0) while 1: _,frame=cap.read() img,cal = get_color(frame) cv2.imshow('',img) if cv2.waitkey(1) == 27: break
视频捕捉初始化:
- 创建videocapture对象,参数0表示使用默认摄像头
主循环:
- 不断读取视频帧
- 调用get_color函数处理每一帧
- 显示处理后的图像
- 按esc键(ascii 27)退出程序
四、hsv色彩空间详解
为什么选择hsv而不是rgb进行颜色识别?
rgb的局限性:
- rgb三个通道都与亮度相关
- 对光照变化敏感
- 颜色判断需要同时考虑三个通道
hsv的优势:
- 将颜色信息(h)与亮度(v)、饱和度(s)分离
- 对光照变化有一定鲁棒性
- 颜色判断主要依据h通道
五、颜色范围设定
opencv中hsv的范围:
- h: 0-180 (通常色彩空间为0-360,但opencv使用8位存储,所以除以2)
- s: 0-255
- v: 0-255
常见颜色h值范围:
- 红色:0-10和170-180
- 橙色:11-25
- 黄色:26-34
- 绿色:35-77
- 蓝色:100-124
- 紫色:125-155
可对比如下的颜色范围图
六、系统优化建议
增加饱和度(s)和亮度(v)的过滤:
- 可以排除低饱和度(接近灰色)或低亮度(接近黑色)的区域
使用均值而非极值:
- 当前使用min/max容易受噪声影响,可改为计算平均值
扩大检测区域:
- 当前区域较小(80×80像素),可以适当扩大
添加更多颜色识别:
- 如橙色、紫色等
优化性能:
- 当前双重循环效率不高,可以使用numpy进行向量化操作
七、完整代码
import cv2 def get_color(img): h = [] color_name = none img = cv2.resize(img,(640,400),) # 将彩色图转换为hsv hsv = cv2.cvtcolor(img,cv2.color_bgr2hsv) # 画矩形框 cv2.rectangle(img,(280,180),(360,260),(0,255,0),2) # 依次取出每行每列的h,s,v值放入容器中 for i in range(280,360): for j in range(180,260): h.append(hsv[j,i][0]) # 分别计算出h,s,v的最大最小 h_min = min(h);h_max = max(h) # 判断颜色 if h_min >= 0 and h_max <= 10 or h_min >= 156 and h_max <= 180: color_name='red' elif h_min >= 26 and h_max <= 34 : color_name='yellow' elif h_min >= 35 and h_max <= 77 : color_name='green' elif h_min >= 100 and h_max <= 124 : color_name='blue' print(color_name) return img,color_name cap = cv2.videocapture(0) while 1: _,frame=cap.read() img,cal = get_color(frame) cv2.imshow('',img) if cv2.waitkey(1) == 27: break
八、总结
本文介绍了一个基于opencv的实时颜色识别系统,通过hsv色彩空间转换和色调范围判断实现了基本颜色识别功能。该系统可以作为更复杂计算机视觉项目的基础,通过进一步优化和扩展,能够满足各种实际应用需求。
到此这篇关于opencv实现实时颜色检测的示例的文章就介绍到这了,更多相关opencv 实时颜色检测内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论