树莓派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博客

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

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

相关文章

qss实现登录界面美化

qss实现登录界面美化 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);// 去掉头部this->setWindowFlag(Qt::FramelessWindowHint);// 去掉空白部分th…

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

💪 专业从事且热爱图像处理,图像处理专栏更新如下👇: 📝《图像去噪》 📝《超分辨率重建》 📝《语义分割》 📝《风格迁移》 📝《目标检测》 📝《暗光增强》 &a…

Matlab进阶绘图第60期—带伪彩图的曲面图

带伪彩图的曲面图是曲面图与伪彩图的组合。 其中,伪彩图与曲面图的颜色用于表示同一个特征。 由于伪彩图无遮挡但不直观,曲面图直观但有遮挡,而将二者组合,可以实现优势互补。 本期就来分享一下带伪彩图的曲面图的绘制方法&…

保护密码安全,探讨密码加盐及其在Go语言中的实现

介绍 在当今数字化时代,个人隐私和数据安全成为了人们关注的焦点之一。随着网络犯罪的不断增加,用户的密码安全性变得尤为重要。密码加盐作为一种常见的安全措施,被广泛应用于密码存储和认证系统中。本文将深入探讨密码加盐的概念、重要性以…

轻松掌握 ChatGPT:2024 年完全新手向导,让你从零到精通!

**ChatGPT 是什么** ChatGPT 是 OpenAI 开发的人工智能对话机器人,基于 GPT-3.5 模型构建。它通过自然语言交流,为用户提供信息查询和问题解答的服务。 **ChatGPT 的实用功能** - 能够帮助撰写视频剧本、招聘广告等,用户只需提供具体要求。 …

抖音a_bogus,mstoken全参数爬虫逆向补环境2024-06-15最新版

抖音a_bogus,mstoken全参数爬虫逆向补环境2024-06-15最新版 接口及参数 打开网页版抖音,右键视频进入详情页。F12打开控制台筛选detail,然后刷新网页,找到请求。可以发现我们本次的参数目标a_bogus。a_bogus有时长度为168有时为172&#xf…

利用Python语言调用讯飞星火认知大模型接口实战指南

什么是API接口 API(应用程序编程接口)是一组规则,允许不同的软件系统相互通信。通过API,开发者可以访问外部系统的功能和数据,而无需了解其内部实现。 API接口就像一座桥梁,连接应用程序和服务。例如&…

2024-06-17 问AI: 在深度学习中,harmonic mean是什么?

文心一言 在深度学习中,**harmonic mean(调和平均数)**是一个用于评估模型性能的指标,特别是在处理不平衡的数据集或需要综合多个评估指标的场景中。以下是关于harmonic mean在深度学习中应用的详细解释: 定义&#…

重学java 71.网络编程

人生不是坐等暴风雨过去,而是学会在雨中起舞 —— 24.6.14 一、网络编程的基础概念 1.概述: 在网络通信协议下,不同计算机上运行的程序,进行数据传输 比如:通信、视频通话、网络、邮件 只要是计算机之间通过网络进行数据传输,就有…

nginx安装环境部署(完整步骤)

在部署nginx前,我们需要进行环境的部署 1.编译工具gcc,g,autoconf,automake ,make sudo apt-get install gcc g autoconf automake make 2.依赖库zlib,openssl,pcre 2.1 openssl下载地址 https://www.open…

大数据分析-二手车用户数据可视化分析

项目背景 在当今的大数据时代,数据可视化扮演着至关重要的角色。随着信息的爆炸式增长,我们面临着前所未有的数据挑战。这些数据可能来自社交媒体、商业交易、科学研究、医疗记录等各个领域,它们庞大而复杂,难以通过传统的数据处…

找工作小项目:day16-重构核心库、使用智能指针(2)

day16-重构核心库、使用智能指针 太多了分一篇写。 5、EventLoop 这是一个事件轮询,在这个部分会通过Poller进行就绪事件的获取,并将事件进行处理。 头文件 这里使用了一个智能指针并使用的是unique_ptr指向Poller红黑树,防止所有权不止…

线程池吞掉异常的case:源码阅读与解决方法

1. 问题背景 有一天给同事CR,看到一段这样的代码 try {for (param : params) {//并发处理,func无返回值ThreadPool.submit(func(param));} } catch (Exception e) {log.info("func抛异常啦,参数是:{}", param) } 我:你这段代码是…

六西格玛助力便携式产品功耗大降:打造绿色节能新标杆!

随着功能的日益强大,便携式电子产品的功耗问题也日益凸显,成为制约产品性能提升和用户体验改善的关键因素。为了应对这一挑战,越来越多的企业开始探索应用六西格玛方法来降低便携式产品的功耗,实现绿色节能的目标。 六西格玛是一…

Enhancing CLIP with GPT-4: Harnessing Visual Descriptions as Prompts

标题:用GPT-4增强CLIP:利用视觉描述作为提示 源文链接:Maniparambil_Enhancing_CLIP_with_GPT-4_Harnessing_Visual_Descriptions_as_Prompts_ICCVW_2023_paper.pdf (thecvf.com)https://openaccess.thecvf.com/content/ICCV2023W/MMFM/papers/Manipara…

FPGA - 滤波器 - IIR滤波器设计

一,IIR滤波器 在FPGA - 滤波器 - FIR滤波器设计中可知,数字滤波器是一个时域离散系统。任何一个时域离散系统都可以用一个N阶差分方程来表示,即: 式中,x(n)和y(n)分别是系统的输入序列和输出序列;aj和bi均为…

大腾智能正式入驻华为云

5月30日,大腾智能正式入驻华为云云商店。作为一家基于云原生的国产工业软件与数字化协同平台,大腾智能专注于推动企业数字化转型与升级,为企业提供一系列专业、高效的云原生数字化软件及方案。 华为云云商店,作为业界标杆&#xf…

【Win】识别Hyper-V虚拟机第一代与第二代及其差异

Hyper-V作为微软强大的虚拟化平台,允许用户创建虚拟机并安装各种操作系统。但您是否知道Hyper-V虚拟机分为第一代和第二代,并且它们之间存在一些关键差异?本文将指导您如何识别您的虚拟机属于哪一代,并详细解释两者之间的主要区别…

小白Linux提权

1.脏牛提权 原因: 内存子系统处理写入复制时,发生内存条件竞争,任务执行顺序异常,可导致应用崩溃,进一步执行其他代码。get_user_page内核函数在处理Copy-on-Write(以下使用COW表示)的过程中,可能产出竞态…

Avalonia for VSCode

1、在VSCode中编辑AvaloniaUI界面,在VSCode中搜索Avalonia,并安装。如下图,可以发现Avalonia for VSCode还是预览版。 2、 创建一个Avalonia 项目。 选择项目类型 输入项目名称 选择项目所在文件夹 打开项目 3、项目架构如下图。 4、builde…