函数原型
double arcLength( InputArray curve, bool closed );
参数说明
- InputArray类型的curve,输入的向量,二维点(轮廓顶点),可以为std::vector或Mat类型。
- bool类型的closed,用于指示曲线是否封闭的标识符,一般设置为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 length = cv::arcLength(*itc,true); cout << " " << "第" << i << "个轮廓的周长为:" << length << endl << endl; i++; itc++; } } imshow("A", A); waitKey(0); system("pause"); return 0; }
测试效果
图1 示例图
如图1所示,测试代码画了4个圆,对整幅图进行轮廓统计时,从下往上,从左往右,分别标记了4个轮廓的顺序,如图2所示是4个轮廓的周长值。
图2 周长结果图
注意:计算轮廓的周长值是按照轮廓的实际长度进行计算的,按第三个轮廓举例,将其放大至像素级别,如图3所示。
图3 轮廓示意图
寻找轮廓时,取的点为像素中心点,连接起来的黑线就是这个图形的轮廓,那么计算的周长应该是4个对角+4个三角(4*2+4*2*≈19.313708499),与计算机输出的结果一致。
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!