我目前正在寻找一种将简单形状(例如 T 或 L 形状)拟合到 2D 点云的方法。结果,我需要的是形状的位置和方向。
我一直在研究几种方法,但大多数似乎都非常复杂,并且首先涉及构建和学习示例数据库。当我处理非常简单的形状时,我希望可能有一种更简单的方法。
我目前正在寻找一种将简单形状(例如 T 或 L 形状)拟合到 2D 点云的方法。结果,我需要的是形状的位置和方向。
我一直在研究几种方法,但大多数似乎都非常复杂,并且首先涉及构建和学习示例数据库。当我处理非常简单的形状时,我希望可能有一种更简单的方法。
说你不想做任何训练,我猜你的意思是你不想做任何特征匹配;特征匹配用于对图像中对象的姿势(位置和方向)做出良好的猜测,并且将与 RANSAC 一起适用于您的问题,以猜测和验证关于对象姿势的良好假设。
最简单的方法是模板匹配,但这可能在计算上过于复杂(这取决于您的用例)。在模板匹配中,您只需遍历对象的可能位置及其可能的方向和可能的比例,并检查模板(在该位置和方向和比例看起来像 L 或 T 的云)匹配(或者您采样可能的位置方向和比例随机)。如果您的点被组织(或者您通过例如将它们转换为像素来组织它们),则可以相当快地检查模板。
如果这太慢了,有很多方法可以使模板匹配更快,我会向您推荐广义霍夫变换。在这里,在开始搜索模板之前,您在您正在寻找的形状的边界(T 或 L)上循环,对于其边界上的每个点,您查看渐变方向,然后查看渐变方向和该点之间的角度对象模板的原点,以及到原点的距离。您将其添加到每个边界点的表格(让我们称之为Table A
),最终得到一个表格,该表格从梯度方向映射到对象原点的一组可能位置。现在你设置了一个 2D 投票空间,它实际上只是一个 2D 数组(让我们称之为Table B
) 其中每个像素都包含一个数字,表示该位置对象的投票数。然后对于目标图像(点云)中的每个点,您检查梯度并找到与Table A
该梯度相对应的一组可能的对象位置,然后为Table B
(霍夫空间)中的所有相应对象位置添加一票。
这是一个非常简洁的解释,但是知道要查找模板匹配和广义霍夫变换,您将能够在网络上找到更好的解释。例如,查看模板匹配和霍夫变换的 Wikipedia 页面。
在二维点云数据中检测形状(L、T、...)的两种常用方法是使用 OpenCV 或点云库。我将解释在 OpenCV 中检测这些形状可能采取的步骤。为此,您可以使用以下 3 种方法,正确方法的选择取决于形状(大小、形状的面积……):
第一步是将您的点转换为灰度Mat
对象,通过这样做,您基本上可以制作 2D 点云数据的图像,因此您可以使用其他 OpenCV 函数。然后你可以平滑图像以减少噪声,结果会以某种方式包含真实边缘的模糊图像,如果你的应用程序不需要实时处理,你可以使用bilateralFilter
. 您可以在此处找到有关平滑的更多信息。下一步将是选择方法。如果形状只是某种正交线(例如 L 或 T),您可以使用霍夫线变换来检测线条,检测后,您可以遍历线条并计算dot product
线的数量(因为它们是正交的,所以结果应该是 0)。您可以在此处找到有关霍夫线变换的更多信息。另一种方法是使用模板匹配检测您的形状。基本上,您应该制作一个形状(L 或 T)的模板并在matchTemplate
函数中使用它。您应该考虑要使用的模板的大小应该按照图像的顺序排列,否则您可能会调整图像的大小。更多关于算法的信息可以在这里找到。如果形状包括您可以使用 找到形状轮廓的区域findContours
,它将为您提供要检测的形状周围的多边形数量。例如,如果您的形状是L
,它将具有大约 6 条线的多边形。此外,您还可以使用其他一些过滤器,findContours
例如计算形状的面积。