2017-04-06 3 views
1

아래 함수는 아무런 결과도 가져 오지 않습니다. 즉, 포인트 클라우드의 포인트 수는 다운 샘플링 전과 동일합니다. 나는 잎 크기를 위해 0.01에서부터 당신이 아래에 보이는 것들에 이르기까지 다양한 숫자들을 시도했지만, 모두 같은 결과를 만들어 낸다. pcl::PointCloud<T>에서 pcl::PCLPointCloud2으로가는 전환 수 (아래에서 볼 수 있듯이)로 시세 표시해야 했으므로 여기에서 문제가 될 수도 있습니다.pcl :: VoxelGrid를 사용한 PCL 다운 샘플

비슷한 문제가있는 경우 알려 주시면 해결해 드리겠습니다. 감사합니다.

typedef pcl::PointCloud<pcl::PointXYZ>::Ptr PointCloudPtr; 

void PlantVis::downsample(PointCloudPtr cloud) { 
    pcl::PCLPointCloud2::Ptr cloud2(new pcl::PCLPointCloud2()); 
    pcl::toPCLPointCloud2(*cloud, *cloud2); 

    pcl::PCLPointCloud2::Ptr cloud_filtered(new pcl::PCLPointCloud2()); 

    pcl::VoxelGrid<pcl::PCLPointCloud2> sor; 
    sor.setInputCloud(cloud2); 
    sor.setLeafSize(500000000.01f, 500000000.01f, 500000000.01f); 
    sor.filter(*cloud_filtered); 

    pcl::PointCloud<pcl::PointXYZ>::Ptr m_cloud(new pcl::PointCloud<pcl::PointXYZ>); 
    pcl::fromPCLPointCloud2(*cloud_filtered, *m_cloud); 
    cloud = m_cloud; 
} 

답변

1

왜 모든 변환이 필요합니까? 대신 다음과 같이 시도하십시오 :

void PlantVis::downsample(PointCloudPtr cloud) { 
    PointCloudPtr output(new pcl::PointCloud<pcl::PointXYZ>); 
    pcl::VoxelGrid<pcl::PointXYZ> sor; 
    sor.setInputCloud(input_cloud); 
    sor.setLeafSize(0.001f, 0.001f, 0.001f); 
    sor.filter(*output); 

    //display or do something else with output 
} 
+0

감사합니다. 코드는 이전에 간과 한 것을 보여 줬습니다. – Illia

1

함수의 인수는 포인터입니다. 포인터의 값을 수정하더라도 원래 구름은 영향을받지 않습니다. 이 함수 정의에서 참조를 사용해보십시오.

void PlantVis::downsample(PointCloudPtr &cloud)