Python 二维点云中的直线检测

Python 二维点云中的直线检测,python,navigation,computer-vision,line,point-clouds,Python,Navigation,Computer Vision,Line,Point Clouds,我正在开发一个更大的系统,用于自动引导车辆的导航和定位,但偶然发现了一个问题。绘制地图时,重要的部分是找到墙。导航是使用激光雷达装置完成的 传感器看到的示例“图像”如下所示: 想要的输出是这样的: 我已经研究了很多Hough变换和RANSAC算法,但是据我所知,Hough变换用于图像,这对我的情况来说不是最优的,RANSAC对于在稀疏数据中查找多个墙来说也不是很好 此特定示例中使用的数据可在以下链接中找到: 其中,文件中的两个数组表示x和y坐标,其中元素通过索引对应 我是用python开发的

我正在开发一个更大的系统,用于自动引导车辆的导航和定位,但偶然发现了一个问题。绘制地图时,重要的部分是找到墙。导航是使用激光雷达装置完成的

传感器看到的示例“图像”如下所示:

想要的输出是这样的:

我已经研究了很多Hough变换和RANSAC算法,但是据我所知,Hough变换用于图像,这对我的情况来说不是最优的,RANSAC对于在稀疏数据中查找多个墙来说也不是很好

此特定示例中使用的数据可在以下链接中找到: 其中,文件中的两个数组表示x和y坐标,其中元素通过索引对应

我是用python开发的,但是如果有人知道一个合适的算法,而这个算法在软件包中是不可用的,那么我自己编写算法是没有问题的


提前感谢,雅各布

你可以尝试数学形态学,比如侵蚀/膨胀

我试过你的照片,它开始向一个房间看:

下面是一个使用opencv在python中实现的示例:

import numpy as np
import scipy.stats
import cv2

inputImage = cv2.imread('input.jpg')

skernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
cv2.imshow("test1",inputImage)

openImg =cv2.morphologyEx(inputImage, cv2.MORPH_OPEN, skernel, iterations =15)
cv2.imshow("test2",openImg)
img_gray = cv2.cvtColor(openImg, cv2.COLOR_BGR2GRAY)
ret,th3 = cv2.threshold(img_gray,200,255,cv2.THRESH_BINARY)

cv2.imshow("test3",th3)

另外,我认为您的问题中缺少了一个关键词,因为您正在寻找的是点云重建算法。你也可以看看这里

你可以试试数学形态学,比如侵蚀/膨胀

我试过你的照片,它开始向一个房间看:

下面是一个使用opencv在python中实现的示例:

import numpy as np
import scipy.stats
import cv2

inputImage = cv2.imread('input.jpg')

skernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
cv2.imshow("test1",inputImage)

openImg =cv2.morphologyEx(inputImage, cv2.MORPH_OPEN, skernel, iterations =15)
cv2.imshow("test2",openImg)
img_gray = cv2.cvtColor(openImg, cv2.COLOR_BGR2GRAY)
ret,th3 = cv2.threshold(img_gray,200,255,cv2.THRESH_BINARY)

cv2.imshow("test3",th3)

另外,我认为您的问题中缺少了一个关键词,因为您正在寻找的是点云重建算法。您也可以在这里查看一下

对于最初的问题来说可能有点晚了,但我相信会有更多的人想要解决同样的问题

Hough变换可以很好地在点云上完成,但是我不知道有现成的库实现

这是一个很好的例子,有完整的解释和源代码:


如果您了解了如何工作并查看了代码,您将看到它是如何遍历点并在特征空间中创建二维直方图的。实现这样的东西非常简单。

对于最初的问题来说可能有点晚了,但我相信更多的人会想解决同样的问题

Hough变换可以很好地在点云上完成,但是我不知道有现成的库实现

这是一个很好的例子,有完整的解释和源代码:


如果您了解了如何工作并查看了代码,您将看到它是如何遍历点并在特征空间中创建二维直方图的。实现这样的东西非常简单。

从一个无知的家伙那里,也许你应该集中你的观点,然后执行RANSAC?但是为什么HoughtTransform不起作用呢?理论上,它应该通过在稀疏点之间找到边缘来工作……而图像只是平面上具有光强度值的点的集合。@JasonChia是的,你可能是对的,但我如何正确地对测量值进行聚类?当谈到霍夫变换时,我想我主要得出了一个结论,那就是需要我将精度降低到很多,我需要能够在50米长的仓库中,将墙壁的精度估计到毫米。你认为霍夫可以用来做这个吗?谢谢你的回答。你试过PCL的代码吗?Plane segmentation@SuhasC谢谢你的回答,我的cpp知识几乎不存在,但我会看一看。从一个无知的家伙那里,也许你应该集中你的观点,然后执行RANSAC?但是为什么HoughtTransform不起作用呢?理论上,它应该通过在稀疏点之间找到边缘来工作……而图像只是平面上具有光强度值的点的集合。@JasonChia是的,你可能是对的,但我如何正确地对测量值进行聚类?当谈到霍夫变换时,我想我主要得出了一个结论,那就是需要我将精度降低到很多,我需要能够在50米长的仓库中,将墙壁的精度估计到毫米。你认为霍夫可以用来做这个吗?谢谢你的回答。你试过PCL的代码吗?Plane segmentation@SuhasC谢谢你的回答,我的cpp知识几乎不存在,但我会看一看。嗨,谢谢你的回答和你所付出的所有努力。遗憾的是,我怀疑这将导致低于最佳精度。。我相信,数据中的大量噪声将使使用“图像分析”方法的结果变得更加糟糕。这种方法无法找到图像中的线条。这只会让人看起来更好,这与本例完全无关。嗨,谢谢你的回答和你所付出的一切努力。遗憾的是,我怀疑这将导致低于最佳精度。。我相信,数据中的大量噪声将使使用“图像分析”方法的结果变得更加糟糕。这种方法无法找到图像中的线条。这只会让它看起来更“好看”,在这种情况下这是完全不相关的。