2017-10-31 26 views
1

원점 (0,0,0)에 위치한 RGBD 센서에서 포인트 클라우드의 어느 점을 볼 수 있는지 알아야합니다. 나는 pcl의 voxelgridOcclusionEstimation 클래스를 사용하여 센서에서 볼 수있는 클라우드의 가시 영역을 결정하려고했습니다. 광선 추적 기술을 사용합니다. 실험으로서 pcl voxelgridOcclusionEstimation을 사용하여 포인트 클라우드에서 폐색 예측

는, I는 그 중심은 다음 중 하나를 만족하는 영역에서 가시 영역을 얻으려고 노력 :

  1. 중심 (X)을 따르는
  2. 센터
  3. 중심 (Z)을 따르는 Y 따라 절취
  4. 센터
  5. 센터
  6. 센터 YZ 평면을 따라 XY 평면을 따라이다 XZ 평면을 따라있다.

모든 경우 센서의 원점이 0 회전입니다.

voxelgridOcclusionEstimation yeilds wierd 결과. 녹색 영역은 가시 영역을 나타내며 빨간색 영역은 차단 영역을 나타냅니다.

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 센서로 캡처 한 데이터의 경우와 같이 균일 한 점 밀도를 갖지 않으면 더 어렵습니다.