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

树莓派4B_OpenCv学习笔记6:OpenCv识别已知颜色_运用掩膜

今日继续学习树莓派4B 4G:(Raspberry Pi,简称RPi或RasPi)

 本人所用树莓派4B 装载的系统与版本如下:

 版本可用命令 (lsb_release -a) 查询:

 Opencv 版本是4.5.1:

学了这些OpenCv的理论性知识,不进行实践实在是太无聊了,今天就尝试使用OpenCv,已知颜色信息,来识别一张图片的颜色 ,并输出掩膜图像,坐标范围等。

目录

掩膜的基本知识:

RGB颜色控件与HSV:

RGB颜色空间

HSV颜色空间

准备需要识别的图片:

编写RGB转BGR程序:

 测试转换程序:

编写颜色识别程序:

测试颜色识别程序:

更改掩膜颜色:

进一步获取掩膜的有用参数:

1、计算掩膜覆盖的像素:

2、找到掩膜中物体的边界框(Bounding Box):

3、计算掩膜中物体的质心(Centroid):

4、计算掩膜中物体的面积:

 综合测试效果如下:

整体测试工程下载:

网上查阅资料贴出:


掩膜的基本知识:

掩膜是由0和1组成的一个二进制图像

当在某一功能中应用掩膜时,1值区域被处理,被屏蔽的0值区域不被包括在计算中。通过制定的数据值,数据范围,有限或无限值,感兴趣区和注释文件来定义图像掩膜,也可以应用上述选项的任意组合作为输入来建立掩膜。

 以下定义为AI生成:

**掩膜(Mask)**是一个二维数组(或矩阵),通常与图像具有相同的尺寸,但数据类型通常是二值化的(例如,8位无符号整数,其中0表示“无”或“透明”,而非零值(如255)表示“有”或“不透明”)。掩膜在图像处理中主要用于以下目的:

  1. 区域选择:你可以使用掩膜来选择图像中的特定区域进行进一步处理。例如,你可能只对图像中的某个特定形状或区域感兴趣,那么你可以创建一个只在该区域内部为1(或255),其他地方为0的掩膜,然后将其与原始图像相乘,从而只保留你感兴趣的区域。
  2. 形态学操作:在形态学图像处理中,如腐蚀(erosion)和膨胀(dilation),掩膜被用作结构元素。这些结构元素定义了邻域的形状和大小,用于确定像素的邻域如何影响该像素的最终值。
  3. 融合和混合:掩膜也可以用于将两个或多个图像融合在一起。例如,你可以使用掩膜来定义如何将一个图像的内容叠加到另一个图像上,只在掩膜为1的位置进行叠加。
  4. 图像修复:在图像修复或去噪中,掩膜可以帮助确定哪些像素需要被修复或替换。

RGB颜色控件与HSV:

在已知的图像中我们常用RGB的三元值大小来描述一个颜色,但RGB不适用于环境变化的情况,因此需要将RGB转换为HSV的描述形式,

这里需要注意的是,通过软件获取RGB数值后,传给Opencv程序的顺序应该是BGR!

RGB颜色空间

RGB(红、绿、蓝)颜色控件是基于RGB颜色空间的。RGB颜色空间是工业界的一种颜色标准,它使用三个颜色通道(红色、绿色和蓝色)来表示颜色。每个通道都有256个可能的值(从0到255),因此RGB颜色空间可以表示约16,777,216种不同的颜色(即256^3)。

特点

  1. 基础性:RGB颜色空间是图像处理中最基本、最常用的颜色空间,因为它与大多数显示设备和打印设备直接相关。
  2. 面向硬件:RGB颜色空间是面向硬件的,因此它在计算机图形和图像处理中非常常见。
  3. 受亮度影响:RGB颜色空间的三个分量(红、绿、蓝)都与亮度密切相关。因此,当亮度改变时,三个分量都会相应地改变。
  4. 均匀性较差:RGB颜色空间是一种均匀性较差的颜色空间,因为人眼对这三种颜色分量的敏感程度是不一样的。

HSV颜色空间

HSV(色调、饱和度、明度)颜色控件是基于HSV颜色空间的。HSV颜色空间比RGB更接近人们对彩色的感知经验,它使用色调(Hue)、饱和度(Saturation)和明度(Value)三个参数来描述颜色。

