目录
[1. 库导入](#1. 库导入)
[2. 摄像头初始化](#2. 摄像头初始化)
[3. 画面循环读取与预处理](#3. 画面循环读取与预处理)
[4. HSV 颜色阈值配置](#4. HSV 颜色阈值配置)
[5. 掩码生成与图像抠图](#5. 掩码生成与图像抠图)
[6. 窗口显示与按键退出](#6. 窗口显示与按键退出)
[7. 异常捕获与资源释放](#7. 异常捕获与资源释放)
[四、HSV 常用颜色阈值对照表(OpenCV 标准)](#四、HSV 常用颜色阈值对照表(OpenCV 标准))
[1. 安装依赖库](#1. 安装依赖库)
[2. 运行说明](#2. 运行说明)
一、项目简介
本文使用 Python+OpenCV 实现摄像头实时画面的指定颜色提取,核心依靠HSV 色彩空间 与cv2.inRange掩码筛选,可精准分离画面中目标色块;新增画面镜像翻转适配前置摄像头,代码自带异常捕获防止摄像头读取崩溃,按下 ESC 键即可退出程序。
实现效果
- 实时摄像头画面左右镜像翻转,符合人眼观察习惯
- 输出三张窗口:原图、颜色掩码 mask、仅保留目标色的效果图
- 通过修改 HSV 阈值数组,可快速切换识别红 / 黄 / 绿 / 蓝等任意颜色
二、完整代码
python
import cv2
import numpy as np
# 打开默认摄像头
cap = cv2.VideoCapture(0)
while True:
try:
# 读取一帧画面
ret, frame3 = cap.read()
# 画面水平翻转,解决前置镜像反像问题
frame3 = cv2.flip(frame3, flipCode=1)
# BGR图像转换为HSV色彩空间,用于颜色筛选
hsv_image = cv2.cvtColor(frame3, cv2.COLOR_BGR2HSV)
# ----------------------HSV颜色阈值配置区----------------------
# 蓝色HSV上下限 H:100~124 S:43~255 V:46~255
lower_brown = np.array([100, 43, 46])
upper_brown = np.array([124, 255, 255])
# 棕色/红色备用阈值,取消注释即可切换识别红色
# lower_brown = np.array([10, 30, 30])
# upper_brown = np.array([30, 255, 255])
# ------------------------------------------------------------
# 生成掩码mask:符合HSV区间像素=白色(255),其余黑色(0)
mask = cv2.inRange(hsv_image, lower_brown, upper_brown)
# 按位与运算,利用mask抠出原图中的目标颜色
result = cv2.bitwise_and(frame3, frame3, mask=mask)
# 窗口展示
cv2.imshow('mask', mask) # 黑白掩码图
cv2.imshow('Filtered Image1', frame3) # 翻转后的原始摄像头画面
cv2.imshow('result', result) # 提取后的目标色块图
# 等待100ms按键,ESC键(27)退出循环
if cv2.waitKey(100) == 27:
break
except Exception as e:
# 捕获摄像头读取异常,避免程序直接崩溃
pass
# 释放摄像头硬件资源,销毁所有OpenCV窗口
cap.release()
cv2.destroyAllWindows()
运行结果如下:

三、逐模块代码解析
1. 库导入
import cv2
import numpy as np
cv2:OpenCV 计算机视觉库,负责摄像头读取、图像转换、窗口显示、掩码运算numpy:数值数组库,HSV 上下限阈值必须通过 np.array 数组存储
2. 摄像头初始化
python
cap = cv2.VideoCapture(0)
参数0代表调用电脑内置默认摄像头;外接 USB 摄像头可尝试1、2。
3. 画面循环读取与预处理
python
ret, frame3 = cap.read()
frame3 = cv2.flip(frame3, flipCode=1)
hsv_image = cv2.cvtColor(frame3, cv2.COLOR_BGR2HSV)
cap.read():读取摄像头一帧图像,ret为读取成功标记,frame3是图像矩阵cv2.flip(frame3, 1):水平翻转画面,解决笔记本前置摄像头左右颠倒问题- flipCode=0:垂直翻转;flipCode=1:水平翻转;flipCode=-1:水平 + 垂直翻转
cv2.COLOR_BGR2HSV:OpenCV 默认图像格式为 BGR,转换 HSV 分离色相、饱和度、亮度,降低光照对颜色识别的干扰
4. HSV 颜色阈值配置
python
lower_brown = np.array([100, 43, 46])
upper_brown = np.array([124, 255, 255])
数组格式:[H, S, V]
- H(色相 0~180):决定基础颜色,当前 100-124 对应蓝色
- S(饱和度 0~255):43 过滤低饱和灰黑色杂色
- V(明度 0~255):46 过滤阴影暗部干扰 注释行是红色阈值,取消注释、注释蓝色阈值即可识别红色。
5. 掩码生成与图像抠图
python
运行
python
mask = cv2.inRange(hsv_image, lower_brown, upper_brown)
result = cv2.bitwise_and(frame3, frame3, mask=mask)
cv2.inRange()核心筛选函数:遍历 HSV 图像每个像素,在阈值内设为 255(白色),超出设为 0(黑色),输出黑白掩码maskcv2.bitwise_and()按位与运算:以 mask 为遮罩,仅保留白色区域对应的原图彩色像素,黑色区域全部置黑,最终得到只含目标颜色的效果图
6. 窗口显示与按键退出
python
cv2.imshow('mask', mask)
cv2.imshow('Filtered Image1', frame3)
cv2.imshow('result', result)
if cv2.waitKey(100) == 27:
break
cv2.imshow(窗口名, 图像):弹出窗口实时渲染图像cv2.waitKey(100):等待 100ms 检测键盘输入,降低画面刷新频率;27是 ESC 按键 ASCII 码,按下跳出循环
7. 异常捕获与资源释放
python
except:
pass
cap.release()
cv2.destroyAllWindows()
try-except:摄像头读取失败、画面丢失时静默跳过,防止程序闪退cap.release():关闭摄像头硬件,释放占用cv2.destroyAllWindows():销毁所有 OpenCV 图像窗口,释放内存
四、HSV 常用颜色阈值对照表(OpenCV 标准)
表格
| 颜色 | H 最小值 | H 最大值 | S 下限 | V 下限 |
|---|---|---|---|---|
| 红色 | 0 / 156 | 10 / 180 | 30 | 30 |
| 黄色 | 26 | 34 | 43 | 46 |
| 绿色 | 35 | 77 | 43 | 46 |
| 蓝色 | 100 | 124 | 43 | 46 |
| 紫色 | 125 | 155 | 43 | 46 |
修改lower_brown、upper_brown数组即可切换识别目标颜色。
五、运行环境与依赖安装
1. 安装依赖库
打开 cmd 终端执行:
pip install opencv-python numpy
2. 运行说明
- 运行代码后自动弹出 3 个实时画面窗口
- 将蓝色物体对准摄像头,
mask窗口会出现白色色块,result窗口仅显示蓝色物体 - 按下键盘 ESC 键关闭程序
六、代码优缺点与优化方向
优点
- HSV 色彩空间抗光照干扰远优于 RGB,颜色识别准确率更高
- 自带镜像翻转,适配笔记本前置摄像头
- 异常捕获机制,长时间运行不易崩溃
- 模块化阈值配置,切换识别颜色只需修改两行数组
现存不足
- 无形态学滤波,画面噪点多会出现零散小白点
- 无轮廓检测,只能提取色块,无法获取物体坐标、面积
- 阈值固定,强光 / 暗光环境下识别效果下降
进阶优化建议
- 添加腐蚀膨胀
cv2.morphologyEx消除掩码噪点 - 使用
cv2.findContours寻找色块轮廓,框选目标物体 - 添加滑动条实时调节 HSV 阈值,可视化调试颜色区间
七、常见问题解决
- 摄像头无法打开:检查摄像头权限,更换
VideoCapture(1)尝试外接摄像头 - mask 全黑识别不到颜色:调整 HSV 色相 H 区间,降低 S、V 下限
- 画面卡顿:增大
waitKey(数值),延长帧间隔 - 画面左右颠倒:代码中
cv2.flip(frame3,1)是镜像功能,不需要直接删除该行