OPenCV结构分析与形状描述符(1)近似多边形轮廓顶点的函数approxPolyDP()的使用

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

算法描述

按指定的精度近似一个多边形曲线

cv::approxPolyDP 函数使用另一条曲线或多边形来近似一条曲线或多边形,新曲线或多边形的顶点数较少,且两者之间的距离小于或等于指定的精度。该函数使用 Douglas-Peucker 算法。

  • Douglas-Peucker 算法:http://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm

函数原型


void cv::approxPolyDP
(
	InputArray 	curve,
	OutputArray 	approxCurve,
	double 	epsilon,
	bool 	closed 
)		

参数

  • 参数curve 输入的二维点向量,可以存储在 std::vector 或 Mat 中。
  • 参数approxCurve 近似的结果。其类型应当与输入曲线的类型一致。
  • 参数epsilon 指定近似精度的参数,即原始曲线和近似曲线之间的最大允许距离。
  • 参数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 );

    // 绘制原始轮廓
    cv::Mat contourImg = cv::Mat::zeros( img.size(), CV_8UC3 );
    cv::drawContours( contourImg, contours, -1, cv::Scalar( 0, 255, 0 ), 2 );

    // 对每个轮廓进行近似
    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 );

        // 近似轮廓
        cv::approxPolyDP( contours[ i ], approxContours[ i ], 0.02 * perimeter, true );

        // 绘制近似后的轮廓
        cv::drawContours( contourImg, approxContours, static_cast< int >( i ), cv::Scalar( 255, 0, 0 ), 2 );
    }

    // 显示原始轮廓和近似后的轮廓
    cv::imshow( "original Image", img );
    cv::imshow( "Contour Image", contourImg );

    // 等待按键,关闭窗口
    cv::waitKey( 0 );

    return !0;
}

运行结果

在这里插入图片描述

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

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

相关文章

PYTHON发送邮件详细流程

不求别的你要是觉得有用给我一个关注攒攒❤ 安装第三方库 dos命令窗口 pip install pyEmail 两个邮箱准备齐&#xff1a; 我让我的163邮箱做服务器向qq邮箱发邮件 互联网上的两个软件要想通信要有协议&#xff0c;因此开启协议 import smtplib #协议包 from email.mime.t…

【路径规划】2D/3D RRT* 算法 - 使用快速探索随机树进行最优路径规划

摘要 本文介绍了快速探索随机树星&#xff08;RRT* &#xff09;算法在2D和3D空间中的实现&#xff0c;用于最优路径规划。RRT*算法通过增量采样的方法&#xff0c;不断优化路径&#xff0c;以收敛到全局最优解。2D版本结合避障功能&#xff0c;能够有效避开给定的障碍物&…

IP地址与物理地址:‌区别解析及在网络通信中的作用

在网络通信的广阔领域中&#xff0c;‌IP地址与物理地址是两个至关重要的概念。‌尽管它们在网络连接和数据传输中都扮演着举足轻重的角色&#xff0c;‌但二者之间存在着本质的区别。‌下面一起跟着虎观代理小二了解IP地址与物理地址的区别&#xff0c;‌并解析它们在网络通信…

ActiViz实战:使用Actor2D画一个二维网格

文章目录 一、效果预览二、交互三、C#源码示例一、效果预览 二、交互 1、能实现等比缩放 2、不允许平移和旋转 3、能够与三维坐标大小匹配 三、C#源码示例 private void AddCudeAxes2D() {double scale =

SprinBoot+Vue餐厅点餐系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

【自动驾驶】控制算法(七)离散规划轨迹的误差计算

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

SOMEIP_ETS_086: Eventgroup_EventsAndFieldsAll_2_TCP

测试目的&#xff1a; 验证设备&#xff08;DUT&#xff09;是否能够针对事件组0x02发送SubscribeEventgroupAck&#xff0c;并且发送所有初始字段。 描述 本测试用例旨在检查DUT在接收到针对事件组0x02的SubscribeEventgroup消息后&#xff0c;是否能够正确响应SubscribeEv…

覆盖 7 百万问答数据,上海 AI Lab 发布 ChemLLM,专业能力比肩 GPT-4

随着人工智能技术的飞速发展&#xff0c;大语言模型 (LLMs) 凭借其强大的自然语言处理能力&#xff0c;在生命科学、海洋学、材料化学等科学研究中被广泛应用。虽然&#xff0c;LLMs 在分子特性预测、分子生成和实验方案设计等化学相关任务上表现良好&#xff0c;但在处理各种化…

IDEA莫名奇妙自动选择光标所在行 -罪魁祸首居然是钉钉

