我希望有人能指出我是否在某处犯了错误。
所以我有一个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
答案 0 :(得分:0)
pcl体素网格过滤器返回叶子单元格中包含的所有点的质心,其大小由以下定义:
sor.setLeafSize(resolution, resolution, 500);
在最糟糕的情况下,您可能在单元格(x,y)的python脚本中有一个质心点位于单元格的右边界,而单元格(x + 1,y)中可能有左边界上的一个点。 x轴上这些点之间的距离可能非常小,它们可能会产生相同的df [&#39; x&#39;]。这就是你有重复的原因。