2016-04-05 4 views
0

Ich hoffe, jemand könnte darauf hinweisen, wenn ich irgendwo einen Fehler gemacht habe.pcl Voxelgrid Anzahl der Punkte stimmen nicht überein?

Also habe ich eine Laz-Datei, die ich PCL (1.8) Voxelgrid-Filter verwenden, um downsample und gruppieren Punkte in 1 Punkt pro Zelle. Ich möchte nur ein 2D-Raster, also setze ich die z-Auflösung sehr groß.

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); 

Separat habe ich ein anderes Programm in Python, das ich Pandas verwenden, um die Punkte zu überprüfen. Das Problem ist, wenn ich den xy-Schwerpunkt in ihre Rasterzellen bin, gibt es> 1 Punkte pro Zelle, was unten zu einem Assertionsfehler führt. Der Unterschied ist in der Anzahl der Punkte ist groß: 27841173 Punkte aus der pcd-Datei gelesen, aber wenn ich in ihre Gitter konvertieren und die Duplikate fallen gibt es nur 25779908.

Irgendwelche Idee?

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 

Antwort

0

Die pcl Voxelraster Filter die Mitte der Masse aller Punkte zurück in der Blattzelle, der Größe enthalten ist, definiert durch:

sor.setLeafSize(resolution, resolution, 500); 

Im schlimmsten Fall, dass Sie in Ihrem Python-Skript haben könnten in die Zelle (x, y) ein Schwerpunkt Punkt, der auf dem rechten Rand der Zelle liegt, und in der Zelle (x + 1, y) haben Sie einen Punkt auf der linken Grenze. Der Abstand zwischen diesen Punkten in der x-Achse kann sehr klein sein und sie können zu demselben df ['x'] führen. Deshalb haben Sie Duplikate.

Verwandte Themen