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将直接存储构成凸包的点的坐标。通常情况下,返回点的索引更加灵活,因为允许我们根据需要从原始点集中检索额外信息。

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

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

相关文章

Vuejs中的nextTick

问题&#xff1a; 当在父组件中onMounted函数中调用一些子组件的方法时&#xff0c;提示是undefined。 原因是mounted 不会承诺所有的子组件也都一起被挂载完成。 解决方法利用 nextTick 或者setTimeout onMounted(()>{//利用nextTick 延迟执行 同 setTimeout执行nextTic…

高性能服务系列【十一】主题匹配

主题匹配核心算法就是字符串匹配&#xff0c;在字符串匹配基础上&#xff0c;会加入分段匹配需求&#xff0c;类似URL的点分式字符串。这个算法在几个场景中十分普遍。 1、应用层的路由寻址。比如反向代理中&#xff0c;根据请求中的URL&#xff0c;转发到对应的后台服务。 2…

代码随想录刷题随记6-哈希表2,双指针

代码随想录刷题随记6-哈希表2&#xff0c;双指针 454.四数相加II leetcode链接 这道题目是四个独立的数组&#xff0c;只要找到A[i] B[j] C[k] D[l] 0就可以&#xff0c;不用考虑有重复的四个元素相加等于0的情况 思路可以把A和B相加做成map,C和D相加做成另一个map。这样…

MQTT.fx和MQTTX 链接ONENET物联网提示账户或者密码错误

参考MQTT.fx和MQTTX 链接ONENET物联网开发平台避坑细节干货。_mqttx和mqttfx-CSDN博客 在输入password和username后还是提示错误&#xff0c;是因为在使用token的时候&#xff0c;key填写错误&#xff0c;将设备的密钥填入key中

How to convert .py to .ipynb in Ubuntu 22.04

How to convert .py to .ipynb in Ubuntu 22.04 jupyter nbconvertp2j 最近看到大家在用jupyter notebook&#xff0c;我也试了一下&#xff0c;感觉还不错&#xff0c;不过&#xff0c;也遇到了一些问题&#xff0c;比方说&#xff0c;我有堆的.py文件&#xff0c;如果要一个一…

堆排序-C语言

算法思想&#xff1a; 建立一个大根堆;&#xff08;将一棵普通的树转化为大根堆&#xff09; 每次将根和待排序的最后一个交换,然后再调整,循环len-1次即可; 调整为大根堆的方法&#xff1a; 从最后一棵子树开始,从后往前调整; 每次调整,从上往下; 调整为大根堆; 堆调整的代…

赛氪网亮相中国人工智能产业发展联盟会议,共筑赛事生态新篇章

2024年3月14日至15日&#xff0c;备受瞩目的中国人工智能产业发展联盟&#xff08;AIIA&#xff09;第十一次全体会议在海南海口盛大召开。作为人工智能领域的重要交流与合作平台&#xff0c;此次会议吸引了300余位联盟成员单位代表齐聚一堂&#xff0c;共襄盛举。在这场人工智…

blog-engine-07-gatsby 建极速网站和应用程序 基于React的最佳框架,具备性能、可扩展性和安全性。

拓展阅读 blog-engine-01-常见博客引擎 jekyll/hugo/Hexo/Pelican/Gatsby/VuePress/Nuxt.js/Middleman 对比 blog-engine-02-通过博客引擎 jekyll 构建 github pages 博客实战笔记 blog-engine-02-博客引擎jekyll-jekyll 博客引擎介绍 blog-engine-02-博客引擎jekyll-jekyl…

NIO与AIO

NIO与AIO NIO模型 在 LInux 环境中&#xff0c;java.nio.channels.Selector 的子类叫做 sun.nio.ch.EPollSelectorImpl &#xff0c;其底 层是基于 Epoll 模型去实现的 IO 多路复用器。 对于 Epoll 模型 我们需要了解到它底层的三个函数 在 JDK 实现的底层中&#xff0c;EPol…

某对象存储元数据集群改造流水账

软件产品&#xff1a;某厂商提供的不便具名的对象存储产品&#xff0c;核心底层技术源自HDFS和Amazon S3&#xff0c;元数据集群采用了基于MongoDB的NOSQL数据库产品和MySQL数据库产品相结合。 该产品的元数据逻辑示意图如下&#xff1a; 业务集群现状&#xff1a;当前第3期建…

面试(二)

目录 1.STL六大部件 2.STL容器 3.汇编 4.基于Freertos工训机器人面试 5.opencv常用函数 6.陀螺仪模块 JY901B 7.增量式与位置式PID区别&#xff1a; 8.MQTT 12.描述一下gcc的编译过程&#xff1f; 13.内存的最⼩存储单位以及内存的最⼩计量单位分别是&#xff1f; 14…

勾八头歌之分类回归聚类

一、机器学习概述 第1关机器学习概述 B AD B BC 第2关常见分类算法 #编码方式encodingutf8from sklearn.neighbors import KNeighborsClassifierdef knn(train_data,train_label,test_data):input:train_data用来训练的数据train_label用来训练的标签test_data用来测试的数据…

【Monero】Onion Monero Blockchain Explorer | 洋葱门罗币区块链浏览器

github&#xff1a;onion-monero-blockchain-explorer Onion Monero Blockchain Explorer特点: • 没有cookie&#xff0c;没有网络分析跟踪器&#xff0c;没有image&#xff0c; • 开源&#xff0c; • 完全用C编写&#xff0c; • 显示加密的付款 ID&#xff0c; • 显示环…

Django auth模块

【一】命令行创建用户 【1】语法 python manage.py createsuper【2】示例 用户名 默认是是电脑名称 邮箱 可以填也可以不填 密码 terminal中&#xff1a;输入密码不显示出来manage.py中&#xff1a;明文输入输入密码太简单会提示 Username (leave blank to use administra…

20231911 2022-2023-2 《网络攻防实践》实验三

1.实验内容 1、实践tcpdump 使用tcpdump开源软件对在本机上访问www.tianya.cn网站过程进行嗅探&#xff0c;回答问题&#xff1a;你在访问www.tianya.cn网站首页时&#xff0c;浏览器将访问多少个Web服务器&#xff1f;他们的IP地址都是什么&#xff1f; 2、实践Wireshark 使…

Cesium for UE-03-添加数据集(倾斜摄影)

继续上一章节&#xff0c;在创建了项目和关卡的基础上添加倾斜摄影 重新打开上次的项目和关卡 如果你已经关掉了上次的项目和关卡&#xff0c;可以重新打开ue&#xff0c;然后选择 选择 文件-打开关卡&#xff0c;在弹出的窗口中&#xff0c;选择 上次的关卡&#xff0c;并点击…

从汇编以及栈帧层面理解内联函数的原理

宏太复杂&#xff0c;所以弄出内联&#xff0c;内联适合小函数&#xff0c;把函数连到程序里面&#xff0c;这样就直接用&#xff0c;不需要调用&#xff0c;但是它占用空间。 C推荐 const和enum替代宏常量 inline去替代宏函数 宏缺点&#xff1a; 1、不能调试 2、没有类型安…

多层感知机-----自我神经MLP入门笔记

多层感知机&#xff08;Multilayer Perceptron, MLP&#xff09;是一种常见的人工神经网络&#xff08;Artificial Neural Network, ANN&#xff09;模型&#xff0c;它由多个人工神经元组成的多层结构。每个神经元都与前一层的所有神经元连接&#xff0c;并且每条连接都有一个…