hull可以是点向量,代表原来points的那些下标是多边形的边界点,并且是按逆时针或者顺时针来进行排列的,也就是说,他们并不是一定按照原来点的下标大小顺序来排序。
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
#define window "【原始图】"
#define windowx "【结果图】"
//在图像上随机生成点,然后根据这些点计算包围这些点的凸多边形。
int main()
{
RNG& rng = theRNG();
//1.原图像。
//2.进行循环试验。
while (1)
{
Mat src(800,800,CV_8UC3);
int ch = waitKey(0);
if (ch== 27)
{
break;
}
//3.随机取三个以上的点。
int count = (unsigned)rng % 100 + 3;
vector<Point> points;
for (int i = 0; i < count; ++i)
{
Point p;
p.x=rng.uniform(100, 700);
p.y=rng.uniform(100, 700);
points.push_back(p);
}
//4.根据这些点计算凸包。
vector<int> hull;
convexHull(Mat(points),hull,true);
//5.画出凸包,并显示。
for (auto c : points)
{
circle(src,c,3,Scalar(rng.uniform(0,255), rng.uniform(0, 255),rng.uniform(0, 255)),-1);
}
int edge_count = (int)hull.size();//边的数量。
Point next = points[hull[edge_count-1]];//.............................................先链接第一个点和最后一个点,以形成闭环。
for (auto x : hull)
{
line(src,next,points[x],Scalar(255,0,255),2);
next = points[x];
}
//5.1显示。
imshow("result",src);
}
waitKey(0);
return 0;
}
很容易猜到,如果点阵图用边界图代替,那么就可以得到边界图的外围