当前位置: 首页 > news >正文

计算机视觉——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键。如果退出循环。

相关文章:

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

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

2024中国内燃机展-北京汽车发动机零部件展

2024第二十三届中国国际内燃机与零部件展览会 由中国内燃机工业协会主办、中国机床专用技术设备有限公司、汽车工艺装备成套开发集团协办的2024中国国际内燃机及动力装备博览会(简称“动博会”)将于2024年10月11日-13日在亦创国际会展中心隆重举办。本届…...

【iOS】——SDWebImage源码学习

文章目录 一、SDWebIamge简介二、SDWebImage的调用流程SDWebImage源码分析1.UIImageViewWebCache层2.UIViewWebCache层3.SDWebManager层4.SDWebCache层5.SDWebImageDownloader层 一、SDWebIamge简介 SDWebImage是iOS中提供图片加载的第三方库,可以给UIKit框架中的控…...

树和二叉树(一)

一、树 非线性数据结构,在实际场景中,存在一对多,多对多的情况。 树( tree)是n (n>0)个节点的有限集。当n0时,称为空树。 在任意一个非空树中,有如下特点。 1.有且仅有一个特定的称为根的节点…...

RAID 磁盘阵列及RAID配置实战

目录 一.RAID磁盘阵列介绍 二.常用的RAID磁盘阵列的介绍 1.RAID 0 (条带化存储) 2.RAID 1(镜像存储) 3.RAID 5 4.RAID 6 5.RAID 10(先做镜像,再做条带) 6.RAID 01 (先做条带…...

listpack

目录 为什么有listpack? listpack结构 listpack的节点entry 长度length encoding编码方式 listpack的API 1.创建listpack 2.遍历操作 正向遍历 反向遍历 3.查找元素 4.插入/替换/删除元素 总结 为什么有listpack? ziplist是存储在连续内存空间,节省…...

Web3与社会契约:去中心化治理的新模式

在数字化时代,技术不断为我们提供新的可能性,而Web3技术作为一种基于区块链的创新,正在引领着互联网的下一波变革。它不仅改变了我们的经济模式和商业逻辑,还对社会契约和权力结构提出了全新的挑战和思考。本文将深入探讨Web3的基…...

实体类List重复校验

如果实体类有多个属性,并且你希望根据所有属性的组合来进行重复校验,你可以考虑以下几种方法: 使用集合存储已经出现过的实体对象: 将每个实体对象放入一个 Set 中进行重复校验。在 Set 中元素的比较可以使用自定义的 equals 方法…...

loadash常用的函数方法

Lodash是一个JavaScript实用工具库,提供了很多常用的函数方法来简化开发过程。以下是一些常用的Lodash函数方法: _.map(array, iteratee):对数组中的每个元素应用一个函数,并返回结果数组。_.filter(collection, predicate)&…...

【零基础入门TypeScript】模块

目录 内部模块 内部模块语法(旧) 命名空间语法(新) 两种情况下生成的 JavaScript 是相同的 外部模块 选择模块加载器 定义外部模块 句法 例子 文件:IShape.js 文件:Circle.js 文件:…...

Scala 之数组

可变数组与不可变数组 import scala.collection.mutable.ArrayBuffer// 不可变数组。 长度不可变,但是元素的值可变 object Demo1 {def main(args: Array[String]): Unit {// 不可变数组定义方式// 未初始化有默认值 Int > 0val arr1 : Array[Int] new Arr…...

【Phytium】飞腾D2000 UEFI/EDK2 适配 RTC(IIC SD3077)

文章目录 0. env1. 软件2. 硬件 10. 需求1. 硬件2. 软件 20. DatasheetCPURTC 30. 调试步骤1. 硬件环境搭建2. UEFI 开发环境搭建3. 修改步骤1. UEFI 中使能RTC驱动、配置RTC信息等1.1 使能RTC驱动1.2 修改RTC对应的IIC配置信息1.3 解决驱动冲突1.4 验证波形 2. 修改对应RTC驱动…...

如何利用纯前端技术,实现一个网页版视频编辑器?

纯网页版视频编辑器 一、前言二、功能实现三、所需技术四、部分功能实现4.1 素材预设4.2 多轨道剪辑 一、前言 介绍:本篇文章打算利用纯前端的技术,来实现一个网页版的视频编辑器。为什么突然想做一个这么项目来呢,主要是最近一直在利用手机…...

stm32实现hid键盘

前面的cubelmx项目配置参考 stm32实现hid鼠标-CSDN博客https://blog.csdn.net/anlog/article/details/137814494?spm1001.2014.3001.5502两个项目的配置完全相同。 代码 引用 键盘代码: 替换hid设备描述符 先屏蔽鼠标设备描述符 替换为键盘设备描述符 修改宏定…...

【单例模式】饿汉式、懒汉式、静态内部类--简单例子

单例模式是⼀个单例类在任何情况下都只存在⼀个实例,构造⽅法必须是私有的、由⾃⼰创建⼀个静态变量存储实例,对外提供⼀个静态公有⽅法获取实例。 目录 一、单例模式 饿汉式 静态内部类 懒汉式 反射可以破坏单例 道高一尺魔高一丈 枚举 一、单例…...

windows关闭Windows Search功能

我发现windows最恶心的功能就是自动更新和搜索。自动更新就是个毒瘤,得到了全世界的人讨厌。 而搜索功能难用、慢和造成卡死,根本没有存在的必要。并且他的windows search filter服务会在每次移动大量文件后建立索引,持续的占用cpu和硬盘的资…...

政安晨:【深度学习神经网络基础】(九)—— 在深度学习神经网络反向传播训练中理解梯度

目录 简述 理解梯度 什么是梯度 计算梯度 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 简述 在深度…...

免费的 ChatGPT、GPTs、AI绘画(国内版)

🔥博客主页:白云如幻❤️感谢大家点赞👍收藏⭐评论✍️ ChatGPT3.5、GPT4.0、GPTs、AI绘画相信对大家应该不感到陌生吧?简单来说,GPT-4技术比之前的GPT-3.5相对来说更加智能,会根据用户的要求生成多种内容甚…...

UniApp 微信小程序:在 onLaunch 中等待异步方法执行完成后,再调用页面中的接口

最近遇到了一个问题:在 App.vue 中的 onLaunch 中调用登录接口时,由于异步登录尚未完成就调用了 index 页面的接口,导致 token 异常。如何确保页面在 App 中的 onLaunch 执行完毕后再继续执行呢? 在网上查阅了一些资料&#xff0c…...

【招贤纳士】长期有效

【招贤纳士】长期有效,有意者联系 一、SLAM算法工程师工作内容:任职资格: 二、规划算法工程师工作内容:任职资格: 三、感知算法工程师岗位职责:任职要求:加分项: 四、传感器系统工程…...

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

LLM基础1_语言模型如何处理文本

基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...