OpenCV-计算轮廓周长cv::arcLength

作者:Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

函数原型 

double arcLength( InputArray curve, bool closed );

参数说明

  1. InputArray类型的curve,输入的向量,二维点(轮廓顶点),可以为std::vector或Mat类型。
  2. 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*\\sqrt{2}≈19.313708499),与计算机输出的结果一致。

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

© 版权声明
THE END
喜欢就支持一下吧
点赞258 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容