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

news2024/10/5 13:37:59
  • 操作系统: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.coloradmin.cn/o/1842355.html

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

相关文章

【ai】tx2-nx 查看 jetpack 版本信息及对应的tritonserver

3 jtop nvidia@tx2-nx:~$ jtop [WARN] Board missing UNKNOWN (press CTRL + Click) nvidia@tx2-nx:~$ 点击info 可以看到 jetpack是4.6opencv 是4.1.15.1.2 的不适合我 tritonserver2.35.0-jetpack5.1.2-update-2.tgz tritonserver2.19.0-jetpack4.6.1.tgz. 4.6.1<

滚动轴承振动信号异常检测方法总结(NASA-IMS轴承数据,Python)

之前的文章&#xff1a; 基于自编码器的滚动轴承异常检测方法&#xff08;NASA-IMS轴承数据&#xff0c;Python&#xff09; 基于单类支持向量机的滚动轴承异常检测方法&#xff08;NASA-IMS轴承数据&#xff0c;Python&#xff09; 基于主成分分析的滚动轴承异常检测方法&a…

Python运算符重载,代码秒变高大上!

目录 1、运算符重载基础介绍 🧮 1.1 什么是运算符重载 1.2 为何使用运算符重载 1.3 Python中的特殊方法魔法 示例:重载加法运算符 2、实战:重载加法运算符 + 🧩 2.1 自定义类与__add__() 2.2 应用案例:复数加法 2.3 深入理解__add__方法 3、重载其他运算符示例…

js实现canvas截图功能

