这个问题几乎可以通过dbscan聚类算法完美解决。 下面,我提供实现和结果图像。 根据dbscan,灰色blob表示exception值或噪声。 我只是用盒子作为输入数据。 最初,箱中心用于距离function。 但是对于盒子来说,正确表征距离是不够的。 因此,当前距离函数使用两个框的所有8个角的最小距离。
#include "opencv2/opencv.hpp" using namespace cv; #include
我同意Sebastian Schmitz:你可能不应该寻找聚类。
不要指望像k-means这样的不知情的方法为你工作。 尤其是像k-means一样粗略的启发式,并且它存在于理想化的数学世界中,而不是杂乱的实际数据。
你对自己想要的东西有很好的理解。 尝试将这种直觉放入代码中。 在您的情况下,您似乎在寻找连接组件。
考虑将图像下采样到较低分辨率,然后重新运行相同的过程! 或者立即在较低分辨率上运行它(以减少压缩失真,并提高性能)。 或者添加filter ,例如模糊。
通过查看下采样/滤波图像中的连通分量,我期望获得最佳和最快的结果。
我不确定你是否真的在寻找聚类(在数据挖掘意义上)。
聚类用于根据距离函数对相似对象进行分组。 在您的情况下,距离函数将仅使用空间质量。 此外,在k-means聚类中,你必须指定一个你可能事先不知道的ak。
在我看来,你只想合并所有边界比某个预定阈值更接近的矩形。 因此,作为第一个想法尝试合并所有触摸或比一半球员身高更接近的矩形。
您可能希望包含大小检查,以最大限度地降低将两个玩家合并为一个的风险。
编辑:如果您真的想使用聚类算法,请使用一个估算聚类数量的聚类算法。