概述
凸包(Convex Hull)是一个计算几何(图形学)中的概念,在一个实数向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包。
X的凸包可以用X内所有点(x1, x2….xn)的线性组合来构造。在二维欧几里得空间中,凸包可以想象为一条刚好包着所有点的橡皮圈,用不严谨的话来讲,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边形,它能包含点集中所有的点接!
API函数:
void cv::convexHull ( InputArray points,
OutputArray hull,
bool clockwise = false,
bool returnPoints = true
)
参数解释
- points:输入的二维点集,Mat类型数据即可
- hull:输出参数,用于输出函数调用后找到的凸包
- clockwise:操作方向,当标识符为真时,输出凸包为顺时针方向,否则为逆时针方向。
- returnPoints:操作标识符,默认值为true,此时返回各凸包的各个点,否则返回凸包各点的指数,当输出数组时std::vector时,此标识被忽略。
//寻找物体的凸包convexHull
//定义和输出vector容器点坐标
#include <opencv2/opencv.hpp>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <vector>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
Mat testImage(600, 600, CV_8UC3);//画布大小600x600
RNG& rng = theRNG();
//按回车键一直更新
while (1)
{
//int count = (unsigned)rng % 100 + 8;//随机生成点的数量
int count = rng.uniform(5, 20);//随机产生点的个数
cout << "凸包包含 " << count << " 个点" << endl;
cout << "各点坐标如下:" << endl;//输出产生随机点个数
vector<Point>points;//vector容器存放点坐标
for (int i = 0; i < count; i++)
{
Point point;
//点坐标随机产生
point.x = rng.uniform(testImage.cols /