当前位置: 首页 > news >正文

OpenCV结构分析与形状描述符(7)计算轮廓的面积的函数contourArea()的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

计算轮廓的面积。

该函数计算轮廓的面积。与 moments 类似,面积是使用格林公式计算的。因此,返回的面积与你使用 drawContours 或 fillPoly 绘制轮廓时的非零像素数量可能会不同。此外,对于自相交的轮廓,该函数很可能会给出错误的结果。
例子:

vector<Point> contour;
contour.push_back(Point2f(0, 0));
contour.push_back(Point2f(10, 0));
contour.push_back(Point2f(10, 10));
contour.push_back(Point2f(5, 4));
double area0 = contourArea(contour);
vector<Point> approx;
approxPolyDP(contour, approx, 5, true);
double area1 = contourArea(approx);
cout << "area0 =" << area0 << endl <<"area1 =" << area1 << endl <<"approx poly vertices" << approx.size() << endl;

函数原型


double cv::contourArea	
(InputArray 	contour,bool 	oriented = false 
)		

参数

  • 参数contour 输入的二维点向量(轮廓顶点),存储在 std::vector 或 Mat 中
  • 参数oriented 有向面积标志。如果该值为真,则函数会返回一个根据轮廓方向(顺时针或逆时针)而定的带符号的面积值。利用此功能,可以通过获取面积的符号来确定轮廓的方向。默认情况下,该参数为假,这意味着返回的是绝对值。

代码示例


#include <iostream>
#include <opencv2/opencv.hpp>int main()
{// 创建一个简单的二值图像cv::Mat img = cv::Mat::zeros( 300, 300, CV_8UC1 );// 添加一个矩形轮廓cv::rectangle( img, cv::Rect( 50, 50, 100, 100 ), cv::Scalar( 255 ), cv::FILLED );// 显示原始二值图像cv::imshow( "Binary Image", img );// 查找图像中的轮廓std::vector< std::vector< cv::Point > > contours;std::vector< cv::Vec4i > hierarchy;cv::findContours( img, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE );// 计算每个轮廓的面积for ( const auto& contour : contours ){double area = cv::contourArea( contour );std::cout << "Contour area (absolute): " << area << std::endl;// 计算带符号的面积double oriented_area = cv::contourArea( contour, true );std::cout << "Contour oriented area: " << oriented_area << std::endl;}// 绘制轮廓cv::drawContours( img, contours, -1, cv::Scalar( 128 ), 2 );// 显示带有轮廓的图像cv::imshow( "Image with Contour", img );cv::waitKey( 0 );cv::destroyAllWindows();return 0;
}

运行结果

终端输出:

Contour area (absolute): 9801
Contour oriented area: -9801

图像输出:
在这里插入图片描述

http://www.lryc.cn/news/433500.html

相关文章:

  • 内网环境使用Docker部署Qwen2模型-vLLM篇
  • Rust的常数、作用域与所有权
  • Spring 源码解读:解决循环依赖的三种方式
  • Web3 详解
  • Spring 中依赖注入注解的区别详解
  • PTA求一批整数中出现最多的个位数字
  • 探索国产编程工具:如何实现工作效率翻倍
  • 秒懂:进程相关的操作
  • PDF 软件如何帮助您编辑、转换和保护文件。
  • 蓝桥杯嵌入式国三备赛经验分享
  • AI编程工具合集
  • [网络编程]通过java用TCP实现网络编程
  • Python(TensorFlow)和Java及C++受激发射损耗导图
  • IEEE投稿模板翻译
  • log4j 1.x 日志输出线程以唯一ID的形式配置
  • 宏观学习笔记:GDP分析(二)
  • 两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容
  • C高级编程 第十六天(树 二叉树)
  • OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用
  • 904.水果成篮
  • 【网络安全】漏洞挖掘之 2FA 恢复代码安全措施不当
  • 指令微调与参数微调的代码实践与分析
  • Android14音频进阶之高通Elite架构指定通道播放(八十四)
  • 常见的正则化方法以及L1,L2正则化的简单描述
  • 深入理解 Milvus:新一代向量数据库的基础技术与实战指南
  • Maven教程——从入门到入坑
  • 研究生深度学习入门的十天学习计划------第九天
  • perl的学习记录——仿真regression
  • 【Go】go连接clickhouse使用TCP协议
  • Emlog-Pro访问网站时需要密码验证插件