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.
Prepare the environment:
cd <path-to-oneapi-tutorials>/passthrough
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}
Source the Intel® oneAPI Base Toolkit environment:
source /opt/intel/oneapi/setvars.sh
(Optional) Set up proxy setting to download test data:
export http_proxy="http://<http_proxy>:port" export https_proxy="http://<https_proxy>:port"
Build the code:
mkdir build && cd build cmake ../ make -j
Run the binary:
./oneapi_passthrough
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;