C++中的凸包:convexHull使用手册【c++重要方法】

最近工作中,用到了凸包,查了一些资料,差不多搞明白了,在这里做一个总结,希望可以帮助到你!

什么时候需要它?

如果你想要把一群散落的点,包裹起来。而且希望这个包裹尽可能地紧凑,那么你就需要一个凸包(Convex Hull)。

举个例子,你撒了一把钉子在地板上,然后用一根橡皮筋围住它们,橡皮筋最终的形状,就是这些钉子的凸包。
在这里插入图片描述

在C++中,我们用convexHull函数来模拟这根橡皮筋的魔法。

凸包的魔法!

在计算机视觉、图像处理和几何形状分析中,凸包是一个基础且强大的工具。

它可以帮助我们简化问题,比如识别物体的形状、计算物体的边界,或者是在机器学习中作为特征提取的一部分。

如何召唤凸包?

在C++中,召唤凸包的法术,藏在OpenCV库里。首先,确保你已经引入了OpenCV这位强大的盟友。

然后,进行如下步骤:

1. 给出你的点

首先,你需要有一组点。这些可以是图像中的特征点,也可以是任何你需要分析的空间数据点。

#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;

vector points = {{2, 5}, {3, 4}, {6, 1}, {5, 2}, {8, 7}};

2. 召唤凸包

使用convexHull函数,来计算这些点的凸包。你需要提供点的集合 points,和一个用于存储凸包顶点索引的向量 hull。

vector hull;
convexHull(points, hull, false);

3. 使用凸包

现在,hull向量中就包含了构成凸包的点的索引。我们可以使用这些索引,来获取凸包的点。

for(size_t i = 0; i < hull.size(); i++)
{
cout << points[hull[i]] << endl;
}

浅谈凸包

凸包不仅仅是一种计算几何形状的工具。

在数据分析、机器学习、图像识别等领域,凸包能帮助我们提取有用的特征,简化复杂问题。

甚至在某些情况下,提高算法的效率和准确性。

凸包原理

OpenCV中的convexHull函数,实现基于Andrew’s monotone chain算法。

这是一种有效的凸包检测算法,用于计算一组二维点的最小凸包。

Andrew’s算法是由Andrew在1979年提出的,它被广泛应用于计算几何领域中凸包的计算。
在这里插入图片描述

函数参数

convexHull(InputArray points, 
		   OutputArray hull, 
		   bool clockwise=false, 
		   bool returnPoints=true);

1. InputArray points:

类型: InputArray

描述: 一个包含了需要计算凸包的点集的容器。InputArray是OpenCV中一个通用的容器类型,它可以接受std::vectorcv::Point、cv::Mat等多种类型的点集合。点通常是二维的,但也可以是多维。

2. OutputArray hull:

类型: OutputArray

描述: 一个用于存储计算出的凸包结果的容器。根据returnPoints参数的值,这个容器将存储构成凸包的点的索引(如果returnPoints为true)或者是直接存储点坐标(如果returnPoints为false)。与InputArray一样,OutputArray也是一个通用容器,能够接受多种类型的输出格式。

3. bool clockwise:

类型: bool
默认值: false

描述: 指定凸包的顶点是按顺时针方向还是逆时针方向排序。默认情况下,顶点是按逆时针方向排序的,这符合大多数地理和图像处理的习惯。

4. bool returnPoints:

类型: bool
默认值: true

描述: 控制函数的返回值是点的索引还是点的坐标。为true时,hull将包含输入点集points中构成凸包的点的索引。为false时,hull将直接存储构成凸包的点的坐标。通常情况下,返回点的索引更加灵活,因为允许我们根据需要从原始点集中检索额外信息。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【c++】类和对象(四)深入了解拷贝构造函数

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好啊&#xff0c;本篇内容带大家深入了解拷贝构造函数 目录 1.拷贝构造函数1.1传值调用的无限调用1.2浅拷贝1.3深拷贝1.4深拷贝的实现 1.拷贝构造函数 拷贝构造函数是一种特殊的…

Linux/Pandora

Pandora Enumeration nmap 第一次扫描发现系统对外开放了22和80端口&#xff0c;端口详细信息如下 访问80端口&#xff0c;显示PLAY是Panda.htb的扩展&#xff0c;将网络监控解决方案带到家门口 尝试添加Panda.htb到/etc/hosts中&#xff0c;访问得到的页面却是一样的&#x…

工具推荐-eNSP(Enterprise Network Simulation Platform)

一.简介 1.1 一款由华为提供的免费的、可扩展的、图形化操作的网络仿真工具平台。 1.2 主要对企业网络路由器、交换机进行软件仿真&#xff0c;完美呈现真实设备实景&#xff0c;支持大型网络模拟。 1.3 让广大用户有机会在没有真实设备的情况下能够模拟,进行模拟网络架构和建…

Mamba复现与代码解读

文章目录 环境配置demo推理源码解析参数解读Mamba块&#xff08;Mamba Block&#xff09;状态空间模型(SSM)选择性扫描算法&#xff08;selective_scan&#xff09;前向传播&#xff08;forward&#xff09; 均方根归一化 &#xff08;RMSNorm&#xff09;残差块&#xff08;Re…

