OpenCV 基于 HSV 颜色空间实时颜色分割(摄像头蓝色识别)

目录

一、项目简介

实现效果

二、完整代码

三、逐模块代码解析

[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 键即可退出程序。

实现效果

  1. 实时摄像头画面左右镜像翻转,符合人眼观察习惯
  2. 输出三张窗口:原图、颜色掩码 mask、仅保留目标色的效果图
  3. 通过修改 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 摄像头可尝试12

3. 画面循环读取与预处理

python 复制代码
ret, frame3 = cap.read()
frame3 = cv2.flip(frame3, flipCode=1)
hsv_image = cv2.cvtColor(frame3, cv2.COLOR_BGR2HSV)
  1. cap.read():读取摄像头一帧图像,ret为读取成功标记,frame3是图像矩阵
  2. cv2.flip(frame3, 1):水平翻转画面,解决笔记本前置摄像头左右颠倒问题
    • flipCode=0:垂直翻转;flipCode=1:水平翻转;flipCode=-1:水平 + 垂直翻转
  3. 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)
  1. cv2.inRange()核心筛选函数:遍历 HSV 图像每个像素,在阈值内设为 255(白色),超出设为 0(黑色),输出黑白掩码mask
  2. cv2.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()
  1. try-except:摄像头读取失败、画面丢失时静默跳过,防止程序闪退
  2. cap.release():关闭摄像头硬件,释放占用
  3. 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_brownupper_brown数组即可切换识别目标颜色。

五、运行环境与依赖安装

1. 安装依赖库

打开 cmd 终端执行:

复制代码
pip install opencv-python numpy

2. 运行说明

  1. 运行代码后自动弹出 3 个实时画面窗口
  2. 将蓝色物体对准摄像头,mask窗口会出现白色色块,result窗口仅显示蓝色物体
  3. 按下键盘 ESC 键关闭程序

六、代码优缺点与优化方向

优点

  1. HSV 色彩空间抗光照干扰远优于 RGB,颜色识别准确率更高
  2. 自带镜像翻转,适配笔记本前置摄像头
  3. 异常捕获机制,长时间运行不易崩溃
  4. 模块化阈值配置,切换识别颜色只需修改两行数组

现存不足

  1. 无形态学滤波,画面噪点多会出现零散小白点
  2. 无轮廓检测,只能提取色块,无法获取物体坐标、面积
  3. 阈值固定,强光 / 暗光环境下识别效果下降

进阶优化建议

  1. 添加腐蚀膨胀cv2.morphologyEx消除掩码噪点
  2. 使用cv2.findContours寻找色块轮廓,框选目标物体
  3. 添加滑动条实时调节 HSV 阈值,可视化调试颜色区间

七、常见问题解决

  1. 摄像头无法打开:检查摄像头权限,更换VideoCapture(1)尝试外接摄像头
  2. mask 全黑识别不到颜色:调整 HSV 色相 H 区间,降低 S、V 下限
  3. 画面卡顿:增大waitKey(数值),延长帧间隔
  4. 画面左右颠倒:代码中cv2.flip(frame3,1)是镜像功能,不需要直接删除该行
相关推荐
满怀冰雪14 小时前
24-PaddleClas 模型评估、导出与推理部署入门
大数据·人工智能·python·深度学习·paddle
Mid_search15 小时前
随机排列与Fisher-Yates算法
人工智能·深度学习·强化学习·随机排列·fisher-yates
ZGIAI20 小时前
ZGI Workflow:条件分支走错时先查哪一层
人工智能·架构
X54先生(人文科技)20 小时前
《元创力》纪实录 · 桥段 《窑变纪元:一份来自星历2227年的深空考古笔记》
人工智能·开源·ai写作·零知识证明
ZGIAI20 小时前
ZGI 文件产物:生成报告后怎样交付
人工智能·架构
东方-教育技术博主20 小时前
自动编码在教育场景中的重要性:一项基于多源证据的深度综述
大数据·人工智能
骥龙20 小时前
模块二:Ollama本地模型部署与OpenCode代理配置
人工智能
阡之尘埃20 小时前
Python数据分析案例85——大模型微调全流程(SFT的LoRA微调)
人工智能·python·深度学习·语言模型·llm·微调·千问
Regentsoft丽晶软件20 小时前
品牌方新品上市促销政策无法实时同步经销商,有没有支持总部-经销商-终端一站式的分销解决方案?
人工智能·经验分享·数据库架构