Filtering Point Clouds with a Passthrough Filter#

This tutorial demonstrates how to execute passthrough filtering.

Note

This tutorial is applicable for execution for both within inside and outside a Docker image. It assumes that the pcl-oneapi-tutorials Deb package is installed, and the user has copied the tutorial directory from /opt/intel/pcl/oneapi/tutorials/ to a user-writable directory.

  1. Prepare the environment:

    cd <path-to-oneapi-tutorials>/passthrough
    
  2. oneapi_passthrough.cpp should be in the directory with following content:

     1// SPDX-License-Identifier: Apache-2.0
     2// Copyright (C) 2025 Intel Corporation
     3#include <pcl/oneapi/filters/passthrough.h>
     4#include <pcl/io/pcd_io.h>
     5#include <pcl/point_types.h>
     6#include <pcl/point_cloud.h>
     7
     8
     9int main (int argc, char** argv)
    10{
    11
    12  std::cout << "Running on device: " << dpct::get_default_queue().get_device().get_info<sycl::info::device::name>() << "\n";
    13
    14  // Read Point Cloud
    15  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_( new pcl::PointCloud<pcl::PointXYZ>() );
    16  int result = pcl::io::loadPCDFile("using_kinfu_large_scale_output.pcd", *cloud_);
    17  if (result != 0)
    18  {
    19    pcl::console::print_info ("Load pcd file failed.\n");
    20    return result;
    21  }
    22
    23  // Prepare Point Cloud Memory (output)
    24  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered_( new pcl::PointCloud<pcl::PointXYZ>() );
    25
    26  // GPU calculate
    27  pcl::oneapi::PassThrough<pcl::PointXYZ> ps;
    28  ps.setInputCloud(cloud_);
    29  ps.setFilterFieldName ("z");
    30  ps.setFilterLimits (0.0, 1.0);
    31  ps.filter(*cloud_filtered_);
    32
    33  // print log
    34  std::cout << "[oneapi passthrough] PointCloud before filtering: " << cloud_->size() << std::endl;
    35  std::cout << "[oneapi passthrough] PointCloud after filtering: " << cloud_filtered_->size() << std::endl;
    36}
    
  3. Source the Intel® oneAPI Base Toolkit environment:

    source /opt/intel/oneapi/setvars.sh
    
  4. (Optional) Set up proxy setting to download test data:

    export http_proxy="http://<http_proxy>:port"
    export https_proxy="http://<https_proxy>:port"
    
  5. Build the code:

    mkdir build && cd build
    cmake ../
    make -j
    
  6. Run the binary:

    ./oneapi_passthrough
    
  7. Expected results example:

    [oneapi passthrough] PointCloud before filtering: 993419
    [oneapi passthrough] PointCloud after filtering: 328598
    

Code Explanation#

Load the example PCD into a PointCloud<PointXYZ>.

// Read Point Cloud
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_( new pcl::PointCloud<pcl::PointXYZ>() );
int result = pcl::io::loadPCDFile("using_kinfu_large_scale_output.pcd", *cloud_);
if (result != 0)
{
  pcl::console::print_info ("Load pcd file failed.\n");
  return result;
}

Prepare output buffer for filtered result.

// Prepare Point Cloud Memory (output)
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered_( new pcl::PointCloud<pcl::PointXYZ>() );

Starts to compute the result.

// GPU calculate
pcl::oneapi::PassThrough<pcl::PointXYZ> ps;
ps.setInputCloud(cloud_);
ps.setFilterFieldName ("z");
ps.setFilterLimits (0.0, 1.0);
ps.filter(*cloud_filtered_);

Result (output log):

std::cout << "[oneapi passthrough] PointCloud before filtering: " << cloud_->size() << std::endl;
std::cout << "[oneapi passthrough] PointCloud after filtering: " << cloud_filtered_->size() << std::endl;