在2D向量数据中的角点检测

6

我正在尝试检测2D散点数据中的角点(x/y坐标)。

这些数据来自激光测距仪,我们当前的平台使用Matlab(虽然独立程序/库是一种选择,但Nav/Control代码在Matlab上,因此必须有一个接口)。

角点检测是SLAM算法的一部分,这些角点将用作地标。

如果可能的话,我还希望实现接近100Hz的速度(我知道这是Matlab,但我的数据集非常小)。

样例数据:

Corner Detection

[蓝色是原始数据,红色是我需要检测的内容。(此视图实际上是自上而下的。)]

[来自上述截图的实际向量数据]

到目前为止,我尝试了许多不同的方法,有些更成功,有些则不然。 我从未正式学习过任何类型的机器视觉。

我的第一个方法是自制的最小二乘线拟合器,它会将线条递归地分成两半,直到达到某个r^2值,然后尝试合并斜率/截距相似的线条。然后它会计算这些线条的交点。它效果不是很好,但准确率还行,大约有70%的时间能够工作,尽管它在完全忽略某些特征方面存在一些严重问题。

我当前的方法使用clusterdata函数根据马氏距离对我的数据进行分段,然后基本上做同样的事情(最小二乘线拟合/合并)。它效果还可以,但我认为有更好的方法。

[源代码到当前方法] [cnrs, dat, ~, ~] = CornerDetect(data, 4, 1) 使用上述数据将产生我所得到的位置。

我不需要从头开始编写它,只是似乎大多数高级方法都是针对2D图像或3D点云而设计的,而不是2D散点数据。我已经阅读了很多关于霍夫变换和各种数据聚类方法(k-Means等)的文章。我还尝试了一些现成的线检测器,但没有取得太大的成功。我试图玩 线段检测器,但它需要一个灰度图像作为输入,我想把我的向量转换成完整的2D图像并将其馈送到LSD之类的东西中可能会非常慢。

非常感谢任何帮助!

2个回答

2

我会将其视为寻找在多个尺度上稳定的曲率极值问题——而您尝试使用线条进行的分裂和合并方法提示了这一点。


你有什么算法推荐或方法建议吗?(分裂和合并不是教科书上的复制,而只是我在读了所有这些只给出糟糕伪代码的白皮书后写下的东西。) - athypes
最近的工作大多集中在表面上。2D领域中一个古老但好用的方法是Andre Lejeune的“曲率一致性”。一个更近期的方法是Leontiev的CSS:http://www.cs.bgu.ac.il/~icbv061/StudentProjects/ICBV061/ICBV-2006-1-Leonid-Leontiev-Anna-Bakshi/Literature/00735812.pdf - Francesco Callari

1
你可以使用Harris角点检测器来检测角点。

您可以将数据(x和y的范围)重新缩放到一定范围内,使点变得连续,可能进行一些膨胀操作,创建一个图像(从这些数据中),并执行Harris算法。 Harris也适用于二进制图像,它只是计算包含窗口内正交方向梯度幅度的矩阵的特征值。在大多数情况下,可以使用动态规划(称为积分图像)使其更快,并且复杂性取决于数据的范围(xmax,ymax)。 - Bharat
胡言乱语,正如原帖所指出的那样,他的数据并不是图像。 - Francesco Callari
如果强度不存在并不意味着它不能被表示为图像,数据是一组点,您可以将这些点表示为1,其余部分表示为0,并创建二进制图像。 - Bharat
Harris 还会为您提供角点检测(由于缩放而略有不精确)的线条,但也适用于图像中存在的 squiggles。为此,您需要对图像块执行 HOG 并查看数据是否仅存在于 2 个 bin 中,块大小应足够大,并且将取决于应用程序。可以使用 vlFeat 进行 HOG。代码:data(:,1)=data(:,1)+1127;data=data/4;data=ceil(data+1);img=zeros(557,902);for i=1:620 img(data(i,1),data(i,2))=1;end imgs=imresize(img,0.05);C=corner(imgs);imshow(imgs);hold on;plot(C(:,1),C(:,2),'r*'); - Bharat
如果这些波浪线可以被稳定地(在合理范围内)从不同的角度检测到,那么它们就可以成为可靠的地标。激光扫描仪在较远距离上存在较大的噪声,很难区分3米以上距离处的噪声和物体曲率。 - athypes
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接