• 【OpenCV】-物体的凸包


    1、 凸包

    什么是凸包?

    解释:给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸边形,它是包含点集中所有的点。

    如下:用人手图来举例说明凸缺陷概念。手周围深色的线描画出凸包,A到H被标出的区域是凸包的各个“缺陷”,这些凸度缺陷提供了手以及手状态的特征表现的方法。

    在这里插入图片描述

    2、寻找凸包:convexHull()函数

    说明:convexHull()函数用于寻找图像点集中的凸包。

    void convexHull(InputArray points,OutputArray hull,bool clockwise=false,bool returnPoints=true)
    
    • 1
    • 第一个参数:输入的二维点集,可以填Mat类型或者std::vector
    • 第二个参数:输出参数,函数调用后找到的凸包。
    • 第三个参数:操作方向的标识符。当此标识符为True时,输出的凸包为顺时针方向。否则为逆时针方向。
    • 第四个参数:操作标识符,默认值True。当标识符为真时,函数返回各个凸包的各个点。否则,它返回凸包各点的指数。

    3、函数解析之theRNG()

    函数说明:返回默认的随机数生成器。如果需要使用生成器获得一个随机数或者初始化一个数组,可以使用 randu 或者 randn
    代替。但想要在一个循环中产生很多随机数,那么使用此函数检索生成器,会很快。

    RNG &rng = theRNG();  //用其引用来接收theRNG函数返回的随机数生成器(RNG就是随机数生成器的类)
    
    • 1

    4 、circle()函数【回忆】

    void circle(CV_IN_OUT Mat& image, Point center, int radius, const Scalar& color, int thickness=1, int lineType=8); 
    
    • 1
    • image:为图像,单通道多通道都行,不需要特殊要求
    • center:为画圆的圆心坐标
    • radius:为圆的半径
    • color:为设定圆的颜色,比如用CV_RGB(255, 0,0)设置为红色, CV_RGB(255,255,255)设置为白色,CV_RGB(0, 0,0)设置为黑色
    • thickness:为设置圆线条的粗细,值越大则线条越粗,为负数则是填充效果,-1表示绘制实心圆
    • lineType:表示线形。OpenCV中有三种可以选择LINE_4、LINE_8、LINE_AA。其中LINE_4表示采用4邻接的方式绘制,LINE_8表示采用8邻接的方式绘制,LINE_AA表示高斯滤波抗锯齿。

    5、基础示例程序:凸包检测基础

    说明:随机生成3~103个坐标值随机的彩色点,然后将这些点连接起来

    #include
    #include
    #include
    #include
    using namespace std;
    using namespace cv;
    int main()
    {
    	//初始化变量和随机值
    	Mat image(500, 500, CV_8UC3);
    	RNG & rng = theRNG();
    	while (1)
    	{
    		char key;
    		int count = (unsigned)rng % 100 + 3;//随机生成点的数量
    		cout << count << endl;
    		vector<Point> points;//点值
    		//随机生成点坐标
    		for (int i = 0; i < count; i++)
    		{
    			Point point;
    			point.x = rng.uniform(image.cols / 4, image.cols * 3 / 4);//uniform() 方法将随机生成下一个实数,它在[x,y]范围内。
    			point.y = rng.uniform(image.rows / 4, image.rows * 3 / 4);
    			if(i<10)
    				cout << "(" << point.x << "," << point.y << ")" << endl;
    			points.push_back(point);//C++ vector::push_back 会先创建临时对象,然后将临时对象拷贝到容器中
    		}
    		//检测凸包
    		vector<int> hull;
    		convexHull(Mat(points), hull, true);	
    		//绘制出随机颜色的点
    		image = Scalar::all(0);
    		for (int i = 0; i < count; i++)
    		{
    			circle(image, points[i], 3, Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)), FILLED,LINE_AA);
    		}
    		//准备参数
    		int hullcount = (int)hull.size();//凸包边数
    		Point point0 = points[hull[hullcount - 1]];//连接凸包边的坐标点
    		//	cout << hull[0] <<":"<< hull.size()<
    		//绘制凸包的边
    		for (int i = 0; i < hullcount; i++)
    		{
    			Point point = points[hull[i]];
    			line(image, point0, point, Scalar(255, 255, 255), 2, LINE_AA);
    			point0 = point;
    		}
    		imshow("凸包检测", image);
    		key = (char)waitKey();
    		if (key == 27 || key == 'q' || key == 'Q')
    			break;
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    在这里插入图片描述

  • 相关阅读:
    centos7.9 扩容swap分区
    Mapstruct应用
    SpringBoot+Mybaits搭建通用管理系统实例四:业务逻辑Service层功能实现
    5.10如何调度考生的座位
    杭电多校-Slipper-(树图转化+虚点建图)
    SSL证书的分类有哪些?如何选择合适的SSL证书?
    开源协议说明
    Windows10下Tomcat8.5安装教程
    STM32f103入门(12)USART串口信息发送+接收
    【Bio】基础生物学 - 细胞膜 cell membrane
  • 原文地址:https://blog.csdn.net/qq_44859533/article/details/126269730