5.RV1126-OPENCV 图形计算面积
一.图形面积、弧长计算介绍
前面我们已经把图形轮廓的检测、画框等功能讲解了一遍。这次主要结合轮廓检测的 API 去计算图形的面积,这些面积可以是矩形、圆形等等。图形面积计算和弧长计算常用于车辆识别、桥梁识别等重要功能,常用的 API 如 contourArea(主要用于曲线面积计算)、arcLength(主要用于计算轮廓的周长)、minAreaRect(主要用于计算最小外接矩形,矩形可以根据图像旋转而旋转)、boundingRect(主要用于计算最小外接矩形,矩形只能是方正的矩形)、rectangle(绘制矩形)、line(绘制线)等等。
二.计算面积的API
- contourArea:主要的用途是计算轮廓的曲线面积,例如计算下图白色区域面积,方法就是微积分计算。
CV_EXPORTS_W double contourArea( InputArray contour, bool oriented = false );
第一个参数:contour 指的是每一个轮廓的数据,也称之为轮廓的点
第二个参数:oriented 表示的是某一个方向上轮廓的面积值
返回值:计算后的轮廓面积
- arcLength :主要的用途是计算轮廓的周长,也就是图形形状本身的曲线弧度周长。例如下图计算的是每个点连接的长度,并计算出来。
CV_EXPORTS_W double arcLength( InputArray curve, bool closed );
第一个参数:curve 轮廓曲线的 2D 像素点
第二个参数:closed 轮廓或者曲线是否闭合标志,true 表示闭合
返回值:计算后的轮廓周长
- minAreaRect :主要的用途是计算最小的外接矩形,这个矩形就是根据图像找到最小给他包围的矩形,所以这个矩形可能会是斜的,不是方正的。如下图,斜的8就被最小外接矩形包围
CV_EXPORTS_W RotatedRect minAreaRect( InputArray points );
第一个参数:points 输入的二维点数,可以 Mat 类型也可以是 std::vector 的向量类型
返回值:RotatedRect 的矩形对象, 它表示的是一个轮廓的最小外接矩形
- boundingRect :主要的用途是计算图形轮廓垂直边界的最小矩形,这个矩形一定是方方正正,不管图像怎么样,矩形一定是方正的围住图像,例如下图:
CV_EXPORTS_W Rect boundingRect( InputArray array );
第一个参数:array 输入的灰度图像或者 2D 点集,数据类型为 vector 或者 Mat 矩阵数据
返回值:Rect 的矩形对象,它表示的是物体轮廓的最大外接矩形。我们来看看 Rect 主要的成员变量
- rectangle:作用是绘制矩形,有两种方式:1.以两个顶点的方式画矩形(一个左上角点,另一个右下角点,绘制出一个矩形);2.以 Rect 的方式画矩形(给出一个起始点,给出宽和高,绘制出图像)。
1.void cv::rectangle(InputOutputArray img, Point pt1, Point pt2, const Scalar & color, int thickness = 1,int lineType = LINE_8, int shift = 0)
第一个参数:输入的矩阵图像数据
第二个参数:pt1 是矩形的一个顶点,左上角的顶点
第三个参数:pt2 矩形中与 pt1 相对的顶点,也就是两个点在对角线上,也就是右下角的顶点
第四个参数:Scalar 颜色的标量
第五个参数:thickness 线宽
第六个参数:lineType 线的类型,默认是 LINE_8 就行
第七个参数:shift 坐标的小数点位,默认为 0 就可以
2.void cv::rectangle(InputOutputArray img, Rect rec, const Scalar & color, int thickness = 1,int lineType = LINE_8, int shift = 0)
第一个参数:输入的矩阵图像数据
第二个参数:Rect 的结构体,我们来看看这个 Rect 的重要成员变量
x:矩形的 x 坐标轴
y: 矩形的 y 坐标轴
width:矩形的宽度
height:矩形的高度
第三个参数:Scalar 颜色的标量
第四个参数:thickness 线宽,默认是 1
第五个参数:lineType 线的类型,默认是 LINE_8 就行,line 的类型如下:
第六个参数:shift 坐标点的小数点位数
- line:主要作用是通过两个点绘制直线
CV_EXPORTS_W void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color,
int thickness = 1, int lineType = LINE_8, int shift = 0);
第一个参数:输入的矩阵图像数据
第二个参数:pt1 是线的起始坐标,也就是图上 x1 坐标和 y1 坐标
第三个参数:pt2 是线的终点坐标,也就是图上 x2 坐标和 y2 坐标
第四个参数:Scalar 是颜色标量,绘制直线的颜色
第五个参数:thickness 它是线的粗细程度,默认为 1
第六个参数:lineType 线的类型,默认是 LINE_8 就行,具体的类型
第七个参数:shift 坐标点的小数点位数
- threshold :主要用途是把图像进行二值化处理,二值化操作可以使图像中的数据量大大降低图像的复杂度,并且能够凸显出图像中的轮廓。
CV_EXPORTS_W double threshold( InputArray src, OutputArray dst, double thresh, double maxval, int type );
第一个参数:src 源图像,可以是 8 位灰度图,也可以是 32 位的三通道图像(彩色图像和灰度图像)
第二个参数:dst 目标图像
第三个参数:thresh 阈值
第四个参数:maxval 二值图像中灰度最大值,maxval 只能在 THRESH_BINARY 和 THRESH_BINARY_INV 有用,但是其他选项也需要填这个值,不能空着。
第五个参数:type 阈值操作类型,具体的阈值操作如下图:
1.THRESH_BINARY:二值化阈值处理会将原始图像作为仅有的两个值图像,它针对的像素的处理方式是对于灰度值大于阈值 thresh的像素点,将其灰度值设定为 maxval 最大值。而对于灰度值小于或等于阈值 thresh 的像素点,将其灰度值设定为 0。
2.THRESH_BINARY_INV:反二值化阈值处理也会将原始图像作为仅有的两个值图像,但是它处理的方式和 THRESH_BINARY 不一样,它的特点是:对于灰度值大于阈值的像素点,将其设置为 0。而对于灰度值小于或者等于阈值的像素点,将这部分的部分设置为maxval 最大像素点。
3.THRESH_TRUNC:截断阈值化处理会把图像中大于阈值的像素点设定为阈值,小于或者等于该阈值的像素点保持不变。比方说阈值设置成 127,则说明对于像素超过 127 的像素点,而其像素值就被设置成 127。而小于或者等于 127 的像素点,其数值保持不变。
4.THRESH_TOZERO_INV:超阈值处理会对图像中大于阈值的像素点处理为 0,小于或者等于该阈值的像素点保持不变。比方说阈值的值设定为 127,若当前像素点大于 127 则把像素点处理为 0;若当前像素点小于或者等于阈值的像素点,那么该像素点保持不变
5.THRESH_TOZERO:低阈值处理会对图像中小于或者等于阈值的像素点处理为 0,大于阈值的像素点则保持不变。比方说当前阈值设定为 127,若当前像素点小于或者等于 127 则把像素点处理为 0;若当前像素点大于 127 则保持像素点不变。
6.THRESH_OTSU:OTSU 方法会遍历所有可能的阈值,从而找到一个最佳的阈值。值得注意的是,在使用 OTSU 方法的时候需要把阈值设定为 0。这个时候,threshold 会自动寻找最优的值。
三.代码实战:计算轮廓面积
1.例如计算下面10的各种面积:
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{//读取图片Mat src = imread("ten.png");//灰度化图片,将彩色原图转化成灰度图Mat gray;cvtColor(src, gray, COLOR_RGB2GRAY);//二值化图片Mat bin_img;threshold(gray, bin_img, 150, 255, THRESH_BINARY_INV);//二值化处理阈值150,最大值255是白色,THRESH_BINARY_INV是将原图设置反色(黑的变白的,白的变黑的)//轮廓检测,并获取轮廓像素点数量vector<vector<Point>> contours;//定义一个二维点向量,用于存储轮廓findContours(bin_img, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);//RETR_EXTERNAL表示只检测外部轮廓,CHAIN_APPROX_SIMPLE表示只存储轮廓的拐点//循环轮廓数量并计算轮廓面积Point2f pts[4];//定义一个二维点向量,用于存储最小外接矩形的四个顶点for (int i = 0; i < contours.size(); i++){//*************计算最小外接矩形面积**********************//RotatedRect rects = minAreaRect(contours[i]);rects.points(pts);//获取最小外接矩形的四个顶点//将外接四个顶点连接起来line(src, pts[0], pts[1], Scalar(0, 0, 255), 2);//用line连接p[0]->p[1]line(src, pts[1], pts[2], Scalar(0, 0, 255), 2);//用line连接p[1]->p[2]line(src, pts[2], pts[3], Scalar(0, 0, 255), 2);//用line连接p[2]->p[3]line(src, pts[3], pts[0], Scalar(0, 0, 255), 2);//用line连接p[3]->p[0]int minArea = rects.size.width * rects.size.height;//计算轮廓面积printf("minArea = %d\n", minArea);//*************计算边界矩形(垂直矩形)面积**********************//Rect bArea = boundingRect(contours[i]);//调用boundingRect查找边界矩形int boundingArea = bArea.width * bArea.height;//计算边界矩形面积printf("boundingArea = %d\n", boundingArea);rectangle(src, bArea, Scalar(255,255,0));//rectangle矩形画框//*************计算轮廓面积(就是1,0这个面积)**********************//double cArea = contourArea(contours[i]);//计算轮廓面积printf("cArea = %f\n", cArea);}imwrite("area.jpg", src);return 0;
}
2.效果图
minArea:就是斜长方形面积; boundingArea:就是白正方形面积;cArea:就是黑色部分面积
相关文章:

