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

news2024/9/28 15:33:21
  • 操作系统: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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2104104.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS解析:层叠、优先级和继承

CSS虽说不是编程语言&#xff0c;但是日常使用中经常有很多误解&#xff0c;发现样式不奏效的情况&#xff0c;所以需要加强下CSS基础。 CSS本质上就是声明规则&#xff0c;即在各种条件下&#xff0c;我们希望产生特定的效果。 如果某个元素有这个类&#xff0c;则应用这些样…

英文翻译哪家强?2024年3款热门工具大比拼

现在世界变得越来越“小”&#xff0c;英语几乎成了大家都懂的语言。但对那些天天忙工作的小伙伴们来说&#xff0c;一大堆英文的东西&#xff0c;比如文件、邮件、会议记录&#xff0c;看着就头大。好在&#xff0c;科技帮了大忙&#xff0c;出了好多翻译工具。2024年&#xf…

php邮箱服务器怎么搭建?如何构建服务器?

php邮箱服务器配置教程指南&#xff1f;php邮件服务器如何搭建&#xff1f; 搭建一个稳定高效的php邮箱服务器&#xff0c;不仅可以提升邮件传输的效率&#xff0c;还能增强数据的安全性。那么&#xff0c;如何着手搭建这样一个服务器呢&#xff1f;AokSend将详细探讨php邮箱服…

使用YOLOv10训练自定义数据集之一(环境部署)

0x00 前言 由清华大学的研究团队基于 Ultralytics Python 包研发的 YOLOv10&#xff0c;通过优化模型结构并去除非极大值抑制&#xff08;NMS&#xff09;环节&#xff0c;提出了一种创新的实时目标检测技术。这些改进不仅实现了行业领先的检测性能&#xff0c;还降低了对计算…

网络编程----网络基础ip地址

一丶IP地址 1.基本概念 1. IP地址是Internet中主机的标识 2. Internet中的主机要与别的机器通信必须具有一个IP地址 3. IP地址为32位&#xff08;IPv4&#xff09;或者128位&#xff08;IPv6&#xff09; NAT&#xff1a;公网转私网、私网转公网 4. IPV4表示形式&…

【简历】25届上海某一本JAVA简历:第一次看学校背景写一页的

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这是一份25 届上海某一本大学硕士的Java简历。这份简历写得比较偏&#xff0c;让人头疼。 这位同学的学校是重点一本&#xff0c;可以冲…

C++第四十五弹---深入理解包装器:提升代码复用性与安全性的利器

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1 包装器 1.1、function包装器 1.2、bind 1 包装器 1.1、function包装器 function包装器 也叫作适配器。C中的function本质是一个类模板&…

uniapp树洞烦恼分享系统 微信小程序设计与实现 80igt

目录 博主介绍技术栈系统设计&#x1f31f;文末获取源码数据库&#x1f31f;具体实现截图后端前端java类核心代码部分展示可行性论证个人心得系统测试操作可行性源码获取详细视频演示 博主介绍 &#x1f447;&#x1f3fb; 博主介绍&#xff1a;&#x1f447;&#x1f3fb; 专…

使用 WARP 和 Perf 测试对 MinIO 企业对象存储进行基准测试

AI/ML、高级分析和数据库等现代应用程序需要高性能对象存储。MinIO Enterprise Object Store 将可扩展性和高性能相结合&#xff0c;使每个工作负载&#xff08;无论要求多么苛刻&#xff09;触手可及。我们发布的基准测试表明&#xff0c;MinIO Enterprise Object Storage 是市…

泰克Tektronix MSO46 一款混合信号示波器

Tektronix MSO46 是一款混合信号示波器 (MSO)&#xff0c;专为调试和分析复杂的电子电路而设计。FlexChannel 技术使每个通道输入都可以用作单个模拟通道、八个数字逻辑输入&#xff08;使用 TLP058 逻辑探头&#xff09;或同时使用模拟和频谱视图&#xff0c;每个域都有独立的…

前端进阶|一文理解柯里化的逆操作,什么是反柯里化

