5.RV1126-OPENCV 图形计算面积

article/2025/6/26 12:54:32

一.图形面积、弧长计算介绍

        前面我们已经把图形轮廓的检测、画框等功能讲解了一遍。这次主要结合轮廓检测的 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:就是黑色部分面积


http://www.hkcw.cn/article/hhYpPcftOy.shtml

相关文章

rabbitmq Topic交换机简介

1. Topic交换机 说明 尽管使用 direct 交换机改进了我们的系统&#xff0c;但是它仍然存在局限性——比方说我们的交换机绑定了多个不同的routingKey&#xff0c;在direct模式中虽然能做到有选择性地接收日志&#xff0c;但是它的选择性是单一的&#xff0c;就是说我的一条消息…

JavaSE 常见问题解析

最近正在复习Java八股&#xff0c;所以会将一些热门的八股问题&#xff0c;结合ai与自身理解写成博客便于记忆 本文将以以上问题作为基础 String 相关问题 String 底层数据类型&#xff1f; String 在 Java 9 之前底层使用 char[] 数组存储字符数据&#xff0c;Java 9 及以…

潜入水面:穿越“冰山”之旅,探寻Java鲜为人知的一面

“冰山”梗是一种网络现象&#xff0c;幽默而有时令人不安地展示了某个主题的知识或入门层次——从冰山之巅简单、广为人知的常识到只有最坚韧的老兵才能理解的黑暗、神秘深处。想象一座海洋上矗立的冰山&#xff1a;表面可见的部分只是开始&#xff0c;真正的魔法&#xff08;…

如何配置mvn镜像源为华为云

如何配置mvn镜像源为华为云 # 查找mvn 配置文件 mvn -X help:effective-settings | grep settings.xml# 配置mvn镜像源为华为云&#xff0c;/home/apache-maven-3.9.5/conf/settings.xml文件路径需要根据上一步中查询结果调整 cat > /home/apache-maven-3.9.5/conf/setting…

【DAY37】早停策略和模型权重的保存

内容来自浙大疏锦行python打卡训练营 浙大疏锦行 知识点&#xff1a; 过拟合的判断&#xff1a;测试集和训练集同步打印指标模型的保存和加载 仅保存权重保存权重和模型保存全部信息checkpoint&#xff0c;还包含训练状态 早停策略 作业&#xff1a; 对信贷数据集训练后保存权…

TASK OA 案例hook

TASK OA 案例hook 定义的状态 useRef & useForm ref使用&#xff1a; xxx 尽可能使用组件库antd内部提供的方法 两大稍微比较难的组件&#xff1a;table 和 form 服务器通信 使用async/await 不用想配套使用 try/catch 初次渲染拉取query。useEffect(..., []) 状态更新useE…

Kafka集成Flume/Spark/Flink(大数据)/SpringBoot

Kafka集成Flume Flume生产者 ③、安装Flume&#xff0c;上传apache-flume的压缩包.tar.gz到Linux系统的software&#xff0c;并解压到/opt/module目录下&#xff0c;并修改其名称为flume Flume消费者 Kafka集成Spark 生产者 object SparkKafkaProducer{def main(args:Array[S…

Linux指令:

我们今天来学习一下linux的一些相关的指令L&#xff1a; 1. 快速认识6~8个指令&#xff1a; 第一条&#xff1a;pwd pwd指令表示的是我当前在哪条路径下&#xff1b;我当前在哪里&#xff1b; 我们看这个第二句话&#xff0c;因为在windows环境下&#xff0c;当我们登录进入到…

网络攻防技术五:网络扫描技术

文章目录 一、网络扫描的基础概念二、主机发现三、端口扫描1、端口号2、端口扫描技术3、端口扫描隐秘策略 四、操作系统识别五、漏洞扫描六、简答题1. 主机扫描的目的是什么&#xff1f;请简述主机扫描方法。2. 端口扫描的目的是什么&#xff1f;请简述端口扫描方法及扫描策略。…

win32相关(虚拟内存和物理内存)

虚拟内存和物理内存 在win32操作系统下&#xff0c;每个进程都有它自己独立的4GB空间&#xff0c;是window给它分配的一个虚拟空间&#xff0c;并不是真正的物理空间&#xff0c;这4GB空间中&#xff0c;分为高2G和低2G&#xff0c;高2G是应用程序的&#xff0c;低2G空间是给内…

