2016-04-05 14 views
0

私はどこかで間違いを犯すと誰かが指摘してくれることを望んでいます。pcl voxelgridポイント数が集計されていませんか?

私はPCL(1.8)のボクセルグリッドフィルタを使ってサンプルをダウンさせ、グループポイントをセルごとに1ポイントにするlazファイルを持っています。私は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で持っています。問題は、xyセントロイドポイントをグリッドセルにビンすると、1セルあたり1ポイント以上があるため、以下のアサーションエラーが発生します。違いはポイント数が多いです:27841173ポイントはpcdファイルから読み込みますが、グリッドに変換して重複を削除すると25779908しかありません。

ご存知ですか?あなたがあなたのPythonスクリプトを持っているかもしれない最悪のケースでは

sor.setLeafSize(resolution, resolution, 500); 

:PCLボクセルグリッドフィルタは、サイズがで定義された葉セルに含まれるすべてのポイントの重心を返し

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

セル(x、y)は、セルの右端にある質量中心点であり、セル(x + 1、y)では左境界線にポイントがあります。 x軸のこれらの点の間の距離は実際には小さくても同じdf ['x']になる可能性があります。それが重複しているのです。

関連する問題