计算机视觉——OpenCV Python基于颜色识别的目标检测

news2025/1/25 4:42:45

1. 计算机视觉中的颜色空间

颜色空间在计算机视觉领域的应用非常广泛,它们在图像和视频处理、物体检测等任务中扮演着重要角色。颜色空间的主要作用是将颜色以数值形式表示出来,这样计算机算法就能够对其进行处理和分析。不同的颜色空间有着不同的特点和适用场景,下面我们来快速了解一下几种最常用的颜色空间:

  1. RGB颜色空间:这是最常用的颜色空间之一,特别是在计算机显示和数字图像处理中。RGB代表红色(Red)、绿色(Green)、蓝色(Blue),这三种基本颜色可以通过不同比例的混合来生成其他颜色。RGB颜色空间是一个三维空间,每个颜色由三个分量的强度值决定,通常范围在0到255之间。这种颜色空间直观地反映了颜色的组成,但它并不总是与人眼对颜色的感知完全一致。
    在这里插入图片描述
  2. HSV颜色空间:HSV代表色调(Hue)、饱和度(Saturation)和亮度(Value)。HSV颜色空间特别适合于颜色分割和基于颜色的物体识别任务。色调表示颜色的种类,类似于色轮上的角度,范围从0到360度;饱和度表示颜色的纯度,从0%(灰色)到100%(完全饱和的颜色);亮度表示颜色的明暗程度,从0%(黑色)到100%(白色)。HSV颜色空间将颜色信息与亮度信息分离,因此在不同的光照条件下进行颜色识别时更为鲁棒。
    在这里插入图片描述
  3. LAB颜色空间:LAB颜色空间包括亮度(L*)、从绿到红的色度(a*)以及从蓝到黄的色度(b*)。这种颜色空间的设计旨在更好地匹配人类视觉的感知特性,使得颜色之间的数值差异与我们感知到的差异更为接近。LAB颜色空间特别适合于需要精确颜色差异匹配的应用场景,如颜色编辑和校正。
    在这里插入图片描述

2. HSV颜色空间

颜色空间的选择对于计算机视觉应用的性能有着显著影响。每种颜色空间都有其独特的属性,使其适用于特定的任务和场景。HSV颜色空间在基于颜色的物体检测中特别受欢迎,原因如下:

  1. 颜色与亮度分离:HSV颜色空间的一个关键特点是它将颜色信息(色调H)与亮度信息(亮度V)分开表示。这意味着即使在光照条件发生变化的情况下,物体的颜色特征(色调和饱和度)也能保持相对稳定。这种分离使得HSV颜色空间在处理光照变化时更为鲁棒,因为可以通过调整色调和饱和度的范围来检测特定颜色的物体,而不受亮度变化的影响。

  2. 直观的颜色表示:HSV颜色空间提供了一种更接近人类对颜色感知的表示方式。色调H是颜色的基本属性,它描述了颜色的种类,如红色、绿色或蓝色。饱和度S描述了颜色的纯度,即颜色的强度或鲜艳程度。这使得在HSV空间中定义和识别颜色变得更加直观和容易。

  3. 易于调整和过滤:在HSV颜色空间中,可以通过设置色调、饱和度和亮度的阈值来创建颜色掩码,从而过滤和检测特定颜色的物体。这种方法在图像处理和计算机视觉中非常有用,尤其是在需要从复杂背景中分离出特定颜色物体的应用中。

  4. 对阴影和反射的鲁棒性:由于HSV颜色空间将颜色与亮度分离,因此在物体被阴影覆盖或反射光线时,仍然可以有效地识别物体的颜色特征。这对于在各种环境条件下进行物体检测尤为重要。

