当前位置: 首页 > news >正文

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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 黑马点评2——商户查询缓存(P37店铺类型查询业务添加缓存练习题答案)redis缓存、更新、穿透、雪崩、击穿、工具封装
  • 搜维尔科技:使用Geomagic Touch X 对机械臂进行远程遥操作
  • 22. c语言怎么打印2进制、8进制、10进制、16进制数?
  • 基于Python的机器学习系列(25):使用PyTorch处理数据集
  • Unity版本升级2022 Gradle 升级7.x版本调整
  • JVM面试(五)垃圾回收机制和算法
  • opencv之阈值处理
  • 7种常见排序
  • 基于Spring的规则引擎EasyRule应用
  • jupyter 笔记本中如何判定bash块是否执行完毕
  • 【人工智能】Transformers之Pipeline(十四):问答(question-answering)
  • 【linux002】目录操作命令篇 - ls 命令
  • BF算法Java
  • HarmonyOs
  • 山 寨 币
  • [译]如何构建服务器端web组件,为何要构建?
  • 【面试系列】之二:关于js原型
  • ECMAScript入门(七)--Module语法
  • JavaScript 基本功--面试宝典
  • k8s 面向应用开发者的基础命令
  • Linux gpio口使用方法
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • Python学习之路13-记分
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 回顾2016
  • 悄悄地说一个bug
  • 如何在GitHub上创建个人博客
  • 深入 Nginx 之配置篇
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 为什么要用IPython/Jupyter?
  • linux 淘宝开源监控工具tsar
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • #{} 和 ${}区别
  • #Linux(make工具和makefile文件以及makefile语法)
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • ${factoryList }后面有空格不影响
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (九十四)函数和二维数组
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • ./和../以及/和~之间的区别
  • .Net Core 中间件验签
  • .Net IOC框架入门之一 Unity
  • .net 反编译_.net反编译的相关问题
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .NET大文件上传知识整理
  • .NET构架之我见
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示