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

时间:2024-03-27 07:54:33

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

什么时候需要它?

如果你想要把一群散落的点,包裹起来。而且希望这个包裹尽可能地紧凑,那么你就需要一个凸包(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将直接存储构成凸包的点的坐标。通常情况下,返回点的索引更加灵活,因为允许我们根据需要从原始点集中检索额外信息。