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

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.kler.cn/news/293379.html

相关文章:

  • Qt/QML学习-Calendar
  • 探秘DevSecOps黄金管道,安全与效率的完美融合
  • Golang | Leetcode Golang题解之第391题完美矩形
  • 实战docker第一天——windows安装docker,测试,并解决被墙办法
  • 【最后一轮征稿】第三届人工智能、物联网和云计算技术国际会议(AIoTC 2024)
  • Oracle同一台服务器创建多个数据库
  • 计算机毕业设计选题推荐-中华诗词文化交流平台-Java/Python项目实战
  • cmd常用指令举例说明使用方法
  • Redis从入门再再到入门(下)
  • Opencv中的直方图(5)计算EMD距离的函数EMD()的使用
  • 面经学习(hbkj实习)
  • WPF 点在控件内 判断
  • 时序预测 | 基于DLinear+PatchTST多变量时间序列预测模型(pytorch)
  • 把iconfont 图标导出为json
  • rsync搭建全网备份
  • 奥威让您更懂现金流情况
  • 【2024数模国赛赛题思路公开】国赛E题思路丨附可运行代码丨无偿自提
  • CRUD的最佳实践,联动前后端,包含微信小程序,API,HTML等(三)
  • Kubernetes--服务发布(Service、Ingress)
  • ubuntu24.04 为什么扬声器没有声音,但是戴上耳机有声音
  • Docker 配置国内镜像源
  • SpringCloud:构建分布式系统的利器
  • 【全网首发】2024数学建模国赛C题39页word版成品论文【附带py+matlab双版本解题代码+可视化图表】
  • 深度学习基础案例4--构建CNN卷积神经网络实现对猴痘病的识别(测试集准确率86.5%)
  • 【解决bug之路】npm install node-sass(^4.14.1)连环报错解决!!!(Windows)
  • Python 语法糖:让编程更简单
  • redis的持久化RDB和AOF
  • Qt 实战(10)MVD | 10.1、MVD机制详解
  • RabbitMQ 基础架构流程 数据隔离 创建用户
  • 利用深度学习实现验证码识别-2-使用Python导出ONNX模型并在Java中调用实现验证码识别