00后新人“整顿”婚礼 简简单单更实在!

00后新人“整顿”婚礼简简单单更实在!婚礼当天,宾客们刚坐下,新郎新娘就手拉手走上台。新郎咧嘴一笑:“感谢各位来捧场,我俩今天正式领证了!”新娘接茬:“废话不多说,大家吃好喝好,菜不够再加,吃不完打包带走!”台下瞬间爆发出欢呼声,这场婚礼从开始到宣布开席,总…

德约科维奇vs诺里 法网百胜里程碑

北京时间6月2日,法网男单第四轮比赛中,赛会六号种子德约科维奇以6-2、6-3、6-2的比分击败诺里,成功晋级八强。首盘开始,德约连保带破取得2-0领先。尽管诺里随后回破,但德约在第四局再次破发,掌控了比赛节奏。最终在诺里的关键发球局中,德约再次破发,以6-2赢得首盘。第二…

地磁暴又来了!这些地方受影响 我国北部或现极光

中国气象局国家空间天气监测预警中心报告称,北京时间5月31日太阳爆发了耀斑,地球可能连续三天发生地磁暴,我国北部有机会出现较为明显的极光。具体来说,5月31日7点45分左右,太阳活动区14100开始爆发耀斑,软X射线流量快速上升,8点05分达到峰值——M8.1级中等耀斑强度。伴…

北京今天晴朗伴大风 阵风可达6至7级 明起炎热升级 气温将明显升高

今天6月3日,北京天气以晴朗为主,北风加大,阵风可达6至7级。未来两天,北京将继续保持晴朗,气温显著升高。昨天,北京大部分地区晴朗,北部和西部出现分散性阵雨或雷阵雨,但雨量不大。多地北风强劲,阵风达到6至7级。据北京市气象台预计,今天白天晴间多云,北风从2级左右逐…

全都要!德天空:新月将和胜利争夺C罗,同时致力于签下B费 沙特豪门雄心勃勃

据德国天空体育报道,利雅得新月在与利雅得胜利争夺C罗的同时,还致力于签下布鲁诺-费尔南德斯。C罗与利雅得胜利的合同将于6月底到期。尽管利雅得胜利的体育总监耶罗极力挽留,但利雅得新月希望签下这名40岁的老将,并带他参加即将举行的世俱杯(6月14日至7月13日)。利雅得新…

[HTML5]快速掌握canvas

背景 canvas 是 html5 标准中提供的一个标签, 顾名思义是定义在浏览器上的画布 通过其强大的绘图接口&#xff0c;我们可以实现各种各样的图形&#xff0c;炫酷的动画&#xff0c;甚至可以利用他开发小游戏&#xff0c;包括市面上很流行的数据可视化框架底层都用到了Canvas。…

Mininconda3安装使用

一、简介 Anaconda和Miniconda都是非常流行的Python发行版&#xff0c;它们都提供了强大的包管理系统和环境管理系统&#xff0c;让Python编程变得超级简单。 但Miniconda是Anaconda的精简版&#xff0c;只包含最基本的conda包管理器和Python环境管理器&#xff0c;不像Anaco…

设备驱动与文件系统:03 生磁盘的使用

磁盘驱动学习开篇 从这一讲开始&#xff0c;我们进入设备驱动的学习&#xff0c;具体聚焦于设备管理的最后一个部分——磁盘管理。磁盘管理实践也是操作系统课程的最后一块内容。磁盘的驱动器本质上仍是一种设备驱动&#xff0c;其原理不变&#xff0c;核心依旧是文件视图、磁…

【MATLAB代码】制导——平行接近法,三维,目标是运动的,订阅专栏后可直接查看MATLAB源代码

文章目录 运行结果简介代码功能概述运行结果核心模块解析代码特性与优势 MATLAB例程代码调整说明相关公式视线角速率约束相对运动学方程导引律加速度指令运动学更新方程拦截条件判定 运行结果 运行演示视频&#xff1a; 三维平行接近法导引运行演示 简介 代码功能概述 本代码…

spdlog介绍与使用

文章目录 spdlog的介绍与安装使用样例二次封装 spdlog的介绍与安装 spdlog 是一个高性能、超快速、零配置的 C 日志库&#xff0c;它旨在提供简洁的 API 和丰富的功能&#xff0c;同时保持高性能的日志记录。它支持多种输出目标、格式化选项、线程安全以及异步日志记录。 特点…