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