我正在尝试检测2D散点数据中的角点(x/y坐标)。
这些数据来自激光测距仪,我们当前的平台使用Matlab(虽然独立程序/库是一种选择,但Nav/Control代码在Matlab上,因此必须有一个接口)。
角点检测是SLAM算法的一部分,这些角点将用作地标。
如果可能的话,我还希望实现接近100Hz的速度(我知道这是Matlab,但我的数据集非常小)。
样例数据:
[蓝色是原始数据,红色是我需要检测的内容。(此视图实际上是自上而下的。)]
到目前为止,我尝试了许多不同的方法,有些更成功,有些则不然。 我从未正式学习过任何类型的机器视觉。
我的第一个方法是自制的最小二乘线拟合器,它会将线条递归地分成两半,直到达到某个r^2值,然后尝试合并斜率/截距相似的线条。然后它会计算这些线条的交点。它效果不是很好,但准确率还行,大约有70%的时间能够工作,尽管它在完全忽略某些特征方面存在一些严重问题。
我当前的方法使用clusterdata
函数根据马氏距离对我的数据进行分段,然后基本上做同样的事情(最小二乘线拟合/合并)。它效果还可以,但我认为有更好的方法。
[源代码到当前方法] [cnrs, dat, ~, ~] = CornerDetect(data, 4, 1)
使用上述数据将产生我所得到的位置。
我不需要从头开始编写它,只是似乎大多数高级方法都是针对2D图像或3D点云而设计的,而不是2D散点数据。我已经阅读了很多关于霍夫变换和各种数据聚类方法(k-Means等)的文章。我还尝试了一些现成的线检测器,但没有取得太大的成功。我试图玩 线段检测器,但它需要一个灰度图像作为输入,我想把我的向量转换成完整的2D图像并将其馈送到LSD之类的东西中可能会非常慢。
非常感谢任何帮助!