HSV颜色空间是一种将颜色以色调(Hue)、饱和度(Saturation)和值(Value)三个维度来表示的方法,这种表示方式更接近人类对颜色的感知和理解:

  1. 色调(Hue):色调是颜色的基本属性,它描述了颜色的种类。色调通常用角度值来表示,范围从0度到360度。在HSV颜色模型中,色调的度量是以色轮为基础的,其中红色通常对应于0度(或360度,因为色轮是连续的),绿色对应于120度,蓝色对应于240度。色调的这种表示方式使得颜色的选择和调整变得直观,因为它与我们在日常生活中描述颜色的方式相一致。

  2. 饱和度(Saturation):饱和度描述了颜色的纯度或强度。饱和度的值范围从0%到100%,其中0%表示完全缺乏颜色(即灰色),而100%表示完全饱和的颜色。高饱和度的颜色看起来鲜艳、生动,而低饱和度的颜色则看起来暗淡、柔和。饱和度的调整可以改变图像的整体外观,使其看起来更生动或更柔和。

  3. 值(Value):值表示颜色的明暗程度,也就是颜色的亮度。值的范围也是从0%到100%,其中0%代表纯黑色,100%代表纯白色。值的改变可以影响颜色的明暗对比,但不会影响颜色的色调和饱和度。通过调整值,可以使物体在不同光照条件下保持其颜色特征,这对于在变化的环境中进行物体检测和识别非常重要。

3.基于颜色的物体检测

在这里插入图片描述
现在的目标是检测图像中的高尔夫球。创建一个名为color_detection_image.py的新文件,并添加以下代码:

import cv2

# 读取图像
image = cv2.imread("examples/1.jpg")

# 从BGR转换为HSV颜色空间
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

第一步是读取图像并将其从BGR转换为HSV颜色空间。可以使用cv2.cvtColor()函数,并使用cv2.COLOR_BGR2HSV标志从BGR转换为HSV颜色空间。现在,定义想要检测的颜色范围。在这个例子中,将检测球的白色。可以通过定义HSV颜色空间的下限和上限来实现这一点。
对于白色,下限是(75, 0, 99),上限是(179, 62, 255)。可以更改这些值以检测其他颜色。这里创建了一个简单的Python脚本(一个HSV颜色选择器),这能获取的颜色的HSV值。要获取上面图像中白色高尔夫球的下限和上限,可以运行hsv_color_picker_images.py脚本,然后调整值直到获得所需的结果。这是的图像的一个示例:
在这里插入图片描述

# 白色下限和上限
lower_limit = np.array([
    75,
    0,
    99
])

upper_limit = np.array([
    179,
    62,
    255
])

# 为指定的颜色范围创建掩码
mask = cv2.inRange(hsv_image, lower_limit, upper_limit)

# 从掩码图像中获取边界框
bbox = cv2.boundingRect(mask)

然后使用cv2.inRange()函数为指定的颜色范围创建掩码。该函数接受HSV图像和颜色范围的下限和上限作为输入,并返回一个二进制掩码图像。然后可以使用cv2.boundingRect()函数获取图像中物体的边界框。该函数接受掩码图像作为输入,并返回边界框坐标(x, y, w, h),其中(x, y)是边界框的左上角,而(w, h)是边界框的宽度和高度。

# 如果我们得到一个边界框,使用它在图像上绘制一个矩形
if bbox is not None:
    print("物体检测到")
    x, y, w, h = bbox
    cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
else:
    print("物体未检测到")

cv2.imshow('图像', image)
cv2.waitKey(0)

在这里插入图片描述

4.视频中颜色的物体检测

# 初始化视频捕获对象
cap = cv2.VideoCapture("examples/1.mp4")

# 获取视频流中帧的宽度、高度和fps。
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = int(cap.get(cv2.CAP_PROP_FPS))

# 初始化FourCC和视频编写器对象
fourcc = cv2.VideoWriter_fourcc(*'XVID')
output = cv2.VideoWriter('output.mp4', fourcc, fps, (frame_width, frame_height))

使用cv2.VideoCapture()函数初始化视频捕获对象。将视频文件的路径作为输入。然后使用cv2.CAP_PROP_FRAME_WIDTH、cv2.CAP_PROP_FRAME_HEIGHT和cv2.CAP_PROP_FPS属性获取视频流中帧的宽度、高度和fps。然后可以初始化cv2.VideoWriter对象来写入输出视频。将输出视频文件的路径、FourCC代码、fps和帧的宽度和高度作为输入。

现在,让逐帧读取视频并对每一帧执行基于颜色的物体检测:

