c++ - 删除 PCL 可视化器内定义的 3D 框外的点

标签 c++ point-cloud-library

在给定的点云中,我想删除所有 x 小于 min 和大于 max 的点, yz 方向。下面是示例代码:

#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/filters/passthrough.h>
#include <pcl/visualization/pcl_visualizer.h>

// Define min and max for X, Y and Z
float minX = -0.1, minY = -0.5, minZ = -2.5;
float maxX = +0.1, maxY = +0.5, maxZ = +2.5;

int main (int argc, char** argv)
{
    pcl::visualization::PCLVisualizer viewer("Cloud Viewer");

    pcl::PointCloud<pcl::PointXYZRGBA>::Ptr body (new pcl::PointCloud<pcl::PointXYZRGBA>);
    pcl::io::loadPCDFile ("body.pcd", *body);

    pcl::PointCloud<pcl::PointXYZRGBA>::Ptr bodyFiltered (new pcl::PointCloud<pcl::PointXYZRGBA>);

    pcl::PassThrough<pcl::PointXYZRGBA> filter;
    filter.setInputCloud (body);
    filter.setFilterFieldName ("x");
    filter.setFilterLimits (minX, maxX);
    filter.setFilterFieldName ("y");
    filter.setFilterLimits (minY, maxY);
    filter.setFilterFieldName ("z");
    filter.setFilterLimits (minZ, maxZ);
    filter.filter (*bodyFiltered);

    viewer.addPointCloud (bodyFiltered,"body");
    viewer.spin();
    return 0;
}

似乎只应用了最后一个过滤器。请问有什么解决办法吗?

最佳答案

使用 pcl::CropBox 怎么样? ( documentation )

pcl::CropBox<pcl::PointXYZRGBA> boxFilter;
boxFilter.setMin(Eigen::Vector4f(minX, minY, minZ, 1.0));
boxFilter.setMax(Eigen::Vector4f(maxX, maxY, maxZ, 1.0));
boxFilter.setInputCloud(body);
boxFilter.filter(*bodyFiltered);

要了解为什么此过滤器采用 Vector4f(而不是 Vector3f),请参阅下面的评论和 this question .

关于c++ - 删除 PCL 可视化器内定义的 3D 框外的点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45790828/

相关文章:

c++ - PointCloudLibrary (PCL) - 八叉树 - 获取 *branch* 节点内所有点的索引

c++ - 自定义目标的 cmake 依赖项

c++ - 包含库时函数的多重定义

c++ - 两个进程之间的 Ubuntu 共享内存,代码不工作

point-cloud-library - 如果我知道它必须具有的大致形状,我如何分割云?

c++ - Qt Creator - 设置架构标志

c++ - 提升精神合成属性困惑

c++ - copy_if 与保存序列和使用复制

c++ - 构建支持 GPU/CUDA 的 PCL 库

c++ - PCL Release Build 因分配失败而崩溃