OpenCV摄像头实时处理:基于 HSV 颜色空间的摄像头实时颜色筛选工具

前言

在计算机视觉项目中,颜色筛选是目标检测、物体跟踪等任务的基础环节。HSV 颜色空间因更贴合人眼对颜色的感知逻辑,成为颜色筛选的首选方案。本文将基于 OpenCV-Python 实现一个可动态调节 HSV 参数的摄像头实时颜色筛选工具,从代码解析、运行调试到优化扩展,全方位讲解颜色筛选的核心知识点。

目录

前言

一、工具核心功能

二、环境准备

三、完整代码与逐行解析

[3.1 完整可运行代码](#3.1 完整可运行代码)

[3.2 核心代码模块解析](#3.2 核心代码模块解析)

[模块 1:滑动条窗口初始化](#模块 1:滑动条窗口初始化)

[模块 2:摄像头与显示窗口配置](#模块 2:摄像头与显示窗口配置)

[模块 3:颜色空间转换与掩膜生成](#模块 3:颜色空间转换与掩膜生成)

[模块 4:形态学操作优化掩膜](#模块 4:形态学操作优化掩膜)

[模块 5:掩膜应用与参数保存](#模块 5:掩膜应用与参数保存)

四、运行效果与调试技巧

[4.1 运行效果展示](#4.1 运行效果展示)

[4.2 常用颜色 HSV 参数参考(新手直接复用)](#4.2 常用颜色 HSV 参数参考(新手直接复用))

[4.3 调试技巧(以筛选红色为例)](#4.3 调试技巧(以筛选红色为例))

五、常见问题与解决方案

六、扩展优化方向

[方向 1:多颜色同时筛选](#方向 1:多颜色同时筛选)

[方向 2:自动加载保存的 HSV 参数](#方向 2:自动加载保存的 HSV 参数)

[方向 3:添加帧率显示](#方向 3:添加帧率显示)

七、总结


论文投稿:
第二届计算机视觉研究进展与应用国际学术会议 (ACVRA 2026)

大会官网:https://ais.cn/u/2YrM7j

大会时间:2026年2月6-8日

大会地点:中国-武汉

一、工具核心功能

本工具实现了以下核心能力,适合 OpenCV 入门学习者掌握视频流处理与颜色分析的基础逻辑:

  1. 调用摄像头实时采集视频流,分窗口展示原始画面、颜色掩膜、筛选结果;
  2. 通过滑动条动态调节 H(色调)、S(饱和度)、V(明度)的阈值范围,参数调整即时生效;
  3. 集成形态学操作优化掩膜效果,去除噪点干扰;
  4. 支持镜像翻转画面、保存调试好的 HSV 参数,提升工具实用性;
  5. 完善的异常处理与资源释放逻辑,保证程序稳定性。

二、环境准备

运行代码前需安装必备依赖,建议使用 Python 3.7 + 版本:

python 复制代码
# 安装OpenCV和NumPy
pip install opencv-python numpy
# 验证安装(可选)
python -c "import cv2, numpy; print('OpenCV版本:', cv2.__version__); print('NumPy版本:', numpy.__version__)"

注意事项

  • 摄像头 ID 需根据实际情况调整:0为内置摄像头,1为外接摄像头;
  • Windows/macOS/Linux 系统均可运行,Linux 需赋予摄像头权限:sudo chmod 777 /dev/video0

三、完整代码与逐行解析

3.1 完整可运行代码

python 复制代码
import cv2
import numpy as np

# 回调函数,用于更新掩膜(滑动条触发时调用,仅占位)
def nothing(x):
    pass

# 创建滑动条窗口并自定义尺寸
cv2.namedWindow('Trackbars', cv2.WINDOW_NORMAL)
cv2.resizeWindow('Trackbars', 600, 400)  # 宽600px,高400px,提升操作体验

# 创建6个滑动条,分别控制H/S/V的最小/最大值
cv2.createTrackbar('H Min', 'Trackbars', 0, 179, nothing)
cv2.createTrackbar('H Max', 'Trackbars', 179, 179, nothing)
cv2.createTrackbar('S Min', 'Trackbars', 0, 255, nothing)
cv2.createTrackbar('S Max', 'Trackbars', 255, 255, nothing)
cv2.createTrackbar('V Min', 'Trackbars', 0, 255, nothing)
cv2.createTrackbar('V Max', 'Trackbars', 255, 255, nothing)

# 打开摄像头并设置曝光值
cap = cv2.VideoCapture(1)  # 1为外接摄像头,0为内置
new_exposure = -10
cap.set(cv2.CAP_PROP_EXPOSURE, new_exposure)
print(f"Setting Exposure to: {new_exposure}")

# 创建显示窗口并统一尺寸(640x480适配常见摄像头分辨率)
cv2.namedWindow('Original Image', cv2.WINDOW_NORMAL)
cv2.namedWindow('Mask', cv2.WINDOW_NORMAL)
cv2.namedWindow('Filtered Result', cv2.WINDOW_NORMAL)
cv2.resizeWindow('Original Image', 640, 480)
cv2.resizeWindow('Mask', 640, 480)
cv2.resizeWindow('Filtered Result', 640, 480)

# 定义形态学操作结构元素(5x5矩形核,用于优化掩膜)
kernel = np.ones((5, 5), np.uint8)

while True:
    # 读取摄像头帧数据
    ret, img = cap.read()
    if not ret:
        print("无法读取摄像头输入")
        break

    # 镜像翻转画面(解决摄像头画面左右颠倒问题)
    img = cv2.flip(img, 1)
    
    # 将BGR(OpenCV默认)转换为HSV颜色空间
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    # 读取滑动条当前值,获取HSV阈值范围
    h_min = cv2.getTrackbarPos('H Min', 'Trackbars')
    h_max = cv2.getTrackbarPos('H Max', 'Trackbars')
    s_min = cv2.getTrackbarPos('S Min', 'Trackbars')
    s_max = cv2.getTrackbarPos('S Max', 'Trackbars')
    v_min = cv2.getTrackbarPos('V Min', 'Trackbars')
    v_max = cv2.getTrackbarPos('V Max', 'Trackbars')

    # 构造HSV上下界数组(NumPy数组格式)
    lower_bound = np.array([h_min, s_min, v_min])
    upper_bound = np.array([h_max, s_max, v_max])

    # 生成颜色掩膜:符合范围的像素为255(白),否则为0(黑)
    mask = cv2.inRange(hsv, lower_bound, upper_bound)
    
    # 形态学闭运算:先腐蚀后膨胀,去除掩膜中的小噪点
    mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)

    # 应用掩膜:仅保留原始图像中掩膜为白色的区域
    result = cv2.bitwise_and(img, img, mask=mask)

    # 显示各窗口内容
    cv2.imshow('Original Image', img)
    cv2.imshow('Mask', mask)
    cv2.imshow('Filtered Result', result)

    # 按键检测:q退出,s保存HSV参数
    key = cv2.waitKey(1) & 0xFF
    if key == ord('q'):
        break
    elif key == ord('s'):
        # 将当前HSV参数保存到文本文件
        params = f"H Min: {h_min}, H Max: {h_max}\nS Min: {s_min}, S Max: {s_max}\nV Min: {v_min}, V Max: {v_max}"
        with open('hsv_params.txt', 'w') as f:
            f.write(params)
        print("HSV参数已保存到 hsv_params.txt")

# 释放资源,避免摄像头占用
cap.release()
cv2.destroyAllWindows()

3.2 核心代码模块解析

模块 1:滑动条窗口初始化
python 复制代码
cv2.namedWindow('Trackbars', cv2.WINDOW_NORMAL)
cv2.resizeWindow('Trackbars', 600, 400)
cv2.createTrackbar('H Min', 'Trackbars', 0, 179, nothing)
# ... 其余滑动条创建逻辑
  • cv2.namedWindow('Trackbars', cv2.WINDOW_NORMAL):创建可调整大小的窗口,避免滑动条挤在一起;
  • cv2.createTrackbar()参数说明:
    • 第 1 参数:滑动条名称(界面显示);
    • 第 2 参数:绑定的窗口名;
    • 第 3 参数:初始值;
    • 第 4 参数:最大值(HSV 取值规范:H (0-179)、S/V (0-255));
    • 第 5 参数:值变化时的回调函数(此处nothing仅占位)。
模块 2:摄像头与显示窗口配置
python 复制代码
cap = cv2.VideoCapture(1)
cap.set(cv2.CAP_PROP_EXPOSURE, new_exposure)
# ... 显示窗口创建逻辑
  • cv2.VideoCapture(1):初始化摄像头,ID 需根据实际设备调整;
  • cv2.CAP_PROP_EXPOSURE:设置摄像头曝光值,负数越小曝光越低,适合强光环境;
  • cv2.resizeWindow():统一显示窗口尺寸为 640x480,符合 VGA 分辨率,视觉更协调。
模块 3:颜色空间转换与掩膜生成
python 复制代码
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv, lower_bound, upper_bound)
  • cv2.cvtColor(img, cv2.COLOR_BGR2HSV):将 OpenCV 默认的 BGR 格式转为 HSV,这是颜色筛选的关键(HSV 更易分离颜色);
  • cv2.inRange():生成二值掩膜,核心逻辑是「像素值在 [lower_bound, upper_bound] 范围内则为 255,否则为 0」。
模块 4:形态学操作优化掩膜
python 复制代码
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
  • 形态学闭运算(MORPH_CLOSE):先腐蚀(去除小噪点)后膨胀(恢复目标区域大小),解决掩膜中零星噪点问题;
  • kernel = np.ones((5, 5), np.uint8):5x5 的矩形结构元素,是形态学操作的基础(核越大,降噪效果越强,但边缘精度会降低)。
模块 5:掩膜应用与参数保存
python 复制代码
result = cv2.bitwise_and(img, img, mask=mask)
# ... 按键检测逻辑
elif key == ord('s'):
    params = f"H Min: {h_min}...", 
    with open('hsv_params.txt', 'w') as f:
        f.write(params)
  • cv2.bitwise_and():位与运算,仅保留原始图像中掩膜为白色的像素,实现颜色提取;
  • s键保存参数:将调试好的 HSV 阈值写入文件,后续可直接复用,无需重复调节。

四、运行效果与调试技巧

4.1 运行效果展示

启动程序后会弹出 4 个窗口,各窗口功能如下:

窗口名称 功能说明
Trackbars 6 个滑动条,调节 H/S/V 的最小 / 最大值
Original Image 摄像头原始画面(已镜像翻转)
Mask 颜色掩膜(白色为匹配目标颜色的区域)
Filtered Result 仅显示原始画面中目标颜色的区域

4.2 常用颜色 HSV 参数参考(新手直接复用)

目标颜色 H Min H Max S Min S Max V Min V Max
红色 0 15 50 255 50 255
蓝色 90 130 40 255 40 255
绿色 40 70 40 255 40 255
黄色 20 35 40 255 40 255

4.3 调试技巧(以筛选红色为例)

  1. 先将 S Min、V Min 调至 50 左右,过滤低饱和度 / 低明度的背景干扰;
  2. 缓慢调整 H Min/H Max,直到 Mask 窗口中红色区域完全变为白色;
  3. 微调 S Max/V Max,去除非目标颜色的噪点;
  4. 调试完成后按s键保存参数,后续直接读取文件复用。

五、常见问题与解决方案

问题现象 原因分析 解决方案
摄像头无法打开 摄像头被占用 / ID 错误 / 权限不足 关闭占用程序;切换 ID(0/1);Linux 执行sudo chmod 777 /dev/video0
颜色筛选效果差 光照不稳定 / HSV 参数范围不合理 固定光照环境;参考上表调整初始参数;先调 H,再调 S/V
掩膜有大量噪点 未做形态学操作 / 核尺寸过小 增大形态学核尺寸(如 7x7);增加腐蚀 / 膨胀次数
画面卡顿 窗口分辨率过高 / CPU 占用高 降低窗口分辨率(如 320x240);关闭其他高耗资源程序
红色筛选不完整 红色在 HSV 中分为两段(0-10/160-179) 分别生成两段掩膜,再通过cv2.bitwise_or(mask1, mask2)合并

六、扩展优化方向

方向 1:多颜色同时筛选

python 复制代码
# 示例:同时筛选红色和蓝色
lower_red = np.array([0, 50, 50])
upper_red = np.array([15, 255, 255])
lower_blue = np.array([90, 40, 40])
upper_blue = np.array([130, 255, 255])

mask_red = cv2.inRange(hsv, lower_red, upper_red)
mask_blue = cv2.inRange(hsv, lower_blue, upper_blue)
mask = cv2.bitwise_or(mask_red, mask_blue)  # 合并掩膜

方向 2:自动加载保存的 HSV 参数

python 复制代码
# 程序启动时读取保存的参数
try:
    with open('hsv_params.txt', 'r') as f:
        lines = f.readlines()
        # 解析参数并设置滑动条初始值
        h_min = int(lines[0].split(',')[0].split(':')[1].strip())
        h_max = int(lines[0].split(',')[1].split(':')[1].strip())
        # ... 解析S/V参数
        cv2.setTrackbarPos('H Min', 'Trackbars', h_min)
        cv2.setTrackbarPos('H Max', 'Trackbars', h_max)
        # ... 设置其余滑动条初始值
except FileNotFoundError:
    print("未找到HSV参数文件,使用默认值")

方向 3:添加帧率显示

python 复制代码
# 在主循环中添加帧率计算
import time
fps_start_time = time.time()
fps_count = 0

while True:
    # ... 原有逻辑
    fps_count += 1
    if (time.time() - fps_start_time) >= 1:
        fps = fps_count / (time.time() - fps_start_time)
        cv2.putText(img, f"FPS: {fps:.1f}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
        fps_count = 0
        fps_start_time = time.time()

七、总结

本文实现的 HSV 颜色筛选工具是 OpenCV 视觉开发的基础实战案例,核心知识点总结:

  1. HSV 颜色空间是颜色筛选的最优选择,相比 RGB 更易分离目标颜色;
  2. cv2.inRange()生成掩膜 + cv2.bitwise_and()应用掩膜是颜色提取的核心流程;
  3. 形态学闭运算可有效优化掩膜质量,去除小噪点;
  4. 滑动条动态调节参数大幅提升调试效率,参数保存功能可复用调试结果;
  5. 不同颜色的 HSV 范围需结合实际光照环境微调,红色需特殊处理两段区间。

该工具可作为物体跟踪、手势识别、颜色分拣等高级项目的基础模块,掌握本文知识点后,可快速扩展出更复杂的视觉应用。

相关推荐
Shirley~~2 小时前
Vue-skills的中文文档
前端·人工智能
华大哥2 小时前
AI大模型基于LangChain 进行RAG与Agent智能体开发
人工智能·langchain
Sagittarius_A*2 小时前
角点检测:Harris 与 Shi-Tomasi原理拆解【计算机视觉】
图像处理·人工智能·python·opencv·计算机视觉
困死,根本不会2 小时前
OpenCV实时摄像头处理:曝光调节、降噪与二值化实战
人工智能·opencv·计算机视觉
LitchiCheng2 小时前
Mujoco 开源机械臂 RL 强化学习避障、绕障
人工智能·python·开源
A先生的AI之旅3 小时前
2026-1-30 LingBot-VA解读
人工智能·pytorch·python·深度学习·神经网络
Learn Beyond Limits3 小时前
文献阅读:A Probabilistic U-Net for Segmentation of Ambiguous Images
论文阅读·人工智能·深度学习·算法·机器学习·计算机视觉·ai
丝瓜蛋汤3 小时前
微调生成特定写作风格助手
人工智能·python
OpenMiniServer3 小时前
电气化能源革命下的社会
java·人工智能·能源