opencv中凸包运算函数convexHull()的使用

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

1.功能描述

该函数cv::convexHull用于寻找一组二维点集的凸包,采用的是Sklansky算法[242],当前实现中具有O(N logN)的时间复杂度。

1.1什么是凸包?

让我们先从术语的两部分来理解——“凸”和“包”。

一个“凸”对象是指没有内角大于180度的对象。非凸的对象称为非凸的或凹的,下图展示了凸对象和非凸对象的例子。

包指的是物体的外部或轮廓。

因此,一组点或形状的凸包是一个紧贴着这些点或形状的最紧凑的凸边界。如图2所示,两个黑色形状的凸包用红色线条描绘。对于凸对象,其凸包就是其边界本身;而对于凹形状,凸包则是一个最紧致地包围它的凸边界。

2.函数原型


void cv::convexHull	(	InputArray 	points,OutputArray 	hull,bool 	clockwise = false,bool 	returnPoints = true 
)		

3.参数

  • 参数 points 输入的二维点集,存储在std::vector或Mat中.
  • 参数 hull 输出的凸包。它可以是一个索引的整数向量或点的向量。在第一种情况下,凸包元素是原数组中凸包点的基于0的索引(因为凸 包点的集合是原点集的子集)。在第二种情况下,凸包元素即凸包点本身.
  • 参数 clockwise 方向标志。如果该标志为真,输出的凸包按顺时针方向排列。否则,它按照逆时针方向排列。所采用的坐标系统其X轴指向右侧,Y轴指向上方。.
  • 参数 returnPoints 操作标志。当输入为矩阵且该标志为真时,函数返回凸包的点坐标。否则,它返回凸包点在原点集中的索引。如果输出数组是std::vector,该标志将被忽略,输出类型依据vector的实际类型而定:std::vector意味着returnPoints=false(返回索引),std::vector意味着returnPoints=true(返回点坐标)。

注意
points(输入点集)和hull(输出凸包)应该是不同的数组,不支持原地处理。这意味着cv::convexHull函数不会直接修改输入的点集数 组来存储结果,你需要提供一个独立的变量来接收计算出的凸包信息。

4.代码示例

