您的位置:首页 > 文旅 > 美景 > OPenCV结构分析与形状描述符(2)计算轮廓周长的函数arcLength()的使用

OPenCV结构分析与形状描述符(2)计算轮廓周长的函数arcLength()的使用

2024/10/6 8:35:38 来源:https://blog.csdn.net/jndingxin/article/details/141890666  浏览:    关键词:OPenCV结构分析与形状描述符(2)计算轮廓周长的函数arcLength()的使用
  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

计算轮廓的周长或曲线的长度。
该函数计算曲线的长度或闭合轮廓的周长。

如果曲线是闭合的(即首尾相连),则计算的是轮廓的周长。
如果曲线是开放的(即首尾不相连),则计算的是曲线的长度。

函数原型

double cv::arcLength	
(InputArray 	curve,bool 	closed 
)		

参数

  • 参数curve 输入的二维点向量,存储在 std::vector 或 Mat 中。
  • 参数closed 标志,指示曲线是否是闭合的。

代码示例


#include <iostream>
#include <opencv2/opencv.hpp>int main()
{// 加载一张图片cv::Mat img = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/hawk.jpg", cv::IMREAD_COLOR );if ( img.empty() ){std::cerr << "Error: Image cannot be loaded!" << std::endl;return -1;}// 转换为灰度图cv::Mat grayImg;cv::cvtColor( img, grayImg, cv::COLOR_BGR2GRAY );// 二值化处理cv::Mat binaryImg;cv::threshold( grayImg, binaryImg, 0, 255, cv::THRESH_BINARY_INV + cv::THRESH_OTSU );// 查找轮廓std::vector< std::vector< cv::Point > > contours;cv::findContours( binaryImg, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE );// 计算每个轮廓的周长,并进行近似std::vector< std::vector< cv::Point > > approxContours( contours.size() );for ( size_t i = 0; i < contours.size(); ++i ){// 计算闭合轮廓的周长double perimeter = cv::arcLength( contours[ i ], true );std::cout << "Perimeter of the closed contour: " << perimeter << std::endl;// 近似轮廓cv::approxPolyDP( contours[ i ], approxContours[ i ], 0.02 * perimeter, true );// 绘制原始轮廓cv::drawContours( img, contours, static_cast< int >( i ), cv::Scalar( 0, 255, 0 ), 2 );// 绘制近似后的轮廓cv::drawContours( img, approxContours, static_cast< int >( i ), cv::Scalar( 255, 0, 0 ), 2 );}// 显示结果图像cv::imshow( "Contours and Approximations", img );// 等待按键,关闭窗口cv::waitKey( 0 );return 0;
}

运行结果

终端输出:

Perimeter of the closed contour: 20.4853
Perimeter of the closed contour: 1176.15

图像:
在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com