5.RV1126-OPENCV 图形计算面积

news2025/6/6 21:43:19

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

        前面我们已经把图形轮廓的检测、画框等功能讲解了一遍。这次主要结合轮廓检测的 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.coloradmin.cn/o/2402147.html

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

相关文章

【Android基础回顾】一:Binder机制是什么?有什么用?

Android中的Binder机制是Android系统中最核心和最基础的进程间通讯机制。 1 什么是进程间通讯机制(IPC)&#xff1f; 众所周知&#xff0c;Android系统基于Linux开发&#xff0c;Linux系统里面本来就有进程间通讯机制。 1.1 Linux的IPC(Inter-Process Communication)概览 它…

LeetCode 高频 SQL 50 题(基础版) 之 【高级查询和连接】· 上

题目&#xff1a;1731. 每位经理的下属员工数量 题解&#xff1a; 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…

资产智慧管理安全监测中心

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

从零开始的云计算——番外实战,iptables防火墙项目

目录 一网络规划 二项目要求 三环境准备 1防火墙设置 2PC1设置 3PC2设置 4服务器S1设置 四环境检测 1内网链接 2外网连接 五防火墙配置及测试 1内部网络中的pc1采用SNAT访问外部互联网&#xff0c;但是无法ping到内部网关。 ​编辑​编辑 2内部网络服务器s1通过DN…

【基于阿里云搭建数据仓库(离线)】IDEA导出Jar包(包括第三方依赖)

目录 方法一&#xff1a; 方法二 1.双击"package”即可进行打包呈jar 2.双击后就会自动打包生成jar了&#xff0c; 生成的jar在这个目录下 3.右击&#xff0c;点击“复制路径/引用”&#xff0c;即可获得“绝对路径”、“根路径”等相关信息 前提&#xff1a; 在pop.…

【物联网-TCP/IP】

物联网-TCP/IP ■ TCP/IP■■■ 添加链接描述 ■ TCP/IP ■ ■ ■

Halcon光度立体法

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

cocos3.X的oops框架oops-plugin-excel-to-json改进兼容多表单导出功能

在使用oops框架的过程中&#xff0c;它的导出数据并生成数据结构的插件oops-plugin-excel-to-json有些小的坑点&#xff0c;为满足我个人习惯&#xff0c;对此部分进行了一个小的修改&#xff0c;有需要的拿去用&#xff0c;记录下供大家参考&#xff1b; 一、配置&#xff1a;…

每日八股文6.3

每日八股-6.3 Mysql1.COUNT 作用于主键列和非主键列时&#xff0c;结果会有不同吗&#xff1f;2.MySQL 中的内连接&#xff08;INNER JOIN&#xff09;和外连接&#xff08;OUTER JOIN&#xff09;有什么主要的区别&#xff1f;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实现等高线绘制

项目下载链接&#xff1a;QT5.9.2VTK8.0实现等高线绘制资源-CSDN文库 示例如下&#xff1a; 主要代码如下&#xff1a; #include "vtkRenderer.h" #include "vtkRenderWindow.h" #include "vtkRenderWindowInteractor.h" #include "vtkPo…

兼容老设备!EtherNet/IP转DeviceNet网关解决储能产线通讯难题

在新能源行业飞速发展的当下&#xff0c;工业自动化水平的高低直接影响着企业的生产效率与产品质量。JH-EIP-DVN疆鸿智能ETHERNET/IP和DEVICENET作为工业领域常用的通信协议&#xff0c;它们之间的转换应用在新能源生产线上发挥着关键作用。本文重点探讨ETHERNETIP从站转DEVICE…

LabVIEW自感现象远程实验平台

LabVIEW开发自感现象远程实验平台&#xff0c;通过整合 NI数据采集设备、菲尼克斯&#xff08;Phoenix Contact&#xff09;继电器模块及罗技&#xff08;Logitech&#xff09;高清摄像头&#xff0c;实现远程数据采集、仪器控制与实时监控三大核心功能。平台突破传统实验装置局…

Python----目标检测(《YOLOv3:AnIncrementalImprovement》和YOLO-V3的原理与网络结构)

一、《YOLOv3:AnIncrementalImprovement》 1.1、基本信息 标题&#xff1a;YOLOv3: An Incremental Improvement 作者&#xff1a;Joseph Redmon, Ali Farhadi 机构&#xff1a;华盛顿大学&#xff08;University of Washington&#xff09; 发表时间&#xff1a;2018年 代…

算法篇 八大排序(冒泡 插入 选择 堆 希尔 快排 归并 计数)

目录 引言 1.冒泡排序 思路 代码实现 2.选择排序 思路 代码实现&#xff08;存在易错点&#xff09; 3.插入排序 思路 代码实现 4.希尔排序 思路 代码实现 5.堆排序 思路 代码实现 6.快速排序&#xff08;快排&#xff09; 一.三路划分 思路 代码实现 二.自…

音视频之视频压缩编码的基本原理

系列文章&#xff1a; 1、音视频之视频压缩技术及数字视频综述 2、音视频之视频压缩编码的基本原理 一、预测编码&#xff1a; 1、预测编码的基本概念&#xff1a; 预测法是最简单、实用的视频压缩编码方法&#xff0c;经过压缩编码后传输的并不是像素本身的取样值&#xff0…

IDEA 包分层显示设置

方法一&#xff08;用的IntelliJ IDEA 2024.1.4版本&#xff09;&#xff1a; 找到项目视图设置入口&#xff1a;在左侧Project&#xff08;项目&#xff09;面板的顶部&#xff0c;有个三个点...的按钮 &#xff0c;点击它。 进入树形外观配置&#xff1a;在弹出的菜单中&…

深度学习和神经网络 卷积神经网络CNN

1.什么是卷积神经网络 一种前馈神经网络&#xff1b;受生物学感受野的机制提出专门处理网格结构数据的深度学习模型 核心特点&#xff1a;通过卷积操作自动提取空间局部特征&#xff08;如纹理、边缘&#xff09;&#xff0c;显著降低参数量 2.CNN的三个结构特征 局部连接&a…

PlayWright | 初识微软出品的 WEB 应用自动化测试框架

Playwright是微软大厂背书的跨平台 WEB 应用自动化测试框架&#xff0c;支持多开发语言&#xff08;TypeScript、JavaScript、.Net、Python、Java&#xff09;及多浏览器&#xff08;Chromium、WebKit、Firefox&#xff09;&#xff0c;同时支持移动端测试。 安装 playwright …

Mac电脑_钥匙串操作选项变灰的情况下如何删除?

Mac电脑_钥匙串操作选项变灰的情况下如何删除&#xff1f; 这时候 可以使用相关的终端命令进行操作。 下面附加文章《Mac电脑_钥匙串操作的终端命令》。 《Mac电脑_钥匙串操作的终端命令》 &#xff08;来源&#xff1a;百度~百度AI 发布时间&#xff1a;2025-06&#xff09;…