寻找物体的凸包 opencv

凸包的含义:

  在二维平面上给定点集,凸包就是将最外层的点连接起来构成的凸多边形。并且这个凸多边形能包含点集中所有的点。
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 = (unsigned)rng % 100 + 3;//随机生成点的数量
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 }

检测效果:

猜你喜欢

转载自www.cnblogs.com/carlber/p/9720223.html