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)是镜像功能,不需要直接删除该行
相关推荐
AI棒棒牛6 小时前
第11讲 | 目标检测任务:边界框、IoU、类别与置信度
人工智能·yolo·目标检测·yolo26
allione6 小时前
AI时代测试方向AI for Testing和Testing for AI
人工智能·ai测试
武子康6 小时前
GPT-Red:自动化红队如何形成 Agent 安全数据飞轮(4 个闭环 + 6 类评测指标 + 5 类风险误读)
人工智能·openai·agent
阿里云大数据AI技术6 小时前
DataWorks Data Agent 实战课堂(二):一句话搞定数据集成+处理,实现端到端数据流水线
人工智能·agent
Days20506 小时前
AI漫剧vs传统动漫vs真人短剧
人工智能
武子康6 小时前
从恶意 Dataset 到横向移动:一套可落地的 Dataset Processing Threat Model(资产边界 + 威胁枚举 + 5 层控制)
人工智能·安全
redreamSo6 小时前
一天涨 1800 星的 GitHub 榜首:AI 编程瓶颈变成了 token
人工智能·开源·github
wp123_16 小时前
实测数据对飙:COILCRAFT XFL4020-222MEC vs TONEVEE MVL4020-2R2M,2.2µH功率电感参数全解读
人工智能
本末倒置1836 小时前
从 PDF 到向量检索:一个最简单的本地 RAG 入库案例
人工智能
QYR-分析6 小时前
智能化自动化浪潮下,机器人末端执行器行业赛道发展全景解析
人工智能·机器人·自动化