当前位置: 首页 > news >正文

OpenCV结构分析与形状描述符(8)点集凸包计算函数convexHull()的使用

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

算法描述

查找一个点集的凸包。
函数 cv::convexHull 使用斯克拉斯基算法(Sklansky’s algorithm)来查找一个二维点集的凸包,在当前实现中该算法的时间复杂度为 O(N logN)。

函数 cv::convexHull 是 OpenCV 库中的一个功能,用于计算一组二维点的凸包。凸包可以理解为是最小的凸多边形,它能够包含给定的所有点。这个函数利用了Sklansky算法或其他高效算法来完成计算,其时间复杂度在当前实现中为 O(N logN),其中 N 是输入点的数量。

函数原型


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

参数

  • 参数points Input 2D point set, stored in std::vector or Mat.
  • 参数hull 输出的凸包。它可以是一个整数向量的索引或者是点的向量。在第一种情况下,凸包元素是以0为基础的索引,在原始数组中的凸包点(因为凸包点集是原始点集中的一子集)。在第二种情况下,凸包元素本身就是凸包的点。
  • 参数clockwise 方向标志。如果为真,则输出的凸包是按照顺时针方向排列的。否则,它是按照逆时针方向排列的。假设的坐标系统X轴指向右侧,Y轴向上。
  • 参数returnPoints 操作标志。在矩阵的情况下,当此标志为真时,函数返回凸包的点。否则,它返回凸包点的索引。当输出数组是 std::vector 时,此标志被忽略,输出取决于向量的类型:std::vector 表示 returnPoints=false,std::vector 表示 returnPoints=true。

代码示例

include <iostream>
#include <opencv2/opencv.hpp>
#include <vector>using namespace std;
using namespace cv;int main() {// 创建一个随机点集vector<Point2f> points;for (int i = 0; i < 10; ++i) {points.push_back(Point2f(rand() % 500, rand() % 500));}// 计算凸包vector<vector<Point2f>> hulls;vector<int> hullIndices;convexHull(points, hullIndices, false);// 将索引转换为实际的点for (auto& index : hullIndices) {hulls.push_back(vector<Point2f>{points[index]});}// 创建一个空白图像来显示点和凸包Mat img = Mat::zeros(512, 512, CV_8UC3);// 绘制原始点for (const auto& pt : points) {circle(img, pt, 3, Scalar(0, 0, 255), -1); // 红色圆圈表示原始点}imshow("circle image", img);// 绘制凸包int numPoints = hulls.size();for (int i = 0; i < numPoints; ++i) {line(img, hulls[i][0], hulls[(i + 1) % numPoints][0], Scalar(0, 255, 0), 2); // 绿色线条表示凸包}// 显示结果imshow("Convex Hull", img);waitKey(0);return 0;
}

运行结果

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 相机光学(三十六)——光圈
  • Unity数据持久化 之 使用Excel.DLL读写Excel表格
  • 暴力数据结构之优先级队列的解析及其模拟实现(C++)
  • python读取excel
  • Flask如何处理POST请求
  • 两个月冲刺软考——逻辑地址与物理地址的转换(例题+讲解);文件类型的考点
  • 【C++】手动实现nique_ptr智能指针
  • 解决AbortController中断请求无法再次请求
  • 招聘网站项目
  • Docker in Docker 实践 on mac
  • 跨越技术壁垒:EasyCVR为何选择支持FMP4格式,重塑视频汇聚平台标准
  • Jenkins+docker+springboot 一键自动部署项目步骤
  • docker-mysql容器数据卷挂载
  • 大端模式和小端模式
  • 对话万兴科技副总裁朱伟:2024年将迎来AI视频年
  • 2017年终总结、随想
  • 30天自制操作系统-2
  • Angular 响应式表单之下拉框
  • co模块的前端实现
  • express如何解决request entity too large问题
  • javascript 哈希表
  • JavaScript-Array类型
  • Javascript设计模式学习之Observer(观察者)模式
  • Java面向对象及其三大特征
  • Protobuf3语言指南
  • select2 取值 遍历 设置默认值
  • Vim 折腾记
  • Vue.js 移动端适配之 vw 解决方案
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 大主子表关联的性能优化方法
  • 后端_ThinkPHP5
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • ‌U盘闪一下就没了?‌如何有效恢复数据
  • #Java第九次作业--输入输出流和文件操作
  • #Linux(make工具和makefile文件以及makefile语法)
  • #QT(TCP网络编程-服务端)
  • ( 10 )MySQL中的外键
  • (C++17) std算法之执行策略 execution
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (论文阅读40-45)图像描述1
  • (顺序)容器的好伴侣 --- 容器适配器
  • (四)js前端开发中设计模式之工厂方法模式
  • (转)memcache、redis缓存
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • ******IT公司面试题汇总+优秀技术博客汇总
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .DFS.
  • .Net 6.0 处理跨域的方式
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .NET程序员迈向卓越的必由之路