最近工作中,用到了凸包,查了一些资料,差不多搞明白了,在这里做一个总结,希望可以帮助到你!
什么时候需要它?
如果你想要把一群散落的点,包裹起来。而且希望这个包裹尽可能地紧凑,那么你就需要一个凸包(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将直接存储构成凸包的点的坐标。通常情况下,返回点的索引更加灵活,因为允许我们根据需要从原始点集中检索额外信息。