请看受害者视角 作为开发者&#xff0c;工作时基本都会运行钉钉吧。最近&#xff0c;钉钉更新了AI功能&#xff0c;但不知道是不是开发团队平时不使用IDE&#xff0c;竟然让这个AI功能影响到了其他软件&#xff0c;简直让人无语。不仅仅是IDEA受影响&#xff0c;就连WebStorm也…

<C++> AVLTree

目录 1. AVL概念 2. AVL树节点的定义 3. AVL树的插入 4. AVL树的旋转 5. AVL树的验证 6. AVL树的删除 7. AVL树的性能 暴力搜索、二分搜索、二叉搜索树、二叉平衡搜索树&#xff08;AVL、红黑树&#xff09;、多叉平衡搜索树&#xff08;B树&#xff09;、哈希表 1. AVL概念 二…

RAG 实践- Ollama+RagFlow 部署本地知识库

前言 本文我们介绍另一种实现方式&#xff1a;利用 OllamaRagFlow 来实现&#xff0c;其中 Ollama 中使用的模型仍然是Qwen2 我们再来回顾一下 RAG 常见的应用架构 RagFlow的安装和部署 前置条件 CPU > 4 核RAM > 16 GBDisk > 50 GBDocker > 24.0.0 & Dock…

迅为RK3568 开发板赋能数字广告,推动智能化使用北京迅为RK3568核心板作为广告机主控

广告机作为一种高效且灵活的宣传工具&#xff0c;正逐步成为商场、车站、机场等各类公共场所的标配。广告机通过数字化的方式展示广告内容和提供实时信息更新&#xff0c;有效地提升了广告和信息的覆盖率。 如何设计一款广告机&#xff0c;根据广告机的需求和工作环境&#x…

2024年住宅代理市场概况:趋势与选择指南

在数字化时代&#xff0c;网络安全和数据保护越来越受到重视。尤其在网络环境中&#xff0c;真实的IP地址成为保护个人信息安全和数据安全的重要抓手。住宅代理作为一种有效的解决方案&#xff0c;在这个领域扮演了关键角色。本文将探讨2024年住宅代理市场的概况&#xff0c;分…

【CTF Web】BUUCTF Upload-Labs-Linux Pass-03 Writeup(文件上传+PHP+特殊可解析扩展名绕过)

Upload-Labs-Linux 1 点击部署靶机。 简介 upload-labs是一个使用php语言编写的&#xff0c;专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关&#xff0c;每一关都包含着不同上传方式。 注意 1.每一关没有固定的…

数据库:笔记01绪论

基本概念 数据&#xff08;Data) 描述事物的符号记录称为数据&#xff0c;并且可以数字化存入计算机。 数据的含义称为数据的语义&#xff0c;数据与其语义是不可分的。 数据库&#xff08;DataBase&#xff0c;DB&#xff09; 存放数据的仓库 数据库数据具有永久存储、有…

【大模型测评】2024大语言模型综合能力测评报告(免费下载)

前言 2024年大语言模型综合能力测评报告揭示了全球大模型市场的爆发式增长&#xff0c;特别是在算法架构、数据处理和应用场景上的显著进步。 从2017年的诞生阶段到2023年的爆发期&#xff0c;大模型技术经历了从Transformer神经网络架构的奠基到多模态理解与内容生成能力的飞…

笔试,牛客.kotori和n皇后​,牛客.AOE还是单体

目录 牛客.kotori和n皇后​编辑 牛客.AOE还是单体 牛客.kotori和n皇后 想起来&#xff0c;我之前还写过n皇后的题&#xff0c;但是这个我开始只能想到暴力解法 判断是不是斜对角线&#xff0c;联想yxb和y-xb,假如在一条线上&#xff0c;那么他们的x和y会对应成比例&#xff0c…

iscntrl函数讲解 <ctype.h>头文件函数

目录 1.头文件 2.iscntrl函数 1.头文件 以上这些函数都属于头文件<ctype.h>中的函数,其中包括iscntrl函数 #include<ctype.h> 2.iscntrl函数 简述&#xff1a;iscntrl 函数用来判断字符是否为控制字符&#xff0c;控制字符为ASCII值在0x00到0x7f之间 控制字符主…

在 Facebook 上投放广告需要多少钱?

Facebook 拥有 23.2 亿的月活跃用户&#xff0c;用户体量非常庞大&#xff0c;你的目标群体出现在社交媒体平台上的可能性非常高&#xff0c;所以企业会选择在Facebook 上投放广告。很多朋友想入局&#xff0c;但总是在思考Facebook 推广到底要花多少钱才能有效&#xff1f;如果…

Unknown command: “create-react-app“

在创建react项目时出现报错" Unknown command: "create-react-app" " 解决方法&#xff1a; 配置全局变量&#xff0c;" win r " 打开cmd窗口&#xff0c;输入下列命令&#xff0c;回车等待结束即可&#xff1a; npx create-react-app my-pro…