PCL 删除分段下的点 table

PCL remove points under a segmented table

我想删除已识别table下的所有点。我应该怎么做? 我有以下功能代码 segment/remove 来自点云的 table:

    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);

或者如何在table上设置坐标系的原点,使用passthrough filter过滤掉table下的所有点?
我用下面的代码对此进行了测试,但我认为这是不正确的:

    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);

最简单的方法可能是在您提取的平面点周围创建一个凸包,然后向下投影以在该凸包下方创建一个棱镜,移除该棱镜内的点。使用 pcl::ExtractPolygonalPrismData class.

点云库可以轻松完成此操作

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

我是这样解决问题的:

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