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

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 = bboxcv2.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.hqwc.cn/news/624885.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ShardingSphere:强大的分布式数据库中间件【图文】

ShardingSphere的诞生 ShardingSphere的结构 Sharding-JDBC :它提供了一个轻量级的 Java 框架,在 Java 的 JDBC 层提供额外的服务。使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动&…

六、OpenFeign服务接口调用

一、提问 已经有loadbalancer为什么还要学习OpenFeign? 两个都有道理的话,日常用那个? 二、是什么 OpenFeign是什么 官网翻译 Feign是一个声明性web服务客户端。它使编写web服务客户端变得更容易。使用Feign创建一个接口并对其进行注释。它具有可…

LangChain-Chatchat 开源知识库来了

LangChain-Chatchat 开源知识库来了 LangChain-Chatchat 架构设计LangChain-ChatChat 具体实现过程 一键本地离线部署软件环境硬件环境支持三种部署方式 LangChain-Chatchat 是基于 ChatGLM 等大语言模型与 LangChain 等应用框架实现,开源、可离线部署的 RAG 检索增…

Spring Boot JNA 实现调用 DLL文件(清晰明了)

概述 项目需要用到 重采样算法,JAVA 没有现成的,只能通过 JNA 调用 C 的 DLL 实现,JNA中,它提供了一个动态的C语言编写的转发器,可以自动实现Java和C的数据类型映射。不再需要编写C动态链接库。 实现需求 根据 一个…

力扣152. 乘积最大子数组

Problem: 152. 乘积最大子数组 文章目录 题目描述思路复杂度Code 题目描述 思路 1.初始化:首先,我们创建两个数组maxNum和minNum,并将它们初始化为输入数组nums。这两个数组用于存储到当前位置的最大和最小乘积。我们还需要一个变量maxProduc…

【Conda基础命令】使用conda创建、查看、删除虚拟环境及可能的报错处理

文章目录 前言(1) 在默认路径下创建一个新的虚拟环境(2) 查看已有的虚拟环境(3) 删除已有的虚拟环境(谨慎操作)(4)激活虚拟环境(5)退出…

2024 NTFS读写工具Tuxera NTFS for Mac 是如何进行下载、安装、激活的

本篇将为各位小伙伴们集中讲解一下NTFS读写工具Tuxera NTFS for Mac 是如何进行下载、安装、激活与换机的。 在数字化时代,数据交换和共享变得日益重要。然而,对于Mac用户来说,与Windows系统之间的文件交换可能会遇到一些挑战。这是因为Mac …

sqlilabs靶场1—20题学习笔记(思路+解析+方法)

前几个题目较为简单,均尝试使用各种方法进行SQL注入 第一题 联合查询 1)思路: 有回显值 1.判断有无注入点 2.猜解列名数量 3.判断回显点 4.利用注入点进行信息收集 爆用户权限,爆库,爆版本号 爆表,爆列&…

使用python采集VIP会电商平台商品数据②单页数据采集

获取标头: 响应:服务器返回的数据 预览:查看响应得数据 载荷:查询参数/请求参数 标头:查看请求的网址/请求的标头/请求方法 数据包地址:https://mapi.vip.com/vips-mobile/rest/shopping/pc/product/mo…

uniapp 组件传值

uniapp 组件传值 父传子子传父 uniapp 组件传值 父传子 在uniapp中&#xff0c;组件传值主要通过props进行。以下是一个简单的例子&#xff1a; 首先&#xff0c;创建一个组件MyComponent.vue&#xff1a; <template><view><text>{{ message }}</tex…

IBM SPSS Statistics for Mac中文激活版:强大的数据分析工具

IBM SPSS Statistics for Mac是一款功能强大的数据分析工具&#xff0c;为Mac用户提供了高效、精准的数据分析体验。 IBM SPSS Statistics for Mac中文激活版下载 该软件拥有丰富的统计分析功能&#xff0c;无论是描述性统计、推论性统计&#xff0c;还是高级的多元统计分析&am…

Jenkins + Docker 一键自动化部署 SpringBoot 应用最精简流程

本文章实现最简单全面的 Jenkins Docker Spring Boot 一键自动部署项目。步骤齐全&#xff0c;少走坑路。 环境&#xff1a;CentOS7 Git (Gitee) 实现步骤&#xff1a;在 Docker 安装 Jenkins&#xff0c;配置 Jenkins 基本信息&#xff0c;利用 Dockerfile 和 Shell 脚本…