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

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

计算轮廓的周长或曲线的长度。

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

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

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

函数原型

cpp 复制代码
double cv::arcLength	
(
	InputArray 	curve,
	bool 	closed 
)		

参数

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

代码示例

cpp 复制代码
#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;
}

运行结果

终端输出:

bash 复制代码
Perimeter of the closed contour: 20.4853
Perimeter of the closed contour: 1176.15

图像:

相关推荐
什么都想学的阿超41 分钟前
【大语言模型 00】导读
人工智能·语言模型·自然语言处理
lxmyzzs43 分钟前
【图像算法 - 16】庖丁解牛:基于YOLO12与OpenCV的车辆部件级实例分割实战(附完整代码)
人工智能·深度学习·opencv·算法·yolo·计算机视觉·实例分割
明心知1 小时前
DAY 45 Tensorboard使用介绍
人工智能·深度学习
R-G-B1 小时前
OpenCV Python——Numpy基本操作(Numpy 矩阵操作、Numpy 矩阵的检索与赋值、Numpy 操作ROI)
python·opencv·numpy·numpy基本操作·numpy 矩阵操作·numpy 矩阵的检索与赋值·numpy 操作roi
维维180-3121-14551 小时前
AI大模型+Meta分析:助力发表高水平SCI论文
人工智能·meta分析·医学·地学
程序员陆通1 小时前
CloudBase AI ToolKit + VSCode Copilot:打造高效智能云端开发新体验
人工智能·vscode·copilot
程高兴1 小时前
遗传算法求解冷链路径优化问题matlab代码
开发语言·人工智能·matlab
拾零吖1 小时前
吴恩达 Machine Learning(Class 1)
人工智能·机器学习
数据皮皮侠2 小时前
最新上市公司业绩说明会文本数据(2017.02-2025.08)
大数据·数据库·人工智能·笔记·物联网·小程序·区块链
智算菩萨2 小时前
【计算机视觉与深度学习实战】05计算机视觉与深度学习在蚊子检测中的应用综述与假设
人工智能·深度学习·计算机视觉