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

news2025/1/13 13:46:28

今日继续学习树莓派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 cv2
 
blue = 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 cv2
 
blue = 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'):
        break

cv2.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.coloradmin.cn/o/1817208.html

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

相关文章

Roboflow 图片分类打标

今天准备找个图片标注工具,在网上搜了一下,看 Yolo 的视频中都是用 Roboflow 工具去尝试了一下,标注确实挺好用的,可以先用一些图片训练一个模型,随后用模型进行智能标注。我主要是做标注然后到处到本地进行模型的训练…

springboot的WebFlux 和Servlet

Spring Boot 中的 Servlet 定义: 在 Spring Boot 中,Servlet 应用程序通常基于 Spring MVC,它是一个基于 Servlet API 的 Web 框架。Spring MVC 提供了模型-视图-控制器(MVC)架构,用于构建 Web 应用程序。…

【Mac】增加 safari 体验的插件笔记

Safari 本身的功能不全面,探索积累了一点插件笔记,提升使用体验;但后面因为插件或会影响运行速度,就全部都禁止了。做个笔记记录一下。 Cascadea 相当于 stylus,可以自定义页面。测试过几个,只有几个可行。…

Java:爬虫htmlunit抓取a标签

如果对htmlunit还不了解的话可以参考Java:爬虫htmlunit-CSDN博客 了解了htmlunit之后,我们再来学习如何在页面中抓取我们想要的数据,我们在学习初期可以找一些结构比较清晰的网站来做测试爬取,首先我们随意找个网站如下&#xff…

【StableDiffusion】Embedding 底层原理,Prompt Embedding,嵌入向量

Embedding 是什么? Embedding 是将自然语言词汇,映射为 固定长度 的词向量 的技术 说到这里,需要介绍一下 One-Hot 编码 是什么。 One-Hot 编码 使用了众多 5000 长度的1维矩阵,每个矩阵代表一个词语。 这有坏处&#xff0c…

美国空军发布类ChatGPT产品—NIPRGPT

6月11日,美国空军研究实验室(AFRL)官网消息,空军部已经发布了一款生成式AI产品NIPRGPT。 据悉,NIPRGPT是一款类ChatGPT产品,可生成文本、代码、摘要等内容,主要为为飞行员、文职人员和承包商提…

Python 中浅拷贝(copy)和深拷贝(deepcopy)

1. 浅拷贝: 它创建一个新的对象,但对于原始对象内的子对象(如列表中的嵌套列表),只是复制了引用。例如: import copy original_list [1, 2, 3] shallow_copied_list copy.copy(original_list) original_…

【PIXEL】2024年 Pixel 解除 4G限制

首先在谷歌商店下载 Shizuku 和 pixel IMS 两个app 然后打开shizuku ,按照它的方法启动 推荐用adb 启动( 电脑连手机 ,使用Qtscrcpy最简洁) 一条指令解决 shell sh /storage/emulated/0/Android/data/moe.shizuku.privileged.ap…

Chrome/Edge浏览器视频画中画可拉动进度条插件

目录 前言 一、Separate Window 忽略插件安装,直接使用 注意事项 插件缺点 1 .无置顶功能 2.保留原网页,但会刷新原网页 3.窗口不够美观 二、弹幕画中画播放器 三、失败的尝试 三、Potplayer播放器 总结 前言 平时看一些视频的时候&#xff…

ListView的使用

📖ListView的使用 ✅1. 创建ListView✅2. 创建适配器Adapter✅3. 开始渲染数据 主要3步骤: 创建ListView 创建适配器Adapter,和Adapter对应的视图 开始渲染数据 效果图: ✅1. 创建ListView 例如现有DemoActivity页面&#xf…

C# WinForm —— 33 ContextMenuStrip介绍

1. 简介 右键某个控件/窗体时,弹出来的菜单,比如VS中右键窗体,弹出来的这个菜单: 和MenuStrip类似,ContextMenuStrip主菜单下面可以有子菜单,子菜单下面可以有下一级子菜单 2. 属性 和MenuStrip一样 …

国内服务器安装 Docker 服务和拉取 dockerhub 镜像

前提: 有一台海外的VPS,目的是安装dockerhub镜像.适用debian系统 1: 安装 docker-ce (国内服务器) sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/…

如何免费用 Qwen2 辅助你翻译与数据分析?

对于学生用户来说,这可是个好消息。 开源 从前人们有一种刻板印象——大语言模型里好用的,基本上都是闭源模型。而前些日子,Meta推出了Llama3后,你可能已经从中感受到现在开源模型日益增长的威力。当时我也写了几篇文章来介绍这个…

【DevOps】Ubuntu基本使用教程

目录 引言 Ubuntu简介 安装Ubuntu 准备工作 创建启动盘 安装过程 桌面环境 基本操作 定制桌面 文件管理 文件操作 文件权限 软件管理 安装软件 更新软件 系统设置 用户账户 网络设置 电源管理 命令行操作 常用命令 管理权限 安全与维护 系统更新 备份…

pdf添加书签的软件,分享3个实用的软件!

在数字化阅读日益盛行的今天,PDF文件已成为我们工作、学习和生活中不可或缺的一部分。然而,面对海量的PDF文件,如何高效地进行管理和阅读,成为了许多人关注的焦点。其中,添加书签功能作为提高PDF文件阅读体验的重要工具…

JetLinks开源物联网平台社区版部署教程

1.上github搜素jetlinks 2.找到源代码,并且下载到本地。 3.项目下载完成之后,还需要另外下载三个核心依赖模块。在github找到jetlinks。 4.点击进去下载,下载完成之后,你会发现里面有三个文件夹是空白的,先不用理会&am…

【云计算】Docker部署Nextcloud网盘并实现随地公网远程访问

配置文件 切换root权限,新建一个nextcloud的文件夹,进入该目录,创建docker-compose.yml [cpslocalhost ~]$ su root Password: 666666 [rootlocalhost cps]# ls Desktop Documents Downloads Music Pictures Public Templates Vide…

Day 16:3040. 相同分数的最大操作数目II

Leetcode 相同分数的最大操作数目II 给你一个整数数组 nums ,如果 nums 至少 包含 2 个元素,你可以执行以下操作中的 任意 一个: 选择 nums 中最前面两个元素并且删除它们。选择 nums 中最后两个元素并且删除它们。选择 nums 中第一个和最后一…

React基础教程(07):条件渲染

1 条件渲染 使用条件渲染,结合TodoList案例,进行完善,实现以下功能: 当列表中的数据为空的时候,现实提示信息暂无待办事项当列表中存在数据的时候,提示信息消失 这里介绍三种实现方式。 注意这里的Empty是…

STM32项目分享:智能小区充电桩系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板打样焊接图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片: 哔哩哔哩视频链接: https://www.bilibili.c…