openCV实现实时颜色识别:从基础检测到指定颜色区域提取

张开发
2026/4/13 23:00:23 15 分钟阅读

分享文章

openCV实现实时颜色识别:从基础检测到指定颜色区域提取
在计算机视觉领域颜色识别是一项基础且应用广泛的技术无论是工业质检、智能安防还是机器人视觉导航都能看到它的身影。本文将基于Python和OpenCV库分享两种实用的颜色识别实现方式——实时识别画面核心区域主颜色、提取画面中指定颜色的区域帮助大家快速掌握颜色识别的核心思路。一、核心原理HSV色彩空间RGB是我们最熟悉的色彩空间但它的颜色分布并不均匀且易受亮度影响。而HSV色相Hue、饱和度Saturation、明度Value色彩空间更贴合人眼对颜色的感知是颜色识别的首选• 色相H范围0-179代表颜色的种类如红色、绿色• 饱和度S范围0-255代表颜色的鲜艳程度• 明度V范围0-255代表颜色的明暗程度。我们只需为目标颜色定义H、S、V的范围就能精准筛选出对应颜色区域。二、实现1实时识别画面核心区域主颜色该方案会实时读取摄像头画面聚焦画面中心的矩形区域统计该区域的色相范围从而判断主颜色支持红、黄、绿、蓝识别。1. 完整代码import cv2 def get_color(img): # 存储核心区域的色相值 H [] color_name None # 统一调整画面尺寸方便后续定位核心区域 img cv2.resize(img, (640, 480)) # 转换为HSV色彩空间 HSV cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 绘制核心识别区域的矩形框280,180到360,260 cv2.rectangle(img, (280, 180), (360, 260), (0, 255, 0), 2) # 遍历核心区域的每个像素收集色相值 for i in range(280, 360): for j in range(180, 260): H.append(HSV[j, i][0]) # 计算色相的最大/最小值判断颜色 H_min min(H) H_max max(H) # 红色的色相范围分为两段0-10 和 156-179 if (H_min 0 and H_max 10) or (H_min 156 and H_max 179): 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(f核心区域主颜色{color_name}) return img, color_name # 打开摄像头0为默认摄像头 cap cv2.VideoCapture(0) # 实时读取画面 while True: _, frame cap.read() img, cal get_color(frame) # 显示处理后的画面 cv2.imshow(Color Recognition, img) # 按ESC键退出 if cv2.waitKey(1) 27: break # 释放资源 cap.release() cv2.destroyAllWindows()2. 代码解析1. cv2.resize统一画面尺寸为640x480避免不同摄像头分辨率导致核心区域位置偏移2. cv2.cvtColor将BGR格式OpenCV默认读取格式的画面转换为HSV3. cv2.rectangle绘制绿色矩形框直观显示核心识别区域4. 遍历核心区域像素收集每个像素的色相值HSV[j,i][0]5. 色相范围判断根据预定义的红、黄、绿、蓝色相范围确定核心区域主颜色。3. 运行效果运行代码后摄像头画面会弹出中心有绿色矩形框控制台会实时打印框内的主颜色按ESC键退出。三、实现2提取画面中指定颜色的区域该方案可筛选出画面中所有指定颜色的区域以棕色为例通过掩码mask实现颜色过滤最终输出仅保留目标颜色的画面。1. 完整代码import cv2 import numpy as np # 打开摄像头 cap cv2.VideoCapture(0) while True: try: ret, frame3 cap.read() # 转换为HSV色彩空间 hsv_image cv2.cvtColor(frame3, cv2.COLOR_BGR2HSV) # 定义棕色的HSV范围可根据实际需求调整 lower_brown np.array([35, 43, 46]) # 最小范围 upper_brown np.array([77, 255, 255]) # 最大范围 # 创建掩码符合范围的像素设为255白色否则为0黑色 mask cv2.inRange(hsv_image, lower_brown, upper_brown) # 按位与运算仅保留掩码中白色区域的原画面颜色 result cv2.bitwise_and(frame3, frame3, maskmask) # 显示掩码、原画面、过滤后的画面 cv2.imshow(mask, mask) cv2.imshow(Original Image, frame3) cv2.imshow(Color Filter Result, result) # 按ESC键退出 if cv2.waitKey(1) 27: break except: pass # 释放资源 cap.release() cv2.destroyAllWindows()2. 代码解析1. cv2.inRange根据定义的HSV范围生成掩码是颜色筛选的核心函数2. cv2.bitwise_and将原画面与掩码做按位与运算只有掩码为白色的区域会保留原画面颜色其余区域为黑色3. 多窗口显示方便对比掩码黑白轮廓、原画面、过滤后的效果。3. 自定义颜色范围若需识别其他颜色只需调整lower_xxx和upper_xxx的数值以下是常见颜色的HSV参考范围• 红色lowernp.array([0,43,46])uppernp.array([10,255,255]) 或 lowernp.array([156,43,46])uppernp.array([179,255,255])• 绿色lowernp.array([35,43,46])uppernp.array([77,255,255])• 蓝色lowernp.array([100,43,46])uppernp.array([124,255,255])• 黄色lowernp.array([26,43,46])uppernp.array([34,255,255])。四、扩展与优化1. 降噪处理实际场景中画面可能有噪点可在颜色筛选前添加高斯模糊frame3 cv2.GaussianBlur(frame3, (5, 5), 0)2. 多颜色同时识别定义多个颜色范围生成多个掩码后合并3. 颜色校准不同光线、摄像头会导致颜色偏差可增加手动校准环节动态调整HSV范围4. 识别结果可视化在画面上标注识别到的颜色名称提升交互性。五、总结本文基于OpenCV实现了两种实用的颜色识别方案核心是利用HSV色彩空间的特性通过定义颜色范围或统计色相分布实现颜色识别。这些基础方案可灵活扩展到更多场景比如• 智能分拣识别物料颜色并控制机械臂分拣• 交通灯识别辅助自动驾驶识别交通灯颜色• 互动投影识别指定颜色的物体位置并触发交互。

更多文章