在2D点云中查找简单形状

时间:2012-10-18 07:33:42

标签: image-processing cloud shape point

我目前正在寻找一种将简单形状(例如T形或L形)拟合到2D点云的方法。我需要的是形状的位置和方向。

我一直在研究几种方法,但大多数方法看起来非常复杂,并且首先需要构建和学习示例数据库。当我处理非常简单的形状时,我希望可能有一个更简单的方法。

3 个答案:

答案 0 :(得分:0)

通过说你不想做任何训练,我猜你的意思是你不想做任何功能匹配;特征匹配用于对图像中对象的姿势(位置和方向)进行良好的猜测,并且可以与RANSAC一起用于猜测和验证关于对象姿势的良好假设的问题。

最简单的方法是模板匹配,但这可能计算太复杂(取决于您的用例)。在模板匹配中,您只需循环遍历对象的可能位置及其可能的方向和可能的比例,并检查模板(在该位置看起来像L或T的云,方向和比例)的匹配程度(或者您是否采样)可能的位置方向和随机尺度)。如果您的点被组织起来(或者通过例如将它们转换为像素来组织它们),则可以相当快地检查模板。

如果速度太慢,有很多方法可以更快地进行模板匹配,我建议您使用广义霍夫变换。 在这里,在开始搜索模板之前,循环遍历您正在寻找的形状的边界(T或L),并且对于其边界上的每个点,您可以查看渐变方向,然后查看渐变方向和对象模板的原点以及到原点的距离。您可以为每个边界点添加一个表(我们称之为Table A),最后得到一个表,该表从梯度方向映射到对象原点的可能位置集。现在你设置了一个2D投票空间,它实际上只是一个2D数组(我们称之为Table B),其中每个像素都包含一个数字,表示该位置对象的投票数。然后,对于目标图像(点云)中的每个点,检查渐变并找到与该渐变对应的Table A中找到的可能对象位置集,然后为{中的所有对应对象位置添加一个投票。 {1}}(霍夫空间)。

这是一个非常简洁的解释,但知道寻找模板匹配和广义霍夫变换,你将能够在网上找到更好的解释。例如。查看维基百科页面上的模板匹配和霍夫变换。

答案 1 :(得分:0)

您可能需要:

1-从您正在寻找对象的图像中提取一些特征。

2-提取对象图像中的另一组特征

3-匹配功能(可以使用SIFT等方法)

4-当你找到匹配时应用RANSAC算法。它为您提供转换矩阵(包括翻译,轮换信息)。

here开始使用SIFT。它实际上是为SIFT编写的最好的源代码之一。它包括RANSAC算法,您不需要自己实现它。

您可以阅读有关RANSAC here的信息。

答案 2 :(得分:0)

用于检测2D点云数据中形状(L,T,...)的两种常用方法是使用OpenCV或点云库。我将说明您在OpenCV中检测这些形状可能要采取的步骤。为此,可以使用以下3种方法,正确的方法选择取决于形状(大小,形状的面积,...):

  • 霍夫线变换
  • 模板匹配
  • 寻找轮廓线

第一步是将您的点转换为灰度Mat对象,方法是基本制作2D点云数据的图像,以便可以使用其他OpenCV函数。然后,您可以对图像进行平滑处理以减少噪点,结果将导致包含真实边缘的模糊图像,如果您的应用程序不需要实时处理,则可以使用bilateralFilter。您可以找到有关平滑here的更多信息。 下一步将是选择方法。如果形状只是某种正交线(例如L或T),则可以使用“霍夫线变换”(Hough Line Transformation)来检测线,并在检测到之后,可以在线上循环并计算线的dot product (由于它们是正交的,结果应为0)。您可以找到有关霍夫线变换here的更多信息。 另一种方法是使用“模板匹配”来检测您的形状。基本上,您应该制作一个形状(L或T)的模板,并在matchTemplate函数中使用它。您应该考虑要使用的模板的大小应与图像顺序一致,否则可以调整图像的大小。有关算法的更多信息,请参见here。 如果形状包含区域,则可以使用findContours找到形状的轮廓,它将为您提供要检测的形状周围的多边形数量。例如,如果您的形状是L,它将具有大约6条线的多边形。另外,您可以将其他一些过滤器与findContours一起使用,例如计算形状的面积。