1-7 掩膜的运用 opencv树莓派4B 入门系列笔记
目录
一、提前准备
二、代码详解
num_pixels = np.sum(mask == 255)
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
c = max(contours, key=cv2.contourArea)
x, y, w, h = cv2.boundingRect(c)
M = cv2.moments(contours[0]) if contours else None
cX = int(M["m10"] / M["m00"])
area = cv2.contourArea(contours[0]) if contours else 0
三、运行结果
四、完整代码
五、完整代码贴出
一、提前准备
1、树莓派4B 及 64位系统
2、提前安装opencv库 以及 numpy库
3、保存一张图片
二、代码详解
1、图像覆盖掩膜
# 这行指定了文件的编码格式为utf-8
# coding=utf-8 import cv2
import numpy as np# 使用cv2.imread函数读取指定路径下的图片文件。第二个参数1表示读取彩色图像(BGR格式)
img = cv2.imread('/home/raspberry4B/Pictures/MD.jpg', 1)# 将图像从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)
2、计算掩膜覆盖的像素
# 计算掩膜覆盖的像素
num_pixels = np.sum(mask == 255) # 或者 np.count_nonzero(mask)
print(f"Number of pixels in the mask: {num_pixels}")
num_pixels = np.sum(mask == 255)
- 功能: 计算掩码图像中像素值为255的总数,即在指定颜色范围内的像素数量。
- 参数:
mask == 255: 生成一个与mask大小相同的布尔数组,其中像素值为255的对应位置为True。
- 结果: 返回符合条件的像素总数。
3、找到最大轮廓
# 使用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})")
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
- 功能: 使用
cv2.findContours函数在掩码图像中找到轮廓。 - 参数:
mask: 输入的二值图像。cv2.RETR_EXTERNAL: 仅检测外部轮廓,不考虑嵌套轮廓。cv2.CHAIN_APPROX_SIMPLE: 压缩水平、垂直和对角直线段,保留其端点。
- 结果: 返回的
contours是一个包含所有轮廓的列表。
c = max(contours, key=cv2.contourArea)
- 功能: 找到最大的轮廓,即具有最大面积的轮廓。
- 参数:
contours: 包含所有轮廓的列表。key=cv2.contourArea: 使用轮廓面积作为比较的关键字。
x, y, w, h = cv2.boundingRect(c)
- 功能: 使用
cv2.boundingRect函数为最大的轮廓计算边界框(bounding box)。 - 参数:
c: 最大的轮廓。
- 结果: 返回边界框的左上角坐标
(x, y)及其宽度w和高度h。
4、计算掩膜覆盖物体的质心
# 计算掩膜中物体的质心 质心是物体所有像素的加权平均位置
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})")
M = cv2.moments(contours[0]) if contours else None
- 功能: 计算轮廓的几何矩(moments)。
- 参数:
contours[0]: 使用第一个(最大)轮廓。
- 结果: 返回一个字典,包含计算出的所有几何矩。如果没有轮廓,返回
None。
cX = int(M["m10"] / M["m00"])
- 功能: 计算物体的质心(centroid)。
- 参数:
M["m10"]: 几何矩中的m10,即第一阶的x方向矩。M["m00"]: 几何矩中的m00,即零阶矩(面积)。
- 结果: 计算出质心的x坐标
cX。
5、计算掩膜物体的面积
# 计算掩膜中物体的面积 这可以通过计算掩膜中非零像素的数量来实现
area = cv2.contourArea(contours[0]) if contours else 0
print(f"Area of the object: {area}")
area = cv2.contourArea(contours[0]) if contours else 0
- 功能: 使用
cv2.contourArea函数计算轮廓的面积。 - 参数:
contours[0]: 使用第一个(最大)轮廓。
- 结果: 返回轮廓的面积。
6、主函数
# 使用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()
三、运行结果