while True:
    ret, frame = cap.read()

    if not ret:
        print("没有更多帧可读,退出...")
        break

    # 从BGR转换为HSV颜色空间
    hsv_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

读取视频后,循环遍历帧并检查帧是否成功读取,使用ret变量。如果帧未成功读取,打印一条消息,表示没有更多帧可读并退出循环。如果帧成功读取,使用cv2.cvtColor()函数将帧的颜色空间从BGR转换为HSV。现在,检测的定义颜色范围。

# 蓝色下限和上限
lower_limit = np.array([
    99,
    135,
    51
])

upper_limit = np.array([
    116,
    226,
    255
])

mask = cv2.inRange(hsv_frame, lower_limit, upper_limit)

bbox = cv2.boundingRect(mask)

然后为指定的颜色范围创建掩码并获取帧中物体的边界框。然后使用边界框坐标在帧上绘制一个矩形(如果边界框不为空)并显示帧。将帧写入输出视频文件并检查用户是否按下了q键。如果退出循环。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1600661.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web3D智慧医院平台(HTML5+Threejs)

智慧医院的建设将借助物联网、云计算、大数据、数字孪生等技术,以轻量化渲染、极简架构、三维可视化“一张屏”的形式,让医院各大子系统管理既独立又链接,数据相互融合及联动。 建设医院物联网应用的目标对象(人、物)都…

基于afx透明视频的视觉增强前端方案

作者 | 青玉 导读 本文介绍了增长前端团队自研的Webview框架下透明视频视觉增强方案,该方案在保证对视觉进行高度还原的同时可投入更少的开发成本,还能获得更优的前端性能表现。文章首先分析了市面上动画方案的优缺点,然后详细介绍了透明视频…

CentOS下GitLab的安装部署_centos 安装部署 gitlab,2024年最新软件测试开发岗还不会这些问题

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7 深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞…

HTML段落标签、换行标签、文本格式化标签与水平线标签

目录 HTML段落标签 HTML换行标签 HTML格式化标签 加粗标签 倾斜标签 删除线标签 下划线标签 HTML水平线标签 HTML段落标签 在网页中&#xff0c;要把文字有条理地显示出来&#xff0c;就需要将这些文字分段显示。在 HTML 标签中&#xff0c;<p>标签用于定义段落…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之十二 简单人脸识别

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之十二 简单人脸识别 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之十二 简单人脸识别 一、简单介绍 二、简单人脸识别实现原理 三、简单人脸识别案例实现简…

基于小程序实现的餐饮外卖系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

如何在PPT中获得网页般的互动效果

如何在PPT中获得网页般的互动效果 效果可以看视频 PPT中插入网页有互动效果 当然了&#xff0c;获得网页般的互动效果&#xff0c;最简单的方法就是在 PPT 中插入网页呀。 那么如何插入呢&#xff1f; 接下来为你讲解如何获得&#xff08;此方法在 PowerPoint中行得通&#…

华为配置静态ARP示例

华为配置静态ARP示例 组网图形 图1 配置静态ARP组网图 静态ARP简介配置注意事项组网需求配置思路操作步骤配置文件相关信息 静态ARP简介 静态ARP表项是指网络管理员手工建立IP地址和MAC地址之间固定的映射关系。 正常情况下网络中设备可以通过ARP协议进行ARP表项的动态学习&…

差速机器人模型LQR 控制仿真——路径模拟

LQR路径跟踪要求路径中带角度&#xff0c;即坐标&#xff08;x,y,yaw&#xff09;&#xff0c;而一般我们的规划出来的路径不带角度。这里通过总结相关方法&#xff0c;并提供一个案例。 将点路径拟合成一条完整的线路径算法 将点路径拟合成一条完整的线路径是一个常见的问题…

C#语法知识之变量

2.变量 一、知识点 1、折叠代码 //#region按Tab键#region MyRegion(描述)#endregion //本质是编译器提供给我们的预处理指令&#xff0c;发布代码是会被自动删除2、声明变量和变量类型 ​ 变量就是可以变化的容器&#xff0c;用来存储各种不同类型数值的一个容器&#xff1b…

jenkins从节点配置说明

