在 OpenCV 中找到部分隐藏的球
Finding partly hidden ball in OpenCV
我正在使用 OpenCV 尝试跟踪 Bonzini 上的球 table。
将颜色转换为 HSV 并提供上下标量 (25,90,90)
和 (30,255,255)
我可以在完全或几乎完全可见时找到球。
问题是它只部分可见。我试图使用 HoughCircles 找到球,但我没有任何运气。虽然它有时会找到球,但大多数时候它只会看到到处都是随机的圆圈 - 也许这不是正确的方法?
当球只部分可见时如何定位球的中心(假定球的半径始终相同)?
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);
遮挡通常很难处理,但固定相机位置可以让您有一些余地。您可以根据之前的帧轻松计算球的轨迹,以了解它可能出现的位置。如果您使用霍夫圆,您可以将 param2
设置得相当高,这样您就 不会 得到误报。然后每当霍夫圆没有检测到圆时,即 circles
为空,您可以使用先前的帧位置来猜测球在遮挡期间的位置。
如果您按颜色过滤图像,您将获得可以通过多种方式处理的二值图像。由于您可以计算球的大小,因此您可以轻松地在正常帧中使用霍夫圆,但这在遮挡期间对您没有帮助;模板匹配也不太可能。相反,您需要使用其他方法将二进制图像中的这些指示点组合在一起。
按照同样的思路,您可以 不 使用 Hough 圆并通过在二值图像中寻找 kmeans
或类似的聚类来获取中心,您可以从中得到集群的中心。该中心可以某种方式与预测轨迹进行比较。例如,如果您从过滤黄色的二值图像中获得的指示像素数太低,那么您可以简单地依赖预测轨迹。更稳健(我认为)你可以用集群的中心对预测轨迹进行加权平均,其中权重由二值图像中的指示像素数给出。这样,如果您没有遮挡,您将获得基于指示器像素中心的大部分或全部位置;如果你有 一些 遮挡,你将通过你假定的轨迹添加一些校正;如果你有 很多 的遮挡,你可以在很大程度上依赖预测轨迹。
以上内容同样适用于 contours
;再次因为你知道球的大小,你可以看到你的轮廓有多大contourArea
,并根据轮廓面积和整个圆面积的比率用你预测的轨迹加权你的轮廓的中心。 @Green_Wizard 的建议对于确保您在正确的区域找到等高线也很有帮助。这是与我的建议相反的方法,您先查看预测轨迹 ,然后尝试检测该有限区域中的某些东西或按与该区域的距离对指示进行排序。我在模板匹配项目中做了类似的事情,但主要是为了减少计算——我根据模板的最后已知位置定义了一个 ROI,该位置的大小会增加,直到再次找到模板。 See for e.g.。我确实 没有 包括预测的轨迹,尽管至少对于马里奥来说,他实际上并没有向前移动;水平向后移动。
我正在使用 OpenCV 尝试跟踪 Bonzini 上的球 table。
将颜色转换为 HSV 并提供上下标量 (25,90,90)
和 (30,255,255)
我可以在完全或几乎完全可见时找到球。
问题是它只部分可见。我试图使用 HoughCircles 找到球,但我没有任何运气。虽然它有时会找到球,但大多数时候它只会看到到处都是随机的圆圈 - 也许这不是正确的方法?
当球只部分可见时如何定位球的中心(假定球的半径始终相同)?
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);
遮挡通常很难处理,但固定相机位置可以让您有一些余地。您可以根据之前的帧轻松计算球的轨迹,以了解它可能出现的位置。如果您使用霍夫圆,您可以将 param2
设置得相当高,这样您就 不会 得到误报。然后每当霍夫圆没有检测到圆时,即 circles
为空,您可以使用先前的帧位置来猜测球在遮挡期间的位置。
如果您按颜色过滤图像,您将获得可以通过多种方式处理的二值图像。由于您可以计算球的大小,因此您可以轻松地在正常帧中使用霍夫圆,但这在遮挡期间对您没有帮助;模板匹配也不太可能。相反,您需要使用其他方法将二进制图像中的这些指示点组合在一起。
按照同样的思路,您可以 不 使用 Hough 圆并通过在二值图像中寻找 kmeans
或类似的聚类来获取中心,您可以从中得到集群的中心。该中心可以某种方式与预测轨迹进行比较。例如,如果您从过滤黄色的二值图像中获得的指示像素数太低,那么您可以简单地依赖预测轨迹。更稳健(我认为)你可以用集群的中心对预测轨迹进行加权平均,其中权重由二值图像中的指示像素数给出。这样,如果您没有遮挡,您将获得基于指示器像素中心的大部分或全部位置;如果你有 一些 遮挡,你将通过你假定的轨迹添加一些校正;如果你有 很多 的遮挡,你可以在很大程度上依赖预测轨迹。
以上内容同样适用于 contours
;再次因为你知道球的大小,你可以看到你的轮廓有多大contourArea
,并根据轮廓面积和整个圆面积的比率用你预测的轨迹加权你的轮廓的中心。 @Green_Wizard 的建议对于确保您在正确的区域找到等高线也很有帮助。这是与我的建议相反的方法,您先查看预测轨迹 ,然后尝试检测该有限区域中的某些东西或按与该区域的距离对指示进行排序。我在模板匹配项目中做了类似的事情,但主要是为了减少计算——我根据模板的最后已知位置定义了一个 ROI,该位置的大小会增加,直到再次找到模板。 See for e.g.。我确实 没有 包括预测的轨迹,尽管至少对于马里奥来说,他实际上并没有向前移动;水平向后移动。