1-7 掩膜的运用 opencv树莓派4B 入门系列笔记

news2024/9/21 12:48:18

目录

一、提前准备

二、代码详解

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'):
        break
 
cv2.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'):
        break
 
cv2.destroyAllWindows()

五、完整代码贴出

(持续更新中)opencv树莓派4B入门系列笔记6~10完整工程源码资源-CSDN文库

持续更新中……

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

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

相关文章

阿里云飞天洛神云网络子系统“齐天”:超大规模云网络智能运维的“定海神针”

云布道师 引言:近日,在南京上秦淮国际文化交流中心举办第八届未来网络发展大会上,阿里云凭借“超大规模云网络智能运维系统”一举斩获由中国通信学会专家组评选的“未来网络领先创新科技成果奖”,本次获奖也体现出阿里云在云网络技…

在VB.net中,如何把20240906转化成日期格式

标题 vb.net中,如何把20240906转化成日期格式 正文 在 VB.NET 中,将一个数字字符串(如 "20240906")转换为日期格式,你可以使用 DateTime.Parse 或 DateTime.TryParse 方法。这些方法可以将符合日期格式的字符…

响应式单位rpx搭配UI产品工具应用

rpx 即响应式 px,一种根据屏幕宽度自适应的动态单位。以 750 宽的屏幕为基准,750rpx 恰好为屏幕宽度 原本的px像素它是一个固定单位,它并不会随着你屏幕的改变而改变,相当于一个死值,不懂得灵活变通 相反,rpx会随着屏幕改变而改变,因为我们设置的高是200…

网络安全基础—加解密原理与数字证书

目录 1) 对称加密和非对称加密 Ⅰ 对称加密算法 Ⅱ 非对称加密算法 Ⅲ 对称和非对称加密比较: 2)数据加密--数字信封 3)数据验证 - 数字签名 4)数字证书 Ⅰ 数字证书格式 Ⅱ 证书的颁发 Ⅲ 证书验证: .验证…

【基础算法总结】双指针

目录 一,双指针算法介绍二,算法原理和代码实现283.移动零1089.复写零202.快乐数11.盛最多水的容器611.有效三角形的个数LRC179.和为s的两个数15.三数之和18.四数之和 三,算法总结 一,双指针算法介绍 双指针算法是基础算法之一&am…

【机器学习】朴素贝叶斯方法的概率图表示以及贝叶斯统计中的共轭先验方法

引言 朴素贝叶斯方法是一种基于贝叶斯定理的简单概率模型,它假设特征之间相互独立。 文章目录 引言一、朴素贝叶斯方法的概率图表示1.1 节点表示1.2 边表示1.3 无其他连接1.4 总结 二、朴素贝叶斯的应用场景2.1 文本分类2.2 推荐系统2.3 医疗诊断2.4 欺诈检测2.5 情…

菜鸟入门Docker

初始Docker Docker的概念 Docker的用途 DOcke的安装 Docker架构 配置Docker镜像加速器 Docker常用命令 Docker服务相关的命令。 Docker镜像相关的命令 Docker容器相关的命令 容器的数据卷 数据卷的概念和作用 配置数据卷 Docker应用部署 Docker部署mysql Docker…

RP2040 C SDK clocks时钟源配置使用

RP2040 C SDK clocks时钟源配置使用 🌿RP2040时钟源API函数文档:https://www.raspberrypi.com/documentation/pico-sdk/hardware.html#group_hardware_clocks 🍁RP2040时钟树: 系统时钟源可以来自外部时钟输入(exte…

<数据集>二维码识别数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:1601张 标注数量(xml文件个数):1601 标注数量(txt文件个数):1601 标注类别数:1 标注类别名称:[QR] 序号类别名称图片数框数1QR16016286 使用标注工具:l…

外观模式facade

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/facade 为程序库、 框架或其他复杂类提供一个简单的接口 把要做的事全放在一个类里给他做了,然后要用的时候直接创建这个类的实例

