更新:调整算法,识别出一副图像中最近的球。球越近,图像显示的半径越大,所以只要找出图像中半径最大的球就是最近的球。底盘程序优先处理最近的球。
效果:可以准确的找出一副图像中最近的球。
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;//在控制台输出圆心坐标和半径 }