在OpenCV中找到部分隐藏的球

时间:2017-06-17 09:42:23

标签: c++ opencv video-processing hough-transform

我正在使用OpenCV试图跟踪Bonzini桌上的球。

将颜色转换为HSV并提供上下标量(25,90,90)(30,255,255)我可以在完全或几乎完全可见时找到球。

问题在于它只是部分可见。我试图用HoughCircles找到球,但我没有运气。虽然它有时会找到球,但大多数时候它只是看到随处可见的圈子 - 也许这不是正确的方法呢?

当球的中心部分可见时(如果球的半径始终相同),如何定位球的中心?

1]

HoughCircles代码

Mat gray;

vector<Vec3f> circles;

bilateralFilter(frame, gray, 15, 1000, 1000);
cvtColor(gray, gray, COLOR_BGR2GRAY);
GaussianBlur(gray, gray, Size(9,9), 2, 2);

HoughCircles(gray, circles, HOUGH_GRADIENT, 1, 200, 50, 10, 12, 24);

1 个答案:

答案 0 :(得分:2)

一般来说,遮挡是很难处理的,但是有一个固定的摄像头位置会让你有一点背风。您可以轻松地从之前的帧计算球的轨迹,以了解可能的出现位置。如果你使用霍夫圈,你可以将param2设置得相当高,这样你就不会 获得误报。然后每当霍夫圈​​没有检测到一个圆圈,即circles为空时,你可以使用先前的帧位置来猜测球在遮挡期间的位置。

如果您按颜色过滤图像,您将获得可以通过多种方式处理的二进制图像。由于你可以计算球的大小,你可以在正常的框架中轻松使用霍夫圆圈,但这在遮挡期间不会帮助你;和模板匹配也不可能。相反,您需要使用其他方法将二进制图像中的指标点组合在一起。

沿着相同的路线,您可以使用Hough圈,只需通过在二进制图像中查找带有kmeans或类似物的聚类来获取中心,您就可以获得中心从那个集群。可以以某种方式将中心与预测的轨迹进行比较。例如,如果从过滤黄色的二进制图像中获得的指标像素数量太少,那么您可以简单地依赖预测的轨迹。更强大(我认为)你可以用簇的中心对预测轨迹进行加权平均,其中权重由二进制图像中的指示像素数给出。这样,如果您没有遮挡,您可以根据指标像素的中心获得大部分或全部位置;如果你有一些遮挡,你可以通过你想象的轨迹添加一些修正;如果你有一个很多的遮挡,你可以严重依赖预测的轨迹。

上述内容同样适用于contours;再次,因为你知道球的大小,你可以看到你的轮廓与contourArea有多大,并根据轮廓区域和整圆区域的比例,用你预测的轨迹加权轮廓的中心。 @ Green_Wizard的建议也非常适合确保您在正确的区域找到轮廓。根据我的建议,这是一种相反的方法,您可以在其中查看预测的轨迹 first ,并尝试在该有限区域内检测某些内容,或者按距离对指示进行排序。我在模板匹配项目中做了类似的事情,但它主要用于计算减少---我根据模板的最后已知位置定义了ROI,该模型的大小逐渐增大,直到再次找到模板。 See for e.g.。我确实包括预测的轨迹,但至少对于马里奥来说,他实际上并没有前进;水平向后移动。