在OpenCV中找到部分隐藏的球

问题描述 投票:0回答:1

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

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

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

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

HoughCircles code

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);
c++ opencv video-processing hough-transform
1个回答
2
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.