温故而知新 在说反柯里化之前&#xff0c;先来复习下柯里化的基础。之前文章&#xff0c;我们了解了什么是柯里化&#xff0c;以及柯里化的实现原理&#xff0c;同时我们也明白了什么情况下我们使用柯里化&#xff0c;详细阅读参见之前文章《前端进阶&#xff5c;由浅入深的理…

探索Python世界的趣味之旅:自制贪吃蛇游戏

通过本次贪吃蛇游戏的开发实践&#xff0c;不仅可以掌握Python编程语言的基础知识&#xff0c;还深入了解了游戏开发的基本流程和技术要点。这只是一个开始&#xff0c;Python的世界远不止于此。未来&#xff0c;你可以尝试开发更复杂、更有趣的游戏项目&#xff0c;甚至探索人…

Java详解String 字符串类以及String内存原理、StringBuilder类、StringJoiner类(附有代码+案例)

文章目录 九.String 字符串类型9.0 String概述9.1 字符串常用方法9.2 String内存图9.2.1直接赋值9.2.2new出来 9.3字符串比较9.4 字符串遍历9.4.1 统计字符串大小写及数字9.4.2 拼接字符串9.4.3字符串反转 9.5 StringBuilder类9.5.1StringBuilder 构造方法9.5.2StringBuilder常…

Spring全局异常处理HandlerExceptionResolver使用

1 引言 全局异常处理在项目中经常会用到&#xff0c;主要作用包括统一处理异常、提供友好的错误信息、避免应用程序崩溃、记录异常日志、避免异常信息泄露等等。下文将以实现HandlerExceptionResolver接口的方式&#xff0c;实现全局异常处理功能及常规用法。 2 代码 下面列…

Qt 字符串的编码方式,以及反斜杠加3个数字是什么编码\344\275\240,如何生成

Qt 字符串的编码方式 问题 总所周知&#xff0c;Qt的ui文件在编译时&#xff0c;会自动生成一个ui_xxxxx.h的头文件&#xff0c;打开一看&#xff0c;其实就是将摆放的控件new出来以及布局的代码。 只要用Qt提供的uic.exe工具&#xff0c;自己也可以将ui文件输出为代码文件…

day17JS-Cookle、webStorage和Promise

1. 什么是Cookle 在网页中需要向当前电脑中存储一些数据&#xff0c;通过cookie可以存储。 Cookie &#xff1a;是一种由服务器发送到用户浏览器并保存在用户计算机上的小型文本文件&#xff0c;用于识别用户身份、跟踪用户活动、保存用户设置等。它通常包括名称、值、域名、…

云服务器+docker:还在为项目上线苦恼?一文包你解决(保姆级教程,图文并茂,万字起步!!!)

目录 Blue留言机&#xff1a; 学习视频以及参考资料 &#xff1a; 1、学习之前的必备操作&#xff1a; 第一步&#xff1a;购买服务器 选择一台免费的云服务器&#xff08;包白嫖的&#xff09; 配置服务器的一点说明&#xff1a; 查看自己是否购买成功&#xff1a; 第…

解决UOS开发截图时电脑滴滴声

在使用import命令截图时&#xff0c;电脑会伴随滴滴声&#xff0c;影响程序使用体验&#xff0c;使用 sudo rmmod pscpkr 即可解决滴滴声&#xff0c;这个命令每次开机&#xff0c;重新运行程序时都需输入&#xff0c;因此需要在脚本文件中自动执行&#xff0c;但是sudo命令需…

Tomcat8版本以上配置自定义400错误页面

问题&#xff1a;当请求URL包含特殊字符时&#xff0c;Tomcat会自动拦截并返回400状态码页面&#xff0c;暴露了tomcat的版本信息&#xff0c;这是很严重的安全漏洞。 java.lang.IllegalArgumentException: 在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义 解…

Kafka【六】Linux下安装Kafka(Zookeeper)集群

Kafka从早期的消息传输系统转型为开源分布式事件流处理平台系统&#xff0c;所以很多核心组件&#xff0c;核心操作都是基于分布式多节点的。本文这里采用三台虚拟机模拟真实物理主机搭建Zookeeper集群和kafka集群。 VMware可以使用户在一台计算机上同时运行多个操作系统&…