使用pcl voxelgridOcclusionEstimation估计pointcloud中的遮挡

时间:2017-10-31 19:46:19

标签: point-cloud-library raytracing voxel occlusion

我需要从位于原点(0,0,0)的RGBD传感器中找出点云的哪些点可见。我尝试使用pcl的voxelgridOcclusionEstimation类来确定传感器看到的云中的可见区域。它使用射线追踪技术。

作为一项实验,我试图在一个球体中获得可见区域,该球体的中心满足以下条件之一:

  1. 中心沿x
  2. 中心沿着
  3. 中心沿z
  4. 中心沿着xz平面
  5. 中心沿y z平面
  6. 中心沿x y平面。
  7. 传感器位于原点,在所有情况下均为零旋转。

    voxelgridOcclusion估计结果很糟糕。绿色区域表示可见区域,而红色表示遮挡区域。

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

2 个答案:

答案 0 :(得分:0)

除错字和缺失点类型定义外,您的代码似乎有效。尝试使用不同的点云进行更好的视觉分析。

编辑。另一方面,这似乎表现得很奇怪,例如牛奶车可以从这里http://pointclouds.org/documentation/tutorials/supervoxel_clustering.php#supervoxel-clustering

答案 1 :(得分:0)

voxelgridOcclusionEstimation类可以工作,但网格宽度非常重要。如果我们使它非常小,那么前景中将会有未占用的体素,这将使得铸造的光线传递到背景。如果它们设置得非常大,则表面将无法正确表示。如果模型没有像RGBD传感器捕获的数据那样具有均匀的点密度,则这将更加困难