批量删除 rabbitmq中随机队列

批量删除 amq.gen–* 随机队列 操作错误产生了无效随机队列&#xff0c;需要批量删除 过滤列出指定amq.gen–队列 # 列出 指定 vhost/qq 以amq.gen开头的所有队列 rabbitmqctl list_queues --vhost / | grep ^amq.gen-# 批量删除队列 #由于list_queues会列出队列名称以及对应…

Windows系统部署瀚高数据库

1.安装包解压之后&#xff0c;执行setup.exe hgdb-enterprise-6.0.4.rar 2.勾选“我接受协议”&#xff0c;点击下一步&#xff0c;设置数据库安装目录&#xff08;注意安装路径&#xff0c;不要包含中文&#xff0c;也尽量不要包含特殊符号。这里默认会是“6.0.4”&#xff0…

MOV压敏电阻的微观结构与制造工艺

EAK 压敏电阻 应用于电力系统的MOV目前主要有两大系列&#xff0c;它们都是以ZnO为主要成分再加人少量其他金属氧化物添加剂而构成的。添加剂为Bi,O:、Sb,O:、MnO₂和CoO,等构成的 MOV称为Bi系列:添加剂为Pr,0、Co,0、Mg0而不含B,0,或含量极少的MOV称为Pr系列(或称稀土系列)。添…

GIS与Python机器学习:开创地质灾害风险评价新纪元

地质灾害是指全球地壳自然地质演化过程中&#xff0c;由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。由于降水、地震等自然作用下&#xff0c;地质灾害在世界范围内频繁发生。我国除滑坡灾害外&#xff0c;还包括崩塌、泥石流、地面沉…

基于springboot+vue实现的基于B2C模式的电子商务平台

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

【免费教程】创建元宇宙3D纪念馆、发布云祭扫3D模型的免费教程

免注册步骤如下&#xff1a; 1、下载html浏览器纯净版&#xff08;推荐电脑打开&#xff0c;网址&#xff1a;https://gitee.com/dtnsman/dtns/raw/master/release/dtns.connector-html.dist-2024-3-27-web.zip 2、切换至&#xff1a;dev00mansfast&#xff08;或qw&#xff…

【前端】Layui的表格常用功能,表单提交事件,表格下拉按钮点击事件,表格外的按钮点击事件

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《前端》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握…

QT作业day5

实现闹钟 头文件&#xff1a; #define ALARM_CLOCK_H#include <QWidget> #include <QTime> #include <QTimerEvent> #include <QTimer> #include <QtTextToSpeech> //文本转语音类 #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { c…

怎么制作iOS证书

首先我们登录appuploder官网 搜索 appuploder 第一个就是我们官网啦&#xff0c;网址是&#xff1a;Appuploader home -- A tool improve ios develop efficiency such as submit ipa to appstore and manage ios certificate 可以跨平台开发&#xff0c;无论是Windows还是Ma…

【计算机操作系统】深入探究CPU,PCB和进程工作原理

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

spring 的理解

spring 的理解 spring 是一个基础的框架&#xff0c;同时提高了一个Bean 的容器&#xff0c;用来装载Bean对象spring会帮我们创建Bean 对象并维护Bean对象 的生命周期。在spring 框架上&#xff0c;还有springCloud,spring Boot 的技术框架&#xff0c;都是以Spring为基石的sp…

设计模式深度解析:深入浅出的揭秘游标尺模式与迭代器模式的神秘面纱 ✨

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 深入浅出的揭秘游标尺模式与迭代器模式的神秘面纱 开篇&#xff1a; 欢迎来到设计模式的神秘…

【Python】python编程初探2---字符编码,输入和输出,初识数据类型

欢迎来CILMY23的博客 本篇主题为【Python】python编程初探2---字符编码&#xff0c;输入和输出&#xff0c;初识数据类型 个人主页&#xff1a;CILMY23-CSDN博客 Python系列专栏&#xff1a;​​​​​​​http://t.csdnimg.cn/rAsEH 上一篇博客&#xff1a;http://t.csdni…

【第二部分--Python之基础】02

二、运算符与程序流程控制 1、运算符 1.1 算术运算符 算术运算符用于组织整数类型和浮点类型的数据&#xff0c;有一元运算符和二元运算符之分。 一元算术运算符有两个&#xff1a;&#xff08;正号&#xff09;和-&#xff08;负号&#xff09;&#xff0c;例如&#xff1…

单臂路由和三层交换机

目录 一.单臂路由 1.单臂路由的工作原理 2.单臂路由的配置 2.1画出拓扑图 2.2配置PC 2.3配置交换机 2.4配置路由器 2.5测试 二.三层交换机 1.三层交换机的概述 2.三层交换机的配置 2.1画出拓扑图 2.2配置PC 2.3配置二层交换机 2.4配置三层交换机 2.5测试 3.拓展 三.总结 一.…

【linux深入剖析】基础IO操作 | 使用Linux库函数实现读写操作 | 文件相关系统调用接口

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 前言1.复习C文件IO相关操…