5.RV1126-OPENCV 图形计算面积
一.图形面积、弧长计算介绍 前面我们已经把图形轮廓的检测、画框等功能讲解了一遍。这次主要结合轮廓检测的 API 去计算图形的面积,这些面积可以是矩形、圆形等等。图形面积计算和弧长计算常用于车辆识别、桥梁识别等重要功能,常用的 API 如 contourArea…...
一键净化Excel数据:高性能Python脚本实现多核并行清理
摘要 本文分享两个基于Python的Excel数据净化脚本,通过多进程并行技术清除工作表内不可见字符、批注、单元格样式等冗余内容,利用OpenPyXL实现底层操作,结合tqdm进度条和进程级任务分配,可快速处理百万级单元格数据。适用于数据分…...

【Android基础回顾】一:Binder机制是什么?有什么用?
Android中的Binder机制是Android系统中最核心和最基础的进程间通讯机制。 1 什么是进程间通讯机制(IPC)? 众所周知,Android系统基于Linux开发,Linux系统里面本来就有进程间通讯机制。 1.1 Linux的IPC(Inter-Process Communication)概览 它…...

LeetCode 高频 SQL 50 题(基础版) 之 【高级查询和连接】· 上
题目:1731. 每位经理的下属员工数量 题解: select employee_id,name,reports_count,average_age from Employees t1,(select reports_to,count(*) reports_count,round(avg(age)) average_agefrom Employeeswhere reports_to is not nullgroup by repor…...

资产智慧管理安全监测中心
在数字经济高速发展的今天,资产管理的智能化已成为企业降本增效的核心竞争力。从智慧园区到古建筑群,从交通枢纽到城市电网,资产智慧管理安全监测中心正以物联网、人工智能、数字孪生等技术为支撑,构建起资产全生命周期的“智慧大…...

从零开始的云计算——番外实战,iptables防火墙项目
目录 一网络规划 二项目要求 三环境准备 1防火墙设置 2PC1设置 3PC2设置 4服务器S1设置 四环境检测 1内网链接 2外网连接 五防火墙配置及测试 1内部网络中的pc1采用SNAT访问外部互联网,但是无法ping到内部网关。 编辑编辑 2内部网络服务器s1通过DN…...
移动网页调试的多元路径:WebDebugX 与其他调试工具的组合使用策略
在移动端网页开发中,仅靠一款工具很难覆盖所有调试场景。不同问题类型需要不同的调试维度——有时是网络请求,有时是 DOM 样式,有时是 JS 状态,有时是性能瓶颈。 本文以“多工具协作”为核心思想,结合多个项目经验&am…...

【基于阿里云搭建数据仓库(离线)】IDEA导出Jar包(包括第三方依赖)
目录 方法一: 方法二 1.双击"package”即可进行打包呈jar 2.双击后就会自动打包生成jar了, 生成的jar在这个目录下 3.右击,点击“复制路径/引用”,即可获得“绝对路径”、“根路径”等相关信息 前提: 在pop.…...
【HarmonyOS 5】鸿蒙HarmonyOS —(cordova)研发方案详解
Android、Ios 和 HarmonyOS APP研发分析 Android研发语言Java、Ios研发语言objective-c, HarmonOS研发语言ArkTs和C/C,写了第一句,就会有人反驳,Android和Ios也支持C/C语言,封装成动态库so,然后调用就可以了࿰…...
Linux程序运行日志总结
在Linux系统中,程序运行时产生的日志记录主要通过以下几种方式实现,这些日志有助于排查问题、监控系统行为或审计安全事件: 1. 系统日志(System Logs) 存放路径:通常位于 /var/log/ 目录下。常见日志文件: /var/log/syslog 或 /var/log/messages:通用系统日志(取决于发…...

【物联网-TCP/IP】
物联网-TCP/IP ■ TCP/IP■■■ 添加链接描述 ■ TCP/IP ■ ■ ■...
SAP ECC 与 SAP S/4HANA 技术架构全面对比
SAP ECC 是过去几十年众多企业核心业务系统的基石,涵盖财务、物流、制造等关键领域。然而,随着数字化转型的加速和企业需求的增长,其架构日益显现局限。因此,SAP 推出了新一代 ERP 解决方案——SAP S/4HANA。它不仅在功能上做出优…...

Halcon光度立体法
1、光度立体法,可用于将对象的三维形状与其二维纹理(例如打印图像)分离。需要用不同方向而且已知照明方向的多个光源,拍摄同一物体的至少三张图像。请注意,所有图像的相机视角必须相同。 物体的三维形状主要被计算为三…...

cocos3.X的oops框架oops-plugin-excel-to-json改进兼容多表单导出功能
在使用oops框架的过程中,它的导出数据并生成数据结构的插件oops-plugin-excel-to-json有些小的坑点,为满足我个人习惯,对此部分进行了一个小的修改,有需要的拿去用,记录下供大家参考; 一、配置:…...
Spring Boot + OpenAI 构建基于RAG的智能问答系统
一、技术架构设计 1.1 系统架构图 [前端]│▼ (HTTP/REST) [Spring Boot Controller]│▼ (Service Call) [问答处理服务层]├─▶ [知识库检索模块] ──▶ [向量数据库]└─▶ [OpenAI集成模块] ──▶ [OpenAI API]│▼ [结果组装与返回] 1.2 技术选型 组件技术栈版本要求…...
开源量子模拟引擎:Quantum ESPRESSO本地部署教程,第一性原理计算轻松入门!
一、介绍 Quantum ESPRESSO 是一个用于电子结构计算和纳米尺度材料建模的开源计算机代码集成套件,专门用于进行第一性原理(第一性原理)计算,涵盖了电子结构、晶体学和材料性能的模拟。 Quantum ESPRESSO GPU 版本支持GPU加速&am…...
算法blog合集
https://zhuanlan.zhihu.com/p/600245782 https://zhuanlan.zhihu.com/p/696212679 https://zhuanlan.zhihu.com/p/291406172 【推荐系统】DSSM双塔召回2_pair-wise训练和推理-CSDN博客 精通推荐算法1:为什么需要推荐系统(系列文章,建议收…...

每日八股文6.3
每日八股-6.3 Mysql1.COUNT 作用于主键列和非主键列时,结果会有不同吗?2.MySQL 中的内连接(INNER JOIN)和外连接(OUTER JOIN)有什么主要的区别?3.能详细描述一下 MySQL 执行一条查询 SQL 语句的…...

Kubernetes (k8s)版本发布情况
Kubernetes (k8s)版本发布情况 代码放在 GitHub - kubernetes/kubernetes: Production-Grade Container Scheduling and Management https://github.com/kubernetes/kubernetes/releases 文档放在 kubernetes.io各个版本变更等: https://github.com/kubernetes/kubernet…...

QT 5.9.2+VTK8.0实现等高线绘制
项目下载链接:QT5.9.2VTK8.0实现等高线绘制资源-CSDN文库 示例如下: 主要代码如下: #include "vtkRenderer.h" #include "vtkRenderWindow.h" #include "vtkRenderWindowInteractor.h" #include "vtkPo…...
CppCon 2015 学习:3D Face Tracking and Reconstruction using Modern C++
1. 3D面部追踪和重建是什么? 3D面部追踪(3D Face Tracking): 实时检测并追踪人脸在三维空间中的位置和姿态(如转头、点头、表情变化等),通常基于摄像头捕获的视频帧。3D面部重建(3D…...
Three.js进阶之音频处理与展示
引擎在对音频处理提供了丰富的接口,本文展示两个音频处理示例。 一、声音可视化 Three.js中的声音可视化是以视觉为核心,以音乐为载体,为音乐提供直观的视觉呈现。通过对音乐数据的分析并结合开发需求,能实现酷炫的视觉效果。在…...
4.2 HarmonyOS NEXT分布式AI应用实践:联邦学习、跨设备协作与个性化推荐实战
HarmonyOS NEXT分布式AI应用实践:联邦学习、跨设备协作与个性化推荐实战 在HarmonyOS NEXT的全场景分布式架构下,AI能力突破设备边界,通过联邦学习保护数据隐私、跨设备任务协作释放算力潜能、个性化推荐实现服务主动化。本文结合华为分布式…...

兼容老设备!EtherNet/IP转DeviceNet网关解决储能产线通讯难题
在新能源行业飞速发展的当下,工业自动化水平的高低直接影响着企业的生产效率与产品质量。JH-EIP-DVN疆鸿智能ETHERNET/IP和DEVICENET作为工业领域常用的通信协议,它们之间的转换应用在新能源生产线上发挥着关键作用。本文重点探讨ETHERNETIP从站转DEVICE…...
健康检查:在 .NET 微服务模板中优雅配置 Health Checks
🚀 健康检查:在 .NET 微服务模板中优雅配置 Health Checks 📚 目录 🚀 健康检查:在 .NET 微服务模板中优雅配置 Health Checks一、背景与意义 🔍二、核心配置 🔧2.1 引入必要的 NuGet 依赖 &…...
【Pytorch学习笔记】模型模块08——AlexNet模型详解
AlexNet模型详解:结构、算法与PyTorch实现 一、AlexNet模型结构 AlexNet是2012年ImageNet竞赛冠军模型,由Alex Krizhevsky等人提出,标志着深度学习在计算机视觉领域的突破。 网络结构(5卷积层 3全连接层)ÿ…...

LabVIEW自感现象远程实验平台
LabVIEW开发自感现象远程实验平台,通过整合 NI数据采集设备、菲尼克斯(Phoenix Contact)继电器模块及罗技(Logitech)高清摄像头,实现远程数据采集、仪器控制与实时监控三大核心功能。平台突破传统实验装置局…...
AppTrace 视角下 App 一键拉起:提升应用转化率的高效方案
官网地址:AppTrace - 专业的移动应用推广追踪平台 在大规模开展 App 推广、用户召回、广告投放、邀请传播等活动时,高效的深度链接方案至关重要。它不仅能缩短用户路径,带来无缝、流畅的跳转体验,更核心的是通过参数传递打通 web…...
梯度下降:机器学习优化的核心算法
梯度下降算法原理及其在机器学习中的实践应用 引言 在机器学习领域,优化算法扮演着核心角色。其中梯度下降法作为最基础的优化方法,为神经网络、支持向量机等模型提供了参数优化解决方案。本文将深入解析梯度下降的数学原理,探讨其多种变体实现,并通过Python代码演示具体…...
Vue-6-前端框架Vue之基于Plotly.js绘制曲线
文章目录 1 安装Plotly.js2 折线图2.1 创建一个Vue组件来绘制图表2.1.1 Vue模板部分template2.1.2 Vue脚本部分script2.1.3 Vue样式部分style2.2 使用这个组件APP.vue3 动态更新图表3.1 创建一个Vue组件来绘制图表3.1.1 Vue模板部分template3.1.2 Vue脚本部分script3.1.3 Vue样…...