#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;
int main( int argc, char** argv )
{Mat img( 500, 500, CV_8UC3 );RNG& rng = theRNG();for ( ;; ){int i, count = ( unsigned )rng % 100 + 1;vector< Point > points;for ( i = 0; i < count; i++ ){Point pt;pt.x = rng.uniform( img.cols / 4, img.cols * 3 / 4 );pt.y = rng.uniform( img.rows / 4, img.rows * 3 / 4 );points.push_back( pt );}vector< Point > hull;convexHull( points, hull, true );img = Scalar::all( 0 );for ( i = 0; i < count; i++ )circle( img, points[ i ], 3, Scalar( 0, 0, 255 ), FILLED, LINE_AA );imshow( "original", img );polylines( img, hull, true, Scalar( 0, 255, 0 ), 1, LINE_AA );imshow( "hull", img );char key = ( char )waitKey();if ( key == 27 || key == 'q' || key == 'Q' )  // 'ESC'break;}return 0;
}

5.运行结果

根据随机生成的点,然后根据这些点去进行运算,再把这些凸包点连接起来,如下图所示:

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

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

相关文章

2024: 有效使用OKR的10个技巧

2023年是许多前所未有的一年。从真正意义上讲&#xff0c;这一年让我们为不可预测的事情做好了准备&#xff0c;也为不确定的事情提供了训练。在我们身边发生了这么多事情&#xff0c;而下一步的行动却依然不甚明朗的情况下&#xff0c;领导者们更应该开始制定战略&#xff0c;…

Linux服务器挖矿病毒处理

文章目录 Linux服务器挖矿病毒处理1.中毒表现2.解决办法2.1 断网并修改root密码2.2 找出隐藏的挖矿进程2.3 关闭病毒启动服务2.4 杀掉挖矿进程 3. 防止黑客再次入侵3.1 查找异常IP3.2 封禁异常IP3.3 查看是否有陌生公钥 补充知识参考 Linux服务器挖矿病毒处理 情况说明&#x…

FuTalk设计周刊-Vol.033

&#x1f525;AI漫谈 热点捕手 1、Stable Video Diffusion —— Stable Diffusion 推出的 AI 生成视频模型 Stable Video Diffusion 也是开源的&#xff0c;可以免费下载部署。支持文本/图片生成视频&#xff0c;最高支持 576*1024 分辨率 25 帧。 链接https://huggingface.…

DV、OV通配符SSL证书有什么区别

通配符SSL证书是经常提及的一种SSL证书类型&#xff0c;也被称为泛域名SSL证书。通配符证书在SSL证书当中是比较特殊的&#xff0c;它具有保护主域名及其下一级所有子域名的功能&#xff0c;非常适合子域名多的域名网站&#xff0c;能够有效的节省成本&#xff0c;并降低证书管…

申办乙级资信证书,河南工程咨询单位流程详解

河南工程咨询单位申办乙级资信证书的流程详解如下&#xff1a; 一、前期准备阶段 研读政策文件&#xff1a; 研读《工程咨询行业管理办法》&#xff08;国家发展改革委2017年第9号令&#xff09;以及《国家发展改革委关于印发<工程咨询单位资信评价标准>的通知》&#x…

调建堆的时间复杂度的计算与topK问题

建堆复杂度的计算 向下调整建堆 第一层有2^0个节点&#xff0c;最坏向下调整h-1次&#xff0c;第二层有2^1个节点&#xff0c;最坏向下调整h-2次&#xff0c;以此类推&#xff0c;将每一层所有节点最坏情况需要调整的次数相加&#xff0c;就能得到一个式子&#xff1a; 最后到…

FanySkill源文件修改,快捷键以及新增任务栏选项

FanySkill源文件修改&#xff0c;快捷键以及新增任务栏选项 一、文件下载二、快捷键设置三、任务栏四、本人配置 一、文件下载 自行去PCB联盟网下载&#xff0c;因为那边下载要联盟币&#xff0c;我不清楚我免费提供会不会给我带来没必要的损失&#xff0c;敬请谅解。 要下载的…

怎么为自己的VPS选择合适的CPU和RAM?

为网站选择VPS&#xff08;虚拟专用服务器&#xff09;与为家庭或办公室选择台式机或笔记本电脑没有什么不同。基本上&#xff0c;您要做的就是查看硬件配置并比较功能和价格。 然而&#xff0c;虽然您可能对个人计算机所需的资源类型有一个粗略的估计&#xff0c;但为服务器获…

一文理清OCR的前世今生

AI应用开发相关目录 本专栏包括AI应用开发相关内容分享&#xff0c;包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧 适用于具备一定算法及Python使用基础的人群 AI应用开发流程概…

队列(数据结构篇)

数据结构之队列 队列(queue) 概念&#xff1a; 队列也是一种线性表&#xff0c;使用队列时插入在一端进行而删除则在另一端进行&#xff0c;队列的基本操作是入队&#xff0c;它是在表的末端(也叫做队尾)插入一个元素&#xff0c;出队&#xff0c;它是删除在**表的开头(**队…

Springboot 项目启动时扫描所有枚举并存入缓存(redis)

为什么这么做? 为了springboot 注解属性转换字典方便一点(使用缓存的方式在Springboot 启动时获取字典数据) 在启动时会扫描com.vehicle.manager.core.enumerate包下的所有枚举(包括类中的内部枚举),并取出对应属性以json的方式存入redis 目录结构如下: RedisUtil可以在Red…

DLT645电表数据 转IEC104项目案例

案例说明 设置网关采集DLT645电表数据数据把采集的数据转成IEC104协议转发给其他系统。 VFBOX网关工作原理 VFBOX网关是协议转换网关&#xff0c;是把一种协议转换成另外一种协议。网关可以采集西门子&#xff0c;欧姆龙&#xff0c;三菱&#xff0c;AB PLC&#xff0c;DLT64…

南开大学漏洞报送证书【文尾有福利】

证书介绍 获取来源&#xff1a;edusrc&#xff08;教育漏洞报告平台&#xff09; url&#xff1a;教育漏洞报告平台(EDUSRC) 兑换价格&#xff1a;30金币​ 获取条件&#xff1a;南开大学任意中危或以上级别漏洞 证书规格&#xff1a;证书做了木框装裱&#xff0c;显得很高…

我工作中用Redis的10种场景

Redis作为一种优秀的基于key/value的缓存&#xff0c;有非常不错的性能和稳定性&#xff0c;无论是在工作中&#xff0c;还是面试中&#xff0c;都经常会出现。 今天这篇文章就跟大家一起聊聊&#xff0c;我在实际工作中使用Redis的10种场景&#xff0c;希望对你会有所帮助。 …

竞赛选题 python opencv 深度学习 指纹识别算法实现

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python opencv 深度学习 指纹识别算法实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;4分创新点&#xff1a;4分 该项目较为新颖…

springBoot高校宿舍交电费系统-计算机毕业设计源码031552

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作…

忘记 iPhone 密码:如果忘记密码,如何解锁 iPhone

为了提高个人数据的安全性&#xff0c;用户通常会为不同的帐户和设备创建不同的复杂密码。虽然较新的 iPhone 型号具有生物识别和面部解锁功能&#xff0c;但这些功能并不总是有效 - 如果您忘记了 iPhone 的密码&#xff0c;您可能会遇到麻烦。 iPhone 用户和 Android 用户一样…

MYSQL 四、mysql进阶 4(索引的数据结构)

一、为什么使用索引 以及 索引的优缺点 1.为什么使用索引 索引是存储引擎用于快速找到数据记录的一种数据结构&#xff0c;就好比一本教科书的目录部分&#xff0c;通过目录中找到对应文章的页码&#xff0c;便可快速定位到需要的文章。Mysql中也是一样的道理&#xff0c;进行数…

办公人必备宝藏网站,提升工作效率!

对于每个办公人来说&#xff0c;如何在繁杂的工作中保持高效&#xff0c;是每位职场人士追求的目标。其中&#xff0c;高效的工具和资源可以极大地提升我们的工作效率。下面小编就来和大家分享一些办公人必备的宝藏网站&#xff0c;提升大家的工作效率。 1. 办公人导航 办公人…

反激开关电源变压器设计2

实际计算 已知 Vin&#xff1a;AC176-264V Vo&#xff1a;5V Io2A Vmax264V*根号2373V PoVo*Io10W η0.8 PinPo/η12.5W DCM变压器&#xff0c;在开关电源的整个输入电压范围内满载工作时都工作在断续模式 CCM变压器&#xff0c;在开关电源的整个输入电压范围内满载工作时都工…