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

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

算法描述

计算轮廓的面积。

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

例子:

cpp 复制代码
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;

函数原型

cpp 复制代码
double cv::contourArea	
(
	InputArray 	contour,
	bool 	oriented = false 
)		

参数

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

代码示例

cpp 复制代码
#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;
}

运行结果

终端输出:

bash 复制代码
Contour area (absolute): 9801
Contour oriented area: -9801

图像输出:

相关推荐
大千AI助手19 分钟前
残差:从统计学到深度学习的核心概念
人工智能·深度学习·resnet·统计学·方差分析·残差·残差分析
yzx99101327 分钟前
豆包、Kimi、通义千问、DeepSeek、Gamma、墨刀 AI”六款主流大模型(或 AI 平台)生成 PPT 的完整流程
人工智能·powerpoint·墨刀
max50060042 分钟前
使用OmniAvatar-14B模型实现照片和文字生成视频的完整指南
图像处理·人工智能·深度学习·算法·音视频
可触的未来,发芽的智生1 小时前
追根索源-神经网络的灾难性遗忘原因
人工智能·神经网络·算法·机器学习·架构
CAE3201 小时前
基于Ncode的新能源汽车电池包随机振动疲劳分析
人工智能·汽车·电池包·hypermesh·振动疲劳·optistruct
zzywxc7871 小时前
自动化测试框架是软件测试的核心基础设施,通过预设规则和脚本自动执行测试用例,显著提高测试效率和覆盖率。
运维·人工智能·自动化·prompt·测试用例·流程图
尺度商业1 小时前
2025服贸会“海淀之夜”,点亮“科技”与“服务”底色
大数据·人工智能·科技
AWS官方合作商1 小时前
涂鸦智能携手亚马逊云科技,以全球基础设施与生成式AI加速万物智联时代到来
人工智能·科技·aws·亚马逊云科技
FunTester1 小时前
拥抱直觉与创造力:走进VibeCoding的新世界
人工智能·语言模型·编程·vibecoding
liukuang1101 小时前
飞鹤财报“新解”:科技筑牢护城河,寒冬凸显龙头“硬核力”
人工智能·科技