关键代码 使用canvas的导出功能和drawImage函数 class CropShape{cropShape(shape){let {x,y,w,h} shapeconsole.log(x,y,w,h)const roiCanvas document.createElement(canvas);document.getElementById(app).append(roiCanvas)const roiCtx roiCanvas.getContext(2d);roi…

如何选择理想CDN服务商来提升网站性能

在数字时代&#xff0c;网络速度已成为衡量网站成功的关键指标之一。快速加载的网站不仅提升用户体验&#xff0c;还对网站的搜索引擎排名产生显著影响。用户期望网站能够迅速响应其请求&#xff0c;而任何延迟都可能导致用户不满和流失。研究表明&#xff0c;网站加载时间的每…

【产品经理】订单处理6-审单方案

电商系统中订单管理员会对特殊类型的订单进行审核&#xff0c;普通订单则自动审核&#xff0c;本节讲述自动审单方案、手动审单以及加急审单。 一、自动审单 自动审单方案可按照方案形式制定&#xff0c;可一次性制定多套审单方案。 1. 审单通过条件有 执行店铺&#xff…

Python爬虫实战:淘宝商品爬取与数据分析

一、爬虫技术概述 爬虫技术是一种在互联网上自动收集信息的方法。通过编写程序&#xff0c;让计算机自动访问网站&#xff0c;获取所需数据&#xff0c;并进行分析和处理。Python作为一种功能强大、易于学习的编程语言&#xff0c;其爬虫库Scrapy更是爬虫技术的利器。 二、淘…

段码屏省电低功耗驱动芯片PC164S32|128点阵|低功耗LCD屏专用芯片

1 简介 PC164S32 是一款支持 128 点 (32 4)显示 的多功能 LCD 控制器芯片&#xff0c;内部存储器RAM数据直接映射到 LCD 显示。可软件配置特性使其适用于包括 LCD 模块和显示子系统在内的多种 LCD 应用。主控制器与 PC164S32接口仅需3 或 4 条线。内置的省电模式极大的降低了功…

LangChain入门到精通,看这这篇吊打面试官

导语 在人工智能领域的不断发展中&#xff0c;语言模型扮演着重要的角色。特别是大型语言模型&#xff08;LLM&#xff09;&#xff0c;如ChatGPT&#xff0c;已经成为科技领域的热门话题&#xff0c;并受到广泛认可。在这个背景下&#xff0c;LangChain作为一个以LLM模型为核…

深度学习1 -- 开头

一 前言 感觉用这玩意越来越多&#xff0c;所以想学学。不过没想好怎么学&#xff0c;也没有提纲&#xff0c;买了两本书&#xff0c;一本是深度学习入门&#xff0c;小日子写的。还有一本就是花书。还有就是回Gatech参加线上课程&#xff0c;CS7643。 CS 7643: Deep Learnin…

ps 科研图文字变清晰

目录 网站 PS 网站 AI照片修复神器&#xff0c;一键模糊图片变清晰 (picwish.cn) PS 用PS快速将一张模糊不清晰的照片变清晰&#xff0c;简单5步就好 - 知乎 (zhihu.com) CrtlJ 滤镜 其他 高反差 半径调2 叠加

【机器学习300问】128、简述什么Word2Vec?

一、一句话说明Word2Vec是什么&#xff1f; Word2Vec是一种常见的词嵌入技术。Word2Vec的目标是将每个词表示为一个向量&#xff0c;使得这些向量能够反映出词语之间的相似性和关联性。 word2vec算法通过预测中心词和上下文词的共现概率来学习词向量&#xff0c;能够捕捉词语之…

LeetCode 338.比特位计数

各位朋友们&#xff0c;大家好啊&#xff0c;今天此题我用的方法比较好理解&#xff0c;但时间复杂度比较高如果大家觉得可以的话&#xff0c;不妨给个免费的赞吧&#xff0c;谢谢了^ _ ^ 1.题目要求如图所示: 2.做题步骤: 1.先计算总共多少个数: int count 0;int number 0;…

二叉树(数据结构篇)

数据结构之二叉树 二叉树 概念&#xff1a; 二叉树(binary tree)是一颗每个节点都不能多于两个子节点的树&#xff0c;左边的子树称为左子树&#xff0c;右边的子树称为右子树 性质&#xff1a; 二叉树实际上是图&#xff0c;二叉树相对于树更常用。 平衡二叉树的深度要比…

重磅!鹅厂大牛带你30分钟玩转AI智能结对编程!

在大模型时代&#xff0c;人工智能技术的突破性进展正重塑着软件开发的面貌。AI的融入不仅优化了代码编写过程&#xff0c;更开启了智能编程的新纪元&#xff0c;为开发者带来了前所未有的工作效率和创新可能。AI结对编程不仅能够极大提升研发效率&#xff0c;还能通过智能分析…

C++语法06 格式化输出及保留小数点后指定位数

格式化输出 格式化输出所用的函数为 printf&#xff0c;它可以输出任意位数的小数。 使用格式&#xff1a;printf(“%.nf”,a)。这句话的作用是将变量a保留n位小数输出。 注意事项&#xff1a; 1、这里的n&#xff0c;需要具体化为一个数字&#xff0c;保留几位小数&#x…

MathType软件7.7最新永久激活码许可证秘钥2024最新

【种草神器&#xff01;】大家好啊&#xff0c;我刚刚发现了一个超级好用的工具&#xff0c;迫不及待地想跟大家分享——MathType软件的最新功能介绍。作为一个经常需要处理各种复杂数学公式和文档的科研狗&#x1f436;&#xff0c;找到一款好的数学编辑工具对我来说真的太重要…

如何防止三重勒索勒索软件?

您的数据被加密后&#xff0c;定期备份数据是一个很好的策略&#xff0c;可以避免支付赎金&#xff0c;但这并不意味着攻击者仍然无法占得上风。一些攻击者现在正转向三重勒索勒索软件攻击&#xff0c;扬言不仅要劫持您的数据&#xff0c;还要将这些信息泄露给公众。 这类勒索…

离子交换技术在单晶硅生产废水除氟项目中的应用研究

单晶硅是电子工业的重要基础材料&#xff0c;广泛应用于太阳能光伏、半导体等领域。然而&#xff0c;单晶硅的生产过程中使用了氢氟酸、氟化铵等大量含氟化学品&#xff0c;导致产生的废水中含有高浓度的氟化物。这些含氟废水若未经有效处理&#xff0c;直接排放到环境中&#…

爬虫学习。。。。

爬虫的概念&#xff1a; 爬虫是一种自动化信息采集程序或脚本&#xff0c;用于从互联网上抓取信息。 它通过模拟浏览器请求站点的行为&#xff0c;获取资源后分析并提取有用数据&#xff0c;这些数据可以是HTML代码、JSON数据或二进制数据&#xff08;如图片、视频&#xff09…