凸包的含义:
在二维平面上给定点集,凸包就是将最外层的点连接起来构成的凸多边形。并且这个凸多边形能包含点集中所有的点。
OPENCV中:
convexHull函数用于寻找图像点集中的凸包。它有六个输入参数。
第一个参数:输入的二维点集
第二个参数:输出的凸包。为数组类型的hull
第三个参数:bool类型的clockwise。当此标志符为真时,输出的凸包为顺时针方向,否则,为逆时针方向。
第四个参数:bool类型的returnPoints,操作标识符,默认值为true。
1 #include<opencv2/opencv.hpp> 2 #include<iostream> 3 4 using namespace std; 5 using namespace cv; 6 7 int main() 8 { 9 Mat image(600, 600, CV_8UC3); //创建一个600*600 8位无符号字符型的3通道图像 10 RNG& rng = theRNG(); ////用其引用来接收theRNG函数返回的随机数生成器 11 12 while (1) 13 { 14 char key; // 键值 15 int count = rng.uniform(3,103);//随机生成点的数量 16 vector<Point>points; //二维点集存在这个向量里面 17 18 for (int i = 0; i < count; i++) //点的坐标 19 { 20 Point point; 21 point.x = rng.uniform(image.cols /4, image.cols * 3 / 4); 22 point.y = rng.uniform(image.rows / 4, image.cols * 3 / 4); 23 points.push_back(point); //生成的点放进points这个向量里面 24 } 25 //检测凸包 26 vector<int> hull; //第二个参数声明 27 convexHull(Mat(points), hull, true); 28 29 image = Scalar::all(0);//初始化图像为全黑色 30 //随机化点的颜色 并画出 31 for (int i = 0; i < count; i++) 32 { 33 circle(image, points[i], 3, Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)), FILLED, LINE_AA); 34 } 35 //准备参数 36 int hullcount = (int)hull.size();//凸包的边数 37 Point point0 = points[hull[hullcount - 1]]; //连接凸包边的坐标点 38 //绘制凸包的边 39 for (int i = 0; i < hullcount; i++) 40 { 41 Point point = points[hull[i]]; 42 line(image, point0, point, Scalar(255, 255, 255), 2, LINE_AA); 43 point0 = point; 44 } 45 //显示效果图 46 imshow("凸包检测示例", image); 47 //按下ESC退出程序 48 key = (char)waitKey(); 49 if (key == 27) 50 break; 51 } 52 53 return 0; 54 }
检测效果: