Point cloud library pcl::StatisticaLoutlierRemoving can';行不通

Point cloud library pcl::StatisticaLoutlierRemoving can';行不通,point-cloud-library,Point Cloud Library,当它在sor.filter()上运行时。这个程序看起来像是被绞死了。 没有错误 我认为pcd文件有问题,因为它与PCL提供的pcd数据配合得很好。我的pcd文件是从Kinect2保存的。但我找不到它们之间的区别 boost::shared_ptr<pcl::PointCloud<pcl::PointXYZ> > cloud(new pcl::PointCloud<pcl::PointXYZ>); boost::shared_ptr<pcl::visual

当它在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");
boost::shared_ptr cloud(新的pcl::PointCloud);
boost::共享的ptr查看器(
新的pcl::visualization::PCLVisualizer(“点云查看器”);
查看器->设置摄影机位置(0.0,0.0,-2.5,0.0,0.0,0.0);
pcl::io::loadPCDFile(“table_scene_lms400.pcd”,*云);
//pcl::io::loadPCDFile(“test.pcd”,*云);
pcl::StatisticaLoutlier;
sor.setMeanK(50);
sor.设置TDDevMulthresh(1);
pcl::PointCloud::Ptr cloud_已过滤(新pcl::PointCloud);
sor.setInputCloud(云);
sor.过滤器(*已过滤的云);
查看器->添加点云(云过滤,“云”);

至少,我发现在我的pcd文件中有很多点的坐标是[0,0,0],这就是问题所在。我试着用一个直通过滤器过滤它们。这次重演令人兴奋。但我想找到更好的方法移动这些点。

我使用此函数从点云中移除有限点和空点,它基于类和:

PointCloudPtr null_过滤器(const PointCloudPtr cloud_in)
{
PointCloudPtr cloud_out(新点云);
点云PTR温度(新点云);
//营造条件
pcl::ConditionOr::Ptr range_cond(新的pcl::ConditionOr());
range_cond->addComparison(pcl::FieldComparison::ConstPtr(新的pcl::FieldComparison(“x”,pcl::ComparisonOps::GT,0.0));
range_cond->addComparison(pcl::FieldComparison::ConstPtr(新的pcl::FieldComparison(“x”,pcl::ComparisonOps::LT,0.0));
range_cond->addComparison(pcl::FieldComparison::ConstPtr(新的pcl::FieldComparison(“y”,pcl::ComparisonOps::GT,0.0));
range_cond->addComparison(pcl::FieldComparison::ConstPtr(新的pcl::FieldComparison(“y”,pcl::ComparisonOps::LT,0.0));
range_cond->addComparison(pcl::FieldComparison::ConstPtr(新的pcl::FieldComparison(“z”,pcl::ComparisonOps::GT,0.0));
range_cond->addComparison(pcl::FieldComparison::ConstPtr(新的pcl::FieldComparison(“z”,pcl::ComparisonOps::LT,0.0));
//构建过滤器
pcl::条件清除条件;
条件设置条件(范围条件);
condrem.setInputCloud(cloud_in);
//应用过滤器
条件过滤器(*云层溢出);
pcl::PointCloud::iterator del=cloud_out->points.begin();
对于(inti=0;ipoints.size();i++)
{
如果(!pcl::isFinite(cloud_out->points[i]))
{
//PCL_警告(“法线[%d]不是有限的\n”,i);
云计算->点。擦除(del+i);
}
}
std::向量指数;
pcl::移除点云(*云计算,*温度,指数);
返回温度;
}
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;
}