PCL删除分段表下的点

时间:2015-04-14 08:50:25

标签: c++ point-cloud-library eigen3

我想删除已识别表格下的所有点数。我该怎么做? 我有以下功能代码来从点云中分割/删除表:

    std::cout << "(II) segmenting table plane ..." << std::endl;
    pcl::PointCloud<pcl::PointXYZ>::Ptr segmented_scene(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointIndices::Ptr inliers(new pcl::PointIndices());
    ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
    SACSegmentation<PointXYZ> segmentation;
    segmentation.setInputCloud(downsampledScene);
    segmentation.setModelType(pcl::SACMODEL_PLANE);
    segmentation.setMethodType(pcl::SAC_RANSAC);
    segmentation.setDistanceThreshold(threshold);
    segmentation.setOptimizeCoefficients(true);
    segmentation.setMaxIterations(1000);
    //PointIndices inlierIndices;
    segmentation.segment(*inliers, *coefficients);
    ExtractIndices<PointXYZ> extract;
    extract.setInputCloud(downsampledScene);
    extract.setIndices(inliers);
    extract.setNegative(true);
    extract.filter(*segmented_scene);
    //copyPointCloud<pcl::PointXYZ>(*downsampledScene, inlierIndices, *segmented_scene);
    copyPointCloud(*segmented_scene, *outputCloud);

或者如何在桌面上设置坐标系的原点以使用直通过滤器过滤表格下的所有点?
我使用以下代码对此进行了测试,但我认为这不正确:

    Eigen::Affine3f transform_1 = Eigen::Affine3f::Identity();
    cout << coefficients->values[0] << " " << coefficients->values[1] << " " << coefficients->values[2] << endl;
    transform_1.translation() << coefficients->values[0], coefficients->values[1], coefficients->values[2];
    transformPointCloud(*segmented_scene, *segmented_scene, transform_1);

2 个答案:

答案 0 :(得分:0)

最简单的方法可能是在您提取的平面点周围创建一个凸包,并将其向下投影以在该凸包下方创建一个棱镜,从而移除该棱镜内的点。使用pcl::ExtractPolygonalPrismData类,点云库可以轻松完成。

可以找到使用此课程的教程here

答案 1 :(得分:0)

我解决了这个问题:

创建Eigen :: Vector3d n 系数(0,1,2) 计算Vector和z轴之间的角度 如果角度> 1,则反转n,系数。值(3)和角度。 0,因为z过滤器限制[setFilterLimits(FLT_MIN,FLT_MAX); ]
创建Eigen :: Affine3d t (Eigen :: Translation3d(n * coefficients.values(3)));
计算 r AngelAxisd(角度,轴)
计算转换 r * t
改变点云 使用直通过滤器并设置限制 然后逆变换