作者:Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
函数原型
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所示,测试代码画了4个圆,对整幅图进行轮廓统计时,从下往上,从左往右,分别标记了4个轮廓的顺序,如图2所示是4个轮廓的周长值。
注意:计算轮廓的周长值是按照轮廓的实际长度进行计算的,按第三个轮廓举例,将其放大至像素级别,如图3所示。
寻找轮廓时,取的点为像素中心点,连接起来的黑线就是这个图形的轮廓,那么计算的周长应该是4个对角+4个三角(4*2+4*2*≈19.313708499),与计算机输出的结果一致。
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!