特点

  1. 直观性:HSV颜色空间非常直观地表达颜色的色调、鲜艳程度和明暗程度,方便进行颜色的对比。
  2. 稳定性:HSV颜色空间在面对光照变化时比RGB更稳定,能更好地反映颜色的本质。
  3. 适合图像处理:由于HSV颜色空间的直观性和稳定性,它在图像处理中比RGB更受欢迎。例如,在HSV颜色空间下,更容易跟踪某种颜色的物体,常用于分割指定颜色的物体。
  4. 参数范围:在HSV颜色空间中,色调(H)的取值范围为0°到360°,饱和度(S)和明度(V)的取值范围通常为0%到100%。

准备需要识别的图片:

这里我使用Photoshop随手画了个图片,并使用取色器获取到了

其中蓝色区域RGB的数值:

B:        255

G:        97

R:        34

# coding=utf-8
import sys
import numpy as np
import cv2blue = sys.argv[1]
green = sys.argv[2]
red = sys.argv[3]  color = np.uint8([[[blue, green, red]]])
hsv_color = cv2.cvtColor(color, cv2.COLOR_BGR2HSV)hue = hsv_color[0][0][0]print("Lower bound is :"),
print("[" + str(hue-10) + ", 100, 100]\n")print("Upper bound is :"),
print("[" + str(hue + 10) + ", 255, 255]")

编写RGB转BGR程序:

 编写以下程序能辅助我们将已知颜色的BGR数值转换为HSV形式:

# coding=utf-8
import sys
import numpy as np
import cv2blue = sys.argv[1]
green = sys.argv[2]
red = sys.argv[3]  color = np.uint8([[[blue, green, red]]])
hsv_color = cv2.cvtColor(color, cv2.COLOR_BGR2HSV)hue = hsv_color[0][0][0]print("Lower bound is :"),
print("[" + str(hue-10) + ", 100, 100]\n")print("Upper bound is :"),
print("[" + str(hue + 10) + ", 255, 255]")

 测试转换程序:

1、现将编写好的脚本传输给树莓派(通过mobaxterm的SSH远程连接):

2、在终端输入命令运行得到运算结果如下:

编写颜色识别程序:

1、接下来编写颜色识别程序如下:

注意:       如果你使用的图片需要检测的已知BGR与我不一致,那你需要再回到上一步获取对应HSV值,并在代码中将这俩行替换:

        

# 这行指定了文件的编码格式为utf-8
# coding=utf-8 import cv2
import numpy as np# 使用cv2.imread函数读取指定路径下的图片文件。第二个参数1表示读取彩色图像(BGR格式)
img = cv2.imread('/home/pi/Pictures/Colour_test1.jpg', 1)# 使用cv2.resize函数调整图像大小。这里,目标宽度和高度被设置为(0,0),表示将按照给定的缩放因子fx和fy来缩放图像。  
# fx=0.2和fy=0.2表示图像在水平和垂直方向上都将缩小到原来的20%。 
#img = cv2.resize(img, (0,0), fx=0.2, fy=0.2)# 将图像从BGR色彩空间转换为HSV色彩空间。HSV色彩空间更适用于颜色范围检测,因为它基于色调(H)、饱和度(S)和亮度(V)。
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)# 定义一个NumPy数组,表示HSV色彩空间中颜色的下界。这里的数值代表色调、饱和度和亮度的最小值。 
lower_range = np.array([101, 100, 100], dtype=np.uint8)
# 定义一个NumPy数组,表示HSV色彩空间中颜色的上界。这里的数值代表色调、饱和度和亮度的最大值。  
upper_range = np.array([121, 255, 255], dtype=np.uint8)# 使用cv2.inRange函数根据指定的HSV颜色范围创建一个掩码图像。该掩码图像中,属于指定颜色范围的像素值为255(白色),其他像素值为0(黑色)。  
mask = cv2.inRange(hsv, lower_range, upper_range)# 使用cv2.imshow函数显示掩码图像,窗口标题为'mask'。  
cv2.imshow('mask',mask)
# 使用cv2.imshow函数显示原始图像(经过缩放和色彩空间转换后),窗口标题为'image'。  
cv2.imshow('image', img)while(1):
#等待用户按键,按下‘q’就释放资源退出程序key=cv2.waitKey(1)if key&0XFF==ord('q'):breakcv2.destroyAllWindows()

