Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将PCL XYZ云转换为XY(三维到二维) 背景_C++_Point Clouds_Point Cloud Library - Fatal编程技术网

C++ 将PCL XYZ云转换为XY(三维到二维) 背景

C++ 将PCL XYZ云转换为XY(三维到二维) 背景,c++,point-clouds,point-cloud-library,C++,Point Clouds,Point Cloud Library,我有一个类型为PointXYZ的PCL点云。我需要将其转换为vector类型的栅格地图,其中map[x][y]应该为true,前提是至少有一个点。地图应表示点云的特定区域(例如,覆盖点云维度x=[-10,10],y=[-15,15]的20x30单元格) 我现在有什么 目前我有两种方法: 扫描所有点,并将地图中相应的单元格设置为true 将点投影到平面,创建Kd树,然后为地图中的每个单元查询树中最近的点,如果该点落在单元中,则将单元设置为true 现在,第一种方法适用于小型点云:O(n),n是点云

我有一个类型为
PointXYZ
的PCL点云。我需要将其转换为
vector
类型的栅格地图,其中
map[x][y]
应该为true,前提是至少有一个点。地图应表示点云的特定区域(例如,覆盖点云维度x=[-10,10],y=[-15,15]的20x30单元格)

我现在有什么 目前我有两种方法:

  • 扫描所有点,并将地图中相应的单元格设置为true
  • 将点投影到平面,创建Kd树,然后为地图中的每个单元查询树中最近的点,如果该点落在单元中,则将单元设置为true
  • 现在,第一种方法适用于小型点云:O(n),n是点云中的点数

    我认为,第二种方法适用于大型云。最终的查询只有O(m),其中m是地图的大小。但是,构建Kd树和将云投影到平面上都应该是O(n)左右

    我认为第二种方法总是更糟糕,但我会运行一个测试来看看

    问题: 有更好的方法吗?可能是八叉树或体素网格(2D)的方法吗?方法一的问题是,我不必要地看兴趣区域之外的点


    在我看来,我不可能是第一个遇到这个问题的人,对吗?

    如果点云已经“有组织”(例如,如果它直接来自RGBD传感器),那么在最好的情况下,通过巧妙地遍历2D阵列,您可能能够击败O(N)。有关有组织点云的信息,请参阅

    如果点云没有组织,那么除了点本身之外,点云中没有关于空间组织的信息,因此在几乎所有情况下,你都必须触摸它们中的每一个。如果地图足够小,你可以在地图满时退出,但我想这不太可能发生

    如果您对概率结果感到满意,则可以通过随机采样点云来构建地图