首页 文章

在OpenCV中找到部分隐藏的球

提问于
浏览
0

我正在使用OpenCV试图跟踪Fusball桌上的球 .

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

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

How do I locate the center of the ball when it is only partly visible (given that the radius of the ball is always the same)?

enter image description here

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 回答

  • 2

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

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

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

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

相关问题