基于颜色和圆对乒乓球识别_20170329

Posted on 2017-03-29 12:18  岳秋晨  阅读(291)  评论(0编辑  收藏  举报

更新:调整算法,识别出一副图像中最近的球。球越近,图像显示的半径越大,所以只要找出图像中半径最大的球就是最近的球。底盘程序优先处理最近的球。

效果:可以准确的找出一副图像中最近的球。

TIP:  flag1:检测到图像中有球的标志位,1有0无。

         flag2:检测到图像中球的个数。

代码如下:

		HoughCircles(canny_output, circles, CV_HOUGH_GRADIENT, 1, 40, 250, 27, 4, 70);//霍夫变换检测圆

		cout << "x=\ty=\tr=" << endl;
		for (size_t i = 0; i < circles.size() ; i++)//找出一幅图里有几个球
		{


			x[i] = cvRound(circles[i][0]);
			y[i] = cvRound(circles[i][1]);
			z[i]= cvRound(circles[i][2]);
			flag1 = 1;    
			flag2 = i;		
		}
		if (flag1 == 1)//检测到图像中有球
		{
			flag1 = 0;//标志位置零
			if (flag2 == 0)//如果只检测到一个球
				num = 0;
			else//检测到多个球
			{
				int max = z[0];
				num = 0;
				for (int i = 1; i < flag2 + 1; i++)//对图中找到的球进行半径大小比对,选出半径最大的球
				{
					if (max < z[i])
					{
						max = z[i];
						num = i;//num只是用来记录第几个球最近,不用置零
					}
				}
			}
			a = x[num];// 把半径最大的球的信息进行赋值
			b = y[num];
			c = z[num];
			Point center(a, b);
			int radius = c;
			circle(imgOriginal, center, radius, Scalar(255, 255, 255), 5, 8, 0);
		}
		else//没有检测到球
		{
			a = 0;// 累加每幅图中最近球的坐标
			b = 0;
			c = 0;
		}
			cout << a << "\t" << b << "\t" << c << endl;//在控制台输出圆心坐标和半径
		}