2017-02-18 16 views
0

, когда он работает на sor.filter(). программа выглядит как повешенная. и никаких ошибок.pcl :: StatOutlierRemoval не может работать

Я считаю, что это что-то не так с файлом pcd. Потому что он хорошо работает с данными pcd, предоставленными PCL. Мой файл pcd был сохранен из Kinect2. Но я не могу найти разницу между ними.

boost::shared_ptr<pcl::PointCloud<pcl::PointXYZ> > cloud(new pcl::PointCloud<pcl::PointXYZ>); 
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(
new pcl::visualization::PCLVisualizer("Point Cloud Viewer")); 
viewer->setCameraPosition(0.0, 0.0, -2.5, 0.0, 0.0, 0.0); 
pcl::io::loadPCDFile("table_scene_lms400.pcd",*cloud); 
//pcl::io::loadPCDFile("test.pcd",*cloud); 
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor; 
sor.setMeanK(50); 
sor.setStddevMulThresh(1); 
pcl::PointCloud <pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>); 
sor.setInputCloud(cloud); 
sor.filter(*cloud_filtered); 
viewer->addPointCloud(cloud_filtered,"cloud"); 

ответ

0

По крайней мере, я обнаружил, что в моем файле pcd есть много координаты точек [0,0,0]. И в этом проблема. Я попытался создать их с помощью сквозного фильтра. И resualt является захватывающим. Но я хочу, чтобы лучше понять эти моменты.

0

Я использую эту функцию, чтобы удалить конечные и нулевые точки из pointclouds, он основан на PCL Conditional removal класс и isFinite():

PointCloudPtr null_filter(const PointCloudPtr cloud_in) 
{ 
    PointCloudPtr cloud_out(new PointCloud); 
    PointCloudPtr temp(new PointCloud); 

    // build the condition 
    pcl::ConditionOr<PointT>::Ptr range_cond(new pcl::ConditionOr<PointT>()); 
    range_cond->addComparison(pcl::FieldComparison<PointT>::ConstPtr(new pcl::FieldComparison<PointT>("x", pcl::ComparisonOps::GT, 0.0))); 
    range_cond->addComparison(pcl::FieldComparison<PointT>::ConstPtr(new pcl::FieldComparison<PointT>("x", pcl::ComparisonOps::LT, 0.0))); 

    range_cond->addComparison(pcl::FieldComparison<PointT>::ConstPtr(new pcl::FieldComparison<PointT>("y", pcl::ComparisonOps::GT, 0.0))); 
    range_cond->addComparison(pcl::FieldComparison<PointT>::ConstPtr(new pcl::FieldComparison<PointT>("y", pcl::ComparisonOps::LT, 0.0))); 

    range_cond->addComparison(pcl::FieldComparison<PointT>::ConstPtr(new pcl::FieldComparison<PointT>("z", pcl::ComparisonOps::GT, 0.0))); 
    range_cond->addComparison(pcl::FieldComparison<PointT>::ConstPtr(new pcl::FieldComparison<PointT>("z", pcl::ComparisonOps::LT, 0.0))); 

    // build the filter 
    pcl::ConditionalRemoval<PointT> condrem; 
    condrem.setCondition(range_cond); 
    condrem.setInputCloud(cloud_in); 

    // apply filter 
    condrem.filter(*cloud_out); 

    pcl::PointCloud<PointT>::iterator del = cloud_out->points.begin(); 
    for (int i = 0; i < cloud_out->points.size(); i++) 
    { 
     if (!pcl::isFinite<PointT>(cloud_out->points[i])) 
     { 
      //  PCL_WARN("normals[%d] is not finite\n", i); 
      cloud_out->points.erase(del + i); 
     } 
    } 
    std::vector<int> indices; 
    pcl::removeNaNFromPointCloud(*cloud_out, *temp, indices); 

    return temp; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^