springboot项目引入Sentinel熔断

本文是springboot项目nacos进行引入&#xff0c;sentiel需自行按照部署 1.springboot包要是2.2.5或以上 <dubbo.version>2.7.7</dubbo.version><spring-boot.version>2.2.5.RELEASE</spring-boot.version><chainwork-boot.version>1.0.5-SNAPSH…

.Net C#检验科LIS系统成品源码 ,LIS 系统与 HIS 系统的连接方式详解

目录 系统定义与功能 应用特点 检验科 LIS 系统与 HIS 系统的连接方式 1、接口设计与数据交换 2、网络架构 3、数据格式与标准化 4、信息共享与协同工作 5、数据安全与隐私保护 6、技术支持与维护 LIS系统成品源码 总结 系统定义与功能 LIS系统&#xff0c;全称为实验…

python tkinter 简介

ttk模块是tkinter模块中非常重要的模块&#xff0c;相当于升级版的tkinter模块。 ttk模块包含18个组件&#xff0c;其中12个组件在tkinter模块中已经存在。这12个模块分别为Button&#xff08;按钮&#xff09;​、Checkbutton&#xff08;复选框&#xff09;​、Entry&#x…

OrangePi AIpro 香橙派 昇腾 Ascend C 算子开发 与 调用 - 通过aclnn调用的方式调用AddCustom算子

OrangePi AIpro 香橙派 昇腾 Ascend C 算子开发 与 调用 通过aclnn调用的方式调用 - AddCustom算子 - 单算子API执行(aclnn) 多种算子调用方式 *开发时间使用场景调用方式运行硬件基于Kernel直调工程&#xff08;快速&#xff09;少单算子调用&#xff0c;快速验证算法逻辑IC…

MySQL复习3

视图 视图&#xff08;view&#xff09;是一种虚拟存在的表&#xff0c;是一个逻辑表&#xff0c;本省没有数据&#xff0c;内容由查询定义。 基表&#xff1a;用来创建视图的表叫做基表 通过视图&#xff0c;我们可以查看基表的部分数据。视图数据来自定义视图的查询中使用…

[Go]-抢购类业务方案

文章目录 要点&#xff1a;1. 抢购/秒杀业务的关键挑战2. 技术方案3.关键实现点4.性能优化建议5.其他考虑因素 细节拆分&#xff1a;1. **高并发处理**2.**限流与防护**3.**库存控制**4. **异步处理**5. **数据一致性**6. **常用架构设计**7. **代码示例**8. 进一步优化9. 注意…

鸿蒙(API 12 Beta6版)图形加速【OpenGL ES平台内插模式】超帧功能开发

超帧内插模式是利用相邻两个真实渲染帧进行超帧计算生成中间的预测帧&#xff0c;即利用第N-1帧和第N帧真实渲染帧预测第N-0.5帧预测帧&#xff0c;如下图所示。由于中间预测帧的像素点通常能在前后两帧中找到对应位置&#xff0c;因此内插模式的预测帧效果较外插模式更优。由于…

android studio 模拟器 loadlibrary failed with 126:找不到指定的模块

loadlibrary failed with 126:找不到指定的模块 解决方法 解决方法&#xff1a;设备管理器-> 显示适配器-> 禁用 AMD Redeon 重启AndroidStudio

【学习笔记】 陈强-机器学习-Python-Ch14 支持向量机

系列文章目录 监督学习&#xff1a;参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归&#xff08;SAheart.csv&#xff09; 【学习笔记】 陈强-机器学习-Python-…

示波器在嵌入式中的作用和使用

你是否在开发嵌入式系统时&#xff0c;遇到过调试电路和信号分析的困难&#xff1f; 在嵌入式开发中&#xff0c;硬件调试和信号分析是必不可少的环节&#xff0c;而示波器作为一种强大的工具&#xff0c;能够帮助我们深入了解信号特性并解决难题。那么&#xff0c;如何正确使用…