pcl voxelgrid点数不统计?

时间:2016-04-05 08:44:20

标签: c++ point-cloud-library

我希望有人能指出我是否在某处犯了错误。

所以我有一个laz文件,我使用PCL(1.8)的voxelgrid过滤器将下采样和组点转换为每个单元1点。我只想要一个2D网格,所以我将z分辨率设置得非常大。

 loadCloud(cloud, 1);

pcl::VoxelGrid<pcl::PointXYZRGB> sor;
sor.setInputCloud(cloud);
sor.setLeafSize(resolution, resolution, 500);
sor.filter(*cloud_projected);

pcl::PointXYZRGB minpoint;
pcl::PointXYZRGB maxpoint;

pcl::getMinMax3D(*cloud, minpoint, maxpoint);

cout << "min " << minpoint.x << " max x " << maxpoint.x<<endl;
cout << "min " << minpoint.y << " max x " << maxpoint.y<<endl;

pcl::io::savePCDFileASCII("ground_0.1.pcd", *cloud_projected);

另外,我在python中有另一个程序,我使用pandas来检查点数。问题是,当我将xy质心点分成它们的网格单元时,每个单元有> 1个点,导致下面的断言失败。不同之处在于点数很大:从pcd文件读取27841173点,但当我转换成网格并删除重复项时,只有25779908。

有什么想法吗?

    mapdf = pd.read_csv(map_file, names=['x', 'y', 'z', 'intensity'], header=None, sep=" ", skiprows=11)
    mapdf.drop(['z'], axis = 1)

    mapdf, ngrids = self.init_map(mapdf)

def init_map(self, df):

    df['x'] = df.x #- 23527.262795251976
    df['y'] = df.y #- 30751.407782477283

    self.min_x = df.x.min()
    self.max_x = df.x.max()
    self.min_y = df.y.min()
    self.max_y = df.y.max()

    #ngrids = np.ceil(( df.y.max() - df.y.min() )/self.resolution),  \
    #         np.ceil(( df.x.max() - df.x.min() )/self.resolution)

    ngrids = (20419, 12902)

    df['x'] = np.floor((df.x - df.x.min())/self.resolution)
    df['y'] = np.floor((df.y - df.y.min())/self.resolution)


    assert df.shape == df.drop_duplicates().shape

1 个答案:

答案 0 :(得分:0)

pcl体素网格过滤器返回叶子单元格中包含的所有点的质心,其大小由以下定义:

sor.setLeafSize(resolution, resolution, 500);

在最糟糕的情况下,您可能在单元格(x,y)的python脚本中有一个质心点位于单元格的右边界,而单元格(x + 1,y)中可能有左边界上的一个点。 x轴上这些点之间的距离可能非常小,它们可能会产生相同的df [&#39; x&#39;]。这就是你有重复的原因。