函数原型
double contourArea( InputArray contour, bool oriented = false );
参数说明
- InputArray类型的contour,输入的向量,二维点(轮廓顶点),可以为std::vector或Mat类型。
- bool类型的oriented,面向区域标识符。若其为true,会返回一个带符号的面积值,正负取决于轮廓的方向。
测试代码
#include<iostream> #include<opencv2/opencv.hpp> using namespace std; using namespace cv; int main(void) { Mat A = Mat::zeros(500, 500, CV_8UC1); circle(A, Point2i(100, 100), 3, 255, -1); circle(A, Point2i(300, 400), 50, 255, -1); circle(A, Point2i(250, 100), 100, 255, -1); circle(A, Point2i(400, 300), 60, 255, -1); std::vector<std::vector<cv::Point> > contours; // 创建轮廓容器 std::vector<cv::Vec4i> hierarchy; cv::findContours(A, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE, cv::Point()); if (!contours.empty() && !hierarchy.empty()) { std::vector<std::vector<cv::Point> >::const_iterator itc = contours.begin(); // 遍历所有轮廓 int i = 1; while (itc != contours.end()) { double area = cv::contourArea(*itc); cout << "第" << i << "个轮廓的面积为:" << area << endl; i++; itc++; } } imshow("A", A); waitKey(0); system("pause"); return 0; }
测试效果
图1 示例图
如图1所示,测试代码画了4个圆,对整幅图进行轮廓统计时,从下往上,从左往右,分别标记了4个轮廓的顺序,如图2所示是4个轮廓的面积值。
图2 面积结果
注意:计算轮廓的面积值是按照轮廓的内部面积进行计算的,按第三个轮廓举例,将其放大至像素级别,如图3所示。
图3 轮廓示意图
寻找轮廓时,取的点为像素中心点,连接起来的黑线就是这个图形的轮廓,那么计算的面积应该是内部正方形+4个三角形(4*4+4*1=20),与计算机输出的结果一致。
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!