【发布时间】:2017-09-09 17:00:09
【问题描述】:
我想确定图像中大多数线的交叉点。显然,这样的点可能不止一个,但为了简单起见,我只尝试了一个点。我正在尝试使用 Kmeans 聚类中内置的 OpenCV,但该算法假定 每个点 都必须进行聚类,所以我得到了这样的结果:
显然,当存在更多线时,情况会变得更糟,因为每个交叉点都会偏移集群的中心 我想要完成的是删除所有由于意外线交叉而产生的轮廓线,这在复杂场景中尤其成问题。
我在考虑DBSCAN,但似乎我需要自己从头开始实现它,因为它在 OpenCV 中不存在 - 我不想花额外的时间在我项目的核心部分之外专注于主题而不是制作工具。有没有可以做我需要的图书馆?或者我正在考虑形式上的野蛮力量
for each point in list
find nearest neighbor
if distance > threshold
label as bad
if point already has label AND neighbor already has label
two sets collided, merge them
else if neighbor already has label
assign point.label = neighbor.label
else
point.label = new Label
neighbor.label = point.label
find mass center of each labeled set and replace set with it's center.
【问题讨论】:
-
它是“异常值”,没有。通常它与行无关。寻找这样的几何图形的常用方法是 hough 变换。还有一种基于此的聚类算法,称为 CASH。可能值得一试。
-
绿线是霍夫变换的产物。问题是找到大部分线交叉的地方以恢复视角。使用单点透视很容易 - 采用最大的集群,但对于 2 点或 3 点透视来说,这并不是一种真正的稳健方法。我必须为大多数“理智的”消失点投票。我现在已经实现了 DBSCAN,但它并不完美。
-
还可以测试 OPTICS 和 HDBSCAN* 等 DBSCAN 变体,以及 CASH 如何解决您的问题。
-
我找不到 HDBSCAN c++ 版本。到目前为止,我已经实现了正常的 DBSCAN,它似乎在大多数情况下都能解决我的问题。当我有零钱时,我会调查 CASH,谢谢
标签: c++ opencv cluster-analysis outliner