PCL 删除分段表下的点



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

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

我像这样解决了这个问题:

创建系数 (0,1,2) 的特征::向量 3d n
计算矢量和 z 轴之间的角度。
反转 n, 系数值 (3) 和角度如果角度> 0,因为 z 滤波器限制 [ setFilterLimits(FLT_MIN,FLT_MAX); ]
Create Eigen::Affine3d t (Eigen::Translation3d(n*coefficients.values(3)));
计算 r 天使轴(角度,轴)
计算变换 r * t
转换点云
使用直通筛选器并设置限制。
然后逆变换

最简单的方法可能是在提取的平面点周围创建一个凸包,然后将其向下投影以在该凸包下方创建一个棱镜,删除该棱镜内的点。这很容易通过点云库使用pcl::ExtractPolygonalPrismData类来完成。

可以在此处找到使用此类的教程。

最新更新