2、将图片SSH传输给树莓派:

注意:        图片位置需要与程序对应,这个请自行检查:

测试颜色识别程序:

发现能够将识别到的颜色掩膜输出:

更改掩膜颜色:

我们可以在之前程序基础上对掩膜的颜色进行更改:   只需添加一句:

然后就改变掩膜的颜色为灰色了:

进一步获取掩膜的有用参数:

1、计算掩膜覆盖的像素:

需要注意的是,这里的mask的值需要根据你的具体设置进行更改:

num_pixels = np.sum(mask == 255)  # 或者 np.count_nonzero(mask)  print(f"Number of pixels in the mask: {num_pixels}")

2、找到掩膜中物体的边界框(Bounding Box)

通过寻找掩膜中所有非零像素的边界,您可以得到这些像素在图像中的位置。

# 使用OpenCV的findContours函数找到轮廓  
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)  # 假设我们只关心最大的轮廓(即最大的物体)  
if contours:  c = max(contours, key=cv2.contourArea)  x, y, w, h = cv2.boundingRect(c)  print(f"Bounding box of the object: ({x}, {y}), ({w}, {h})")

3、计算掩膜中物体的质心(Centroid)

质心是物体所有像素的加权平均位置。

M = cv2.moments(contours[0]) if contours else None  
if M != None:  cX = int(M["m10"] / M["m00"])  cY = int(M["m01"] / M["m00"])  print(f"Centroid of the object: ({cX}, {cY})")

4、计算掩膜中物体的面积

这可以通过计算掩膜中非零像素的数量来实现。

area = cv2.contourArea(contours[0]) if contours else 0  
print(f"Area of the object: {area}")

 综合测试效果如下:

整体测试工程下载:

https://download.csdn.net/download/qq_64257614/89426048

网上查阅资料贴出:

[树莓派基础]7.树莓派OpenCV颜色识别案例讲解_哔哩哔哩_bilibili

 opencv(12): 掩膜Mask_opencv mask-CSDN博客

相关文章:

树莓派4B_OpenCv学习笔记6:OpenCv识别已知颜色_运用掩膜

今日继续学习树莓派4B 4G:(Raspberry Pi,简称RPi或RasPi) 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1: 学了这些OpenCv的理论性知识,不进行实践实在…...

ZSH 配置

ZSH 配置 1. 安装 ZSH2. 安装 oh my zsh3. 安装插件3.1 autojump3.2 zsh-autosuggestions 1. 安装 ZSH sudo apt-get install zsh 完成安装后需设置当前用户使用 zsh: chsh -s /bin/zsh 重启后即可使用 2. 安装 oh my zsh 安装 oh my zsh 需先安装 git。 自动安装…...

LogicFlow 学习笔记——5. LogicFlow 基础 主题 Theme

主题 Theme LogicFlow 提供了设置主题的方法,便于用户统一设置其内部所有元素的样式。设置方式有两种: 初始化LogicFlow时作为配置传入初始化后,调用LogicFlow的 setTheme 方法 主题配置参数见主题API 配置 new LogicFlow 时作为将主题配…...

Centos7.9使用kubeadm部署K8S集群

Centos7.9使用kubeadm部署K8S集群 使用kubeadm部署一个k8s集群,单master2worker节点。 1. 环境信息 操作系统:CentOS 7.9.2009内存: 2GBCPU: 2网络: 能够互访,能够访问互联网 hostnameip备注k8s-master192.168.0.51masterk8s-node1192.16…...

VB.net调用VC DLL(二)