四、完整代码
# 这行指定了文件的编码格式为utf-8
# coding=utf-8 import cv2
import numpy as np# 使用cv2.imread函数读取指定路径下的图片文件。第二个参数1表示读取彩色图像(BGR格式)
img = cv2.imread('/home/raspberry4B/Pictures/MD.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)# 计算掩膜覆盖的像素
num_pixels = np.sum(mask == 255) # 或者 np.count_nonzero(mask)
print(f"Number of pixels in the mask: {num_pixels}")# 使用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})")# 计算掩膜中物体的质心 质心是物体所有像素的加权平均位置
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})")# 计算掩膜中物体的面积 这可以通过计算掩膜中非零像素的数量来实现
area = cv2.contourArea(contours[0]) if contours else 0
print(f"Area of the object: {area}")# 使用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()
五、完整代码贴出
(持续更新中)opencv树莓派4B入门系列笔记6~10完整工程源码资源-CSDN文库
持续更新中……
相关文章:
1-7 掩膜的运用 opencv树莓派4B 入门系列笔记
目录 一、提前准备 二、代码详解 num_pixels np.sum(mask 255) contours, _ cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) c max(contours, keycv2.contourArea) x, y, w, h cv2.boundingRect(c) M cv2.moments(contours[0]) if contours…...
EG边缘计算网关连接华为云物联网平台(MQTT协议)
需求概述 实现一个流程:EG8200mini采集Modbus RTU数据,通过MQTT协议连接华为云物联网平台 Modbus RTU采集此处不做过多赘述,可参考其他案例(串口读取Modbus传感器数据)介绍。下文默认已经采集到Modbus RTU数据。 要…...
List中常见的方法和五种遍历方式
有序:存取的顺序一致 有索引:可以通过索引操作元素 可重复:存储的元素可以重复 package mylist;import java.util.ArrayList; import java.util.List;public class A01_LIstDemo1 {public static void main(String[] args) {List<String…...
华为 HCIP-Datacom H12-821 题库 (8)
有需要题库的可以看主页置顶 1.在 DHCP 运行过程中,如果客户端 IP 地址在相约过去 87.5%还没有完成续约的话,客户将发送什么报文进行再次续约? A、DHCP discover 广播报文 B、DHCP release 单播报文 C、DHCP request 广播报文 D、DHCP reques…...
12. GIS地图制图工程师岗位职责、技术要求和常见面试题
本系列文章目录: 1. GIS开发工程师岗位职责、技术要求和常见面试题 2. GIS数据工程师岗位职责、技术要求和常见面试题 3. GIS后端工程师岗位职责、技术要求和常见面试题 4. GIS前端工程师岗位职责、技术要求和常见面试题 5. GIS工程师岗位职责、技术要求和常见面试…...
ORACLE 统计信息的备份与恢复
备份 --需要先创建统计信息基础表 exec dbms_stats.create_stat_table(USER1,STAT_TIMESTAMP); --导出某个用户的所有统计信息 exec dbms_stats.export_schema_stats(USER1,STAT_TIMESTAMP);--测试(插入100条,更新统计信息,略) select num_rows,last_ana…...
2. GIS数据工程师岗位职责、技术要求和常见面试题
本系列文章目录: 1. GIS开发工程师岗位职责、技术要求和常见面试题 2. GIS数据工程师岗位职责、技术要求和常见面试题 3. GIS后端工程师岗位职责、技术要求和常见面试题 4. GIS前端工程师岗位职责、技术要求和常见面试题 5. GIS工程师岗位职责、技术要求和常见面试…...
Spark MLlib模型训练—文本算法 LDA(Latent Dirichlet Allocation)
Spark MLlib模型训练—文本算法 LDA(Latent Dirichlet Allocation) Latent Dirichlet Allocation(LDA)是一种用于主题建模的生成式概率模型,广泛应用于文本分析和自然语言处理。LDA 的目标是从一组文档中发现潜在的主题,并将每个文档表示为这些主题的概率分布。它通过推断…...
C++ ─── List的模拟实现
目录 编辑 一, List的模拟实现 二,代码实现 三、list和vector的区别 一, List的模拟实现 List 是一个双向循环链表,由于List的节点不连续,不能用节点指针直接作为迭代器,因此我们要对结点指针封装,来…...
Spring Boot详解
好的!Spring Boot 是一个基于 Spring 框架的项目,它为简化配置、快速启动项目而生。它使得构建独立运行、生产级别的 Spring 应用变得非常简单,让开发者专注于业务逻辑而不再被繁琐的配置所困扰。接下来,我将从以下几个方面为你详…...
Proxfier+burpsuite抓包配置问题
1、burp证书配置 导出证书 后缀为cer 打开浏览器设置 搜索证书--》点安全 管理证书 在圈起来的三个地方添加证书 2、Proxifer配置 配置代理服务器 配置ip和port 配置代理规则 注意画圈部分...
sqli-lab靶场学习(一)——Less1-4
前言 最近一段时间想切入安全领域,因为本身有做数据库运维工作,就打算从sql注入方向切入。而sql注入除了学习日常书本上的概念外,需要有个实践的环境,刚好看到sqli-lab这个靶场,就打算先用这个来学习。 安装部署 网上…...
el-select如何同时获取value和label?
在element ui 中 下拉框默认获取下拉框value的值,但是有时候根据 业务需求,我们需要label值也发送给后端,在这提供一下获取value、和label 的方式 1、在给el-option绑定:value值时使用对象的方式,将value和label同时绑定到:value…...
1.初识ChatGPT:AI聊天机器人的革命(1/10)
引言 在当今的数字化世界中,人工智能(AI)正以其独特的方式重塑我们的生活和工作。其中,AI聊天机器人作为人机交互的前沿技术,已经成为企业与客户沟通、提供个性化服务的重要工具。这些机器人通过模拟人类的对话方式&a…...
API安全 | 发现API的5个小tips
在安全测试目标时,最有趣的测试部分是它的 API。API 是动态的,它们比应用程序的其他部分更新得更频繁,并且负责许多后端繁重的工作。在现代应用程序中,我们通常会看到 REST API,但也会看到其他形式,例如 Gr…...
数据结构---单向链表
单向链表 //链表的创建 Link_t *create_link() {Link_t *plink malloc(sizeof(Link_t));if(NULL plink){perror("fail plink");return NULL;}plink->phead NULL;plink->clen 0;return plink; } //头插 int push_link_head(Link_t *plink, DataType data…...
基于STM32设计的ECG+PPG人体参数测量系统(华为云IOT)(217)
文章目录 一、前言1.1 项目介绍【1】开发背景【2】项目实现的功能【3】项目硬件模块组成1.2 设计思路【1】整体设计思路【2】整体构架【3】上位机开发思路【4】ESP8266工作模式配置1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】摘要【5】项目背景1.4 开发…...
SpringBoot教程(十五) | SpringBoot集成RabbitMq(死信队列、延迟队列)
SpringBoot教程(十五) | SpringBoot集成RabbitMq(死信队列、延迟队列) (一)死信队列使用场景具体用法前提示例: (二)延迟队列使用场景方法一:通过死亡队列实现方法二&…...
Dubbo依赖包
Dubbo 是一个高性能的 RPC 框架,用于构建分布式服务治理系统。要使用 Dubbo,项目中需要引入一些关键的依赖包。这些依赖包提供了 Dubbo 的核心功能、服务注册与发现、网络通信、序列化等能力。 一、Dubbo 核心依赖包 Dubbo 的核心依赖包包含了实现 RPC…...
webGIS后端程序员学习路线
webGIS后端程序员学习路线 1. GIS 基础知识 学习要点: 学习资源: 2. 后端编程基础 学习要点: 学习资源: 3. 地理数据库(Spatial Database) 学习要点: 学习资源: 4. 空间数…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释
以Module Federation 插件详为例,Webpack.config.js它可能的配置和含义如下: 前言 Module Federation 的Webpack.config.js核心配置包括: name filename(定义应用标识) remotes(引用远程模块࿰…...
