pcl::统计异常值删除不起作用



在sor.filter()上运行时。该程序看起来像是被绞死的。而且没有错误。

我相信PCD文件有问题。因为它可以与PCL提供的PCD数据配合使用。我的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");

至少,我发现我的pcd文件中有很多点的坐标为[0,0,0]。这就是问题所在。我试图通过传递过滤器将它们rove。复苏是令人兴奋的。但是我想获得更好的方法来对这些观点。

i使用此功能从pointclouds中删除有限和null点,它基于PCL条件删除类和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 finiten", i);
            cloud_out->points.erase(del + i);
        }
    }
    std::vector<int> indices;
    pcl::removeNaNFromPointCloud(*cloud_out, *temp, indices);
    return temp;
}

最新更新