参考文献5,讲了在C程序中直接调用DLL和lib的函数方法,不是通过编译器连接方式 也讲了在非C程序中直接调用DLL和lib的函数方法。 实操了一下,建了win32dll项目 新建.h文件和.cpp文件 .h文件中加: void __stdcall funcA(double…...

社团管理系统

用Spring Boot、Vue.js和MyBatis实现社团管理系统 温馨提示:项目源代码获取方式见文末 摘要 本文探讨了如何使用Spring Boot作为后端框架,Vue.js作为前端框架,以及MyBatis作为数据库持久层框架,构建一个社团管理系统。该系统旨…...

网站的文章起到什么作用

1.便于用户了解产品服务 如果想要获得更多的用户访问或者转化率,那么网站就得需要高质量、高原创的文章,通过文章可以让用户更好的了解公司的产品和服务,用户会根据自己的需求去选择服务类型,从而可以给公司产生业务订单&am…...

Science | 稀土开采威胁马来西亚的生物多样性

马来西亚是一个生物多样性热点地区,拥有超过17万种物种,其中1600多种处于濒临灭绝的风险。马来西亚的热带雨林蕴藏了大部分的生物多样性,并为全球提供重要的生态系统效益,同时为土著社区带来经济和文化价值。同时马来西亚具有可观…...

pandas read_csv跳过有错的行

在使用Pandas的read_csv函数时,如果遇到格式错误或其他导致读取失败的行,Pandas默认会抛出异常。但如果你想让Pandas自动跳过这些错误行,可以使用error_bad_linesFalse参数。这将使Pandas在遇到格式错误的行时,忽略这些行而不是中…...

VRChat 2024年裁员原因与背景深度分析

VRChat,作为2022年元宇宙/VR社交领域的巨头,近期在2024年宣布裁员计划,其背后原因和背景值得业界尤其是仍在纯元宇宙虚拟空间创业的同仁们重点关注。 一、创始人决策失误 根据CEO的邮件披露,VRChat的创始人因缺乏经验和过度自信…...

mybatisplus 笔记

int isDelete userRoleMapper.delete(new LambdaQueryWrapper<UserRole>().in(UserRole::getUserId, roleUserDTO.getUserId()).in(UserRole::getRoleId, roleUserDTO.getRoleId()));LambdaQueryWrapper<UserRole>: LambdaQueryWrapper 是 MyBatis Plus 提供的一个…...

Shell脚本(.sh文件)如何执行完毕之后不自动关闭?

Shell脚本异常傲娇&#xff0c;出错后、执行完根本不给你机会让你查看报错信息、输出信息&#xff0c;直接闪退。 废话不多说&#xff0c;调教方法如下&#xff0c;直接在Shell脚本末尾加上如下代码&#xff1a; 1、实现方式一 1.1 使用read命令达到类似bat中的pause命令效果…...

苏州辰安塑业携塑料托盘、塑料物流箱解决方案亮相2024杭州快递物流展

苏州辰安塑业携塑料托盘、吹塑托盘、塑料卡板箱、塑料周转箱、塑料物流箱、塑料垃圾桶解决方案盛装亮相2024杭州快递物流展&#xff01; 展位号&#xff1a;3C馆A51 苏州辰安塑业有限公司&#xff0c;是一家专业从事塑料托盘、吹塑托盘、塑料卡板箱、塑料周转箱、塑料物流箱、…...

大模型应用开发技术:Multi-Agent框架流程、源码及案例实战(二)

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…...

Flutter 实现dispose探测控件

文章目录 前言一、什么是dispose探测控件&#xff1f;1、通常情况2、使用dispose探测控件 二、如何实现1、继承StatefulWidget2、定义dipose回调3、定义child4、重载Dispose方法5、build child 三、完整代码四、使用示例1、基本用法2、设置定义数据 总结 前言 开发flutter一般…...

如何定义和衡量一个产品的成功?

定义和衡量一个产品的成功是一个多维度的过程&#xff0c;涉及用户满意度、市场表现、商业成果和技术实现等多个方面。以下是几个关键点&#xff0c;可以帮助产品经理在面试中全面阐述这一话题&#xff1a; 用户层面的成功&#xff1a; 用户满意度&#xff1a;通过用户调研、N…...

微调大模型 - 面向学术论文的AI大模型

1、优化学术交流: 该项目专注于优化学术文献的阅读、润色和写作过程,提供了实用化的交互接口。 2、模块化和可扩展性: 项目设计模块化,支持自定义快捷按钮和函数插件,便于用户根据自己的需求进行扩展。 3、多语言和多模型支持: 支持多种语言的论文翻译和总结,同时可以并行…...

java溯本求源之基础(二十四)之--常见List的实现共同点

兄弟们终于到了上代码讲代码的环节了&#xff0c;之前的一些代码都是小打小闹&#xff0c;现在才是重头戏&#xff0c;今天来简单说说一些集合&#xff0c;首先这些都是基于数组实现的&#xff0c;当然Collections.emptyList不算奥&#xff0c;别犟。剩下的不多墨迹直接上重点&…...

gin连接redis

使用Gin框架连接Redis&#xff0c;需要先安装Redis客户端库&#xff0c;例如go-redis。然后&#xff0c;你可以创建一个Redis客户端实例&#xff0c;并在Gin路由处理函数中使用它。以下是一个简单的示例&#xff1a; 1. 首先&#xff0c;安装go-redis库&#xff1a; bash go g…...

深度学习训练——batch_size参数设置过大反而训练更耗时的原因分析

&#x1f4aa; 专业从事且热爱图像处理&#xff0c;图像处理专栏更新如下&#x1f447;&#xff1a; &#x1f4dd;《图像去噪》 &#x1f4dd;《超分辨率重建》 &#x1f4dd;《语义分割》 &#x1f4dd;《风格迁移》 &#x1f4dd;《目标检测》 &#x1f4dd;《暗光增强》 &a…...

图卷积神经网络自编码器天线优化设计方法【附代码】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导&#xff0c;毕业论文、期刊论文经验交流。 ✅ 专业定制毕设、代码 ✅如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;天线结构图表示与变分图自编码器代理模型&#xff1a…...

5分钟掌握ViGEmBus:Windows游戏控制器模拟终极指南

5分钟掌握ViGEmBus&#xff1a;Windows游戏控制器模拟终极指南 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus ViGEmBus是一款强大的Windows内核级驱动程序&…...

避坑指南:SV检测结果里那些奇怪的‘BND’和符号,到底在说什么?

结构变异检测实战&#xff1a;如何破译VCF文件中的BND密码 当你第一次打开SV检测生成的VCF文件时&#xff0c;那些DEL(缺失)和DUP(重复)的标签还算友好&#xff0c;但突然出现的BND(易位)和像[chr12:...[T、]chr12:...]A这样的神秘符号&#xff0c;是不是让你瞬间怀疑自己是否在…...

如何快速掌握WarcraftHelper:魔兽争霸III现代化优化的终极指南

如何快速掌握WarcraftHelper&#xff1a;魔兽争霸III现代化优化的终极指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 你是否还记得那些年在《魔兽…...

抖音无水印下载神器:3分钟搞定批量下载,小白也能轻松上手

抖音无水印下载神器&#xff1a;3分钟搞定批量下载&#xff0c;小白也能轻松上手 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser …...

CANN/asc-devkit make_int2向量构造函数

make_int2 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言&#xff0c;原生支持C和C标准规范&#xff0c;主要由类库和语言扩展层构成&#xff0c;提供多层级API&#xff0c;满足多维场景算子开发诉求。 项目地址: https://gitcode.com/…...

批量生成内容?先优化你的Prompt!

很多人用 GPT 批量生成内容时&#xff0c;问题不是模型不够强&#xff0c;而是指令太模糊。 比如&#xff1a;帮我写一些小红书文案。 生成 50 个标题。 给我做一批产品介绍。这些指令看似省事&#xff0c;实际很容易带来三个问题&#xff1a; 输出风格不稳定内容重复、泛泛而谈…...

【c++面向对象编程】第4篇:类与对象(三):拷贝构造函数与深浅拷贝问题

目录 一、一个崩溃的程序 二、拷贝构造函数是什么&#xff1f; 调用时机&#xff08;三个场景&#xff09; 三、浅拷贝 vs 深拷贝 浅拷贝&#xff08;默认行为&#xff09; 深拷贝&#xff08;正确的做法&#xff09; 四、什么时候必须自己写拷贝构造函数&#xff1f; 一…...

ARM TPIU调试接口原理与应用实践

1. ARM TPIU调试接口深度解析在嵌入式系统开发中&#xff0c;调试接口的设计与实现往往是决定开发效率的关键因素。作为ARM CoreSight调试架构的重要组成部分&#xff0c;Trace Port Interface Unit(TPIU)承担着处理器跟踪数据格式化与输出的核心功能。本文将深入剖析TPIU的寄存…...

【STM32F407启动探秘】从复位向量到main():深入剖析启动文件与BOOT模式

1. STM32F407启动过程全景图 当你按下STM32F407开发板的电源按钮时&#xff0c;芯片内部就像被施了魔法一样开始运转。这个看似简单的上电过程&#xff0c;实际上隐藏着一套精密的启动机制。作为开发者&#xff0c;理解这个过程就像掌握了一把打开STM32内核奥秘的钥匙。 我刚开…...