2017-10-31 36 views
1

原点(0,0,0)にあるRGBDセンサからポイントクラウドのどの点が見えるかを調べる必要があります。私は、pclのvoxelgridOcclusionEstimationクラスを使って、センサーに見えるようにクラウド内の可視領域を決定しようとしました。レイトレーシング技術を使用しています。実験としてpclを使ったポイントクラウドのオクルージョン推定voxelgridOcclusionEstimation

、私はその中心以下のいずれかを満たす球の可視領域を取得しよう:

  1. 中心は、x
  2. 中心に沿ってY
  3. 中心に沿ってZに沿っています
  4. 中心はXZ平面
  5. 中心に沿ったyz平面
  6. 中心に沿ってXY平面に沿っています。

センサーはすべての場合においてゼロ回転の原点にあります。

voxelgridOcclusionEstimation yeilds wierd results。緑色の領域は可視領域を示し、赤色は遮蔽領域を示します。

sphere along x axis

sphere along z axis

sphere along y axis

sphere along xy plane

sphere along yz plane

私のコードは次のとおりです。

int main(int argc, char * argv[]) 
{ 
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in(new pcl::PointCloud<pcl::PointXYZ>); 

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_occluded(new pcl::PointCloud<pcl::PointXYZ>); 

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_visible(new pcl::PointCloud<pcl::PointXYZ>); 

pcl::io::loadPCDFile(argv[1],*cloud_in); 

Eigen::Quaternionf quat(1,0,0,0); 
cloud_in->sensor_origin_ = Eigen::Vector4f(0,0,0,0); 

cloud_in->sensor_orientation_= quat; 
pcl::VoxelGridOcclusionEstimation<pcl::PointXYZ> voxelFilter; 
voxelFilter.setInputCloud (cloud_in); 

float leaf_size=atof(argv[2]); 
voxelFilter.setLeafSize (leaf_size, leaf_size, leaf_size); 
voxelFilter.initializeVoxelGrid(); 

std::vector<Eigen::Vector3i, 
Eigen::aligned_allocator&lt;Eigen::Vector3i> > occluded_voxels; 

for (size_t i=0;i<cloud_in->size();i++) 
{ 

    PointT pt=cloud_in->points[i]; 

    Eigen::Vector3i grid_cordinates=voxelFilter.getGridCoordinates (pt.x, pt.y, pt.z); 

    int grid_state; 

    int ret=voxelFilter.occlusionEstimation(grid_state, grid_cordinates); 

    if (grid_state==1) 
    { 
     cloud_occluded->push_back(cloud_in->points[i]); 
    } 
    else 
    { 
    cloud_visible->push_back(cloud_in->points[i]); 
    } 

} 
pcl::io::savePCDFile(argv[3],*cloud_occluded); 
pcl::io::savePCDFile(argv[4],*cloud_visible); 

return 0; 
} 

答えて

0

voxelgridOcclusionEstimationクラスは機能しますが、グリッド幅は非常に重要です。私たちがそれを非常に小さくすると、フォアグラウンドに空のボクセルがあり、投げられた光線をバックグラウンドに渡すことができます。それらが非常に大きく設定されていると、サーフェスは正しく表現されません。モデルがRGBDセンサによって捕捉されたデータのように均一な点密度を有していない場合、これはより困難である

関連する問題