目的 打包构建时使用从节点&#xff0c;从节点所在服务器配置4C8G5000G&#xff08;服务器2&#xff09; 前提 首先在服务器1上部署jenkins服务&#xff0c;即主节点&#xff0c;默认节点名称为master 步骤 1&#xff09;登录进入jenkins平台&#xff0c;在系统设置中&…

KT-105小动物人工呼吸机

咳咳&#xff0c;请各位小伙伴们注意啦&#xff01;我们要聊的主题可是相当高大上——小动物呼吸机&#xff01; 我们得先了解一下什么是小动物呼吸机。这可不是一般的机器哦&#xff0c;它是一种实验设备&#xff0c;主要用于各种各样的科学研究实验中。比如&#xff0c;在基…

ICV:《中美量子产业融资比较分析》

近日&#xff0c;全球前沿科技咨询公司ICV发布了A Comparative Analysis of Quantum Industry Financing in the U.S and China&#xff08;美国和中国量子产业融资比较分析&#xff09;报告。该报告旨在对中美两国在量子技术领域的投融资情况进行比较分析&#xff0c;探讨其差…

python解释器安装路径查询以及版本查询

查询安装路径 1、利用脚本&#xff1a; 路径: import sys import osprint(当前 Python 解释器路径&#xff1a;) print(sys.executable)运行结果&#xff1a; 目录: print(当前 Python 解释器目录&#xff1a;) print(os.path.dirname(sys.executable))运行结果&#xff1a…

十大排序——11.十大排序的比较汇总及Java中自带的排序算法

这篇文章对排序算法进行一个汇总比较&#xff01; 目录 0.十大排序汇总 0.1概述 0.2比较和非比较的区别 0.3基本术语 0.4排序算法的复杂度及稳定性 1.冒泡排序 算法简介 动图演示 代码演示 应用场景 算法分析 2.快速排序 算法简介 动图演示 代码演示 应用场景…

AGI的智力有可能在两年内超过人类水平

特斯拉CEO埃隆马斯克近日与挪威银行投资管理基金CEO坦根的访谈中表示&#xff0c;AGI的智力将在两年内可能超过人类智力&#xff0c;在未来五年内&#xff0c;AI的能力很可能超过所有人类。 马斯克透漏&#xff0c;去年人工智能发展过程中的主要制约因素是缺少高性能芯片&#…

信息集成:打通数据、深化业务协同与生产调度,降本增效第一步 | 创新场景...

ITValue 痛点 对于三一集团这样生产线复杂的大型组织&#xff0c;一辆重卡的生产由底盘、动力、车身、座舱、智驾网联等多个不同区域组成&#xff0c;各自使用工具与业务系统&#xff0c;彼此之间的数据各自孤立。如何打通业务部门的信息传递&#xff0c;深化业务协同与生产调度…

第11章 数据仓库和数据智能知识点梳理

第11章 数据仓库和数据智能知识点梳理&#xff08;附带页码&#xff09; ◼ 数据仓库&#xff08;Data Warehouse&#xff0c;DW&#xff09;&#xff1a;始于 20 世纪 80 年代&#xff0c;发展于 20 世纪 90 年代&#xff0c;后与商务智能&#xff08;Business Inteligence,BI…

【前后端的那些事】SpringBoot 基于内存的ip访问频率限制切面(RateLimiter)

文章目录 1. 什么是限流2. 常见的限流策略2.1 漏斗算法2.2 令牌桶算法2.3 次数统计 3. 令牌桶代码编写4. 接口测试5. 测试结果 1. 什么是限流 限流就是在用户访问次数庞大时&#xff0c;对系统资源的一种保护手段。高峰期&#xff0c;用户可能对某个接口的访问频率急剧升高&am…

mac 最小化全部程序回到桌面(基于alfred workflow)

前言 换到 mac 系统之后&#xff0c;很多快捷键根本就不好用&#xff0c;组合太多了&#xff0c;除了 cmd Q/W/A/S/X/R/Z/C/V &#xff0c;个人认为其它的真的一坨屎。像我的需求就是&#xff0c;开的窗口太多了&#xff0c;我需要全部最小化&#xff0c;再重新打开我需要那个…