当前位置: 首页 > news >正文

PCL 点云索引提取器

目录

一、概述

1.1原理

1.2实现步骤

1.3应用场景

二、代码实现

2.1关键函数

2.1.1 根据索引提取点云

2.1.2 可视化函数

2.2完整代码

三、实现效果


PCL点云算法汇总及实战案例汇总的目录地址链接:

PCL点云算法与项目实战案例汇总(长期更新)


一、概述

        根据索引提取点云子集 是在点云处理中常见的操作之一。PCL 提供了 pcl::ExtractIndices 类,允许从点云中提取指定索引的点,形成一个新的子集点云。这种方法特别适用于从计算结果中提取感兴趣的点集,或者去除不需要的点。

1.1原理

        通过提供点云中某些点的索引,可以提取这些索引对应的点形成一个子集。PCL 的 ExtractIndices 类会根据输入的索引提取指定点,同时可以选择是保留还是去除这些点。

1.2实现步骤

  1. 读取点云数据。
  2. 定义要提取的索引(如通过计算或手动指定)。
  3. 使用 pcl::ExtractIndices 提取对应的点云子集。
  4. 可视化提取结果。

1.3应用场景

  1. 提取感兴趣区域:通过索引提取特定的感兴趣区域进行后续处理。
  2. 噪声去除:去除或提取某些噪声点。
  3. 子集操作:在点云处理过程中提取某些区域,进行细粒度操作。

二、代码实现

2.1关键函数

2.1.1 根据索引提取点云

使用 pcl::ExtractIndices 类来从点云中提取指定索引的点。

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/extract_indices.h>// 根据索引提取点云子集
pcl::PointCloud<pcl::PointXYZ>::Ptr extractSubsetByIndices(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,  // 输入点云const std::vector<int>& indices             // 要提取的索引
)
{// 创建索引对象pcl::PointIndices::Ptr indices_ptr(new pcl::PointIndices);indices_ptr->indices = indices;// 创建提取对象pcl::ExtractIndices<pcl::PointXYZ> extract;extract.setInputCloud(cloud);                // 设置输入点云extract.setIndices(indices_ptr);             // 设置要提取的索引extract.setNegative(false);                  // false 表示提取指定索引的点// 提取后的点云pcl::PointCloud<pcl::PointXYZ>::Ptr extracted_cloud(new pcl::PointCloud<pcl::PointXYZ>);extract.filter(*extracted_cloud);            // 执行提取操作return extracted_cloud;                      // 返回提取的子集点云
}

2.1.2 可视化函数

#include <pcl/visualization/pcl_visualizer.h>// 可视化点云
void visualizePointClouds(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,           // 原始点云pcl::PointCloud<pcl::PointXYZ>::Ptr subset_cloud     // 子集点云
)
{pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("Point Cloud Viewer"));// 创建视口1,显示原始点云int vp_1;viewer->createViewPort(0.0, 0.0, 0.5, 1.0, vp_1);  // 左侧窗口viewer->setBackgroundColor(1.0, 1.0, 1.0, vp_1);   // 白色背景viewer->addText("Original PointCloud", 10, 10, "vp1_text", vp_1);pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> original_color(cloud, 0, 255, 0);  // 绿色viewer->addPointCloud(cloud, original_color, "original_cloud", vp_1);// 创建视口2,显示子集点云int vp_2;viewer->createViewPort(0.5, 0.0, 1.0, 1.0, vp_2);  // 右侧窗口viewer->setBackgroundColor(0.98, 0.98, 0.98, vp_2);  // 浅灰色背景viewer->addText("Subset PointCloud", 10, 10, "vp2_text", vp_2);pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> subset_color(subset_cloud, 255, 0, 0);  // 红色viewer->addPointCloud(subset_cloud, subset_color, "subset_cloud", vp_2);// 设置点的大小viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "original_cloud", vp_1);viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "subset_cloud", vp_2);// 启动可视化循环while (!viewer->wasStopped()){viewer->spinOnce(100);}
}

2.2完整代码

// C++头文件
#include <iostream>
// PCL头文件
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/extract_indices.h>
#include <pcl/visualization/pcl_visualizer.h>// 根据索引提取点云子集
pcl::PointCloud<pcl::PointXYZ>::Ptr extractSubsetByIndices(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,  // 输入点云const std::vector<int>& indices             // 要提取的索引
)
{// 创建索引对象pcl::PointIndices::Ptr indices_ptr(new pcl::PointIndices);indices_ptr->indices = indices;// 创建提取对象pcl::ExtractIndices<pcl::PointXYZ> extract;extract.setInputCloud(cloud);                // 设置输入点云extract.setIndices(indices_ptr);             // 设置要提取的索引extract.setNegative(false);                  // false 表示提取指定索引的点// 提取后的点云pcl::PointCloud<pcl::PointXYZ>::Ptr extracted_cloud(new pcl::PointCloud<pcl::PointXYZ>);extract.filter(*extracted_cloud);            // 执行提取操作return extracted_cloud;                      // 返回提取的子集点云
}// 可视化点云
void visualizePointClouds(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,           // 原始点云pcl::PointCloud<pcl::PointXYZ>::Ptr subset_cloud     // 子集点云
)
{pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("Point Cloud Viewer"));// 创建视口1,显示原始点云int vp_1;viewer->createViewPort(0.0, 0.0, 0.5, 1.0, vp_1);  // 左侧窗口viewer->setBackgroundColor(1.0, 1.0, 1.0, vp_1);   // 白色背景viewer->addText("Original PointCloud", 10, 10, "vp1_text", vp_1);pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> original_color(cloud, 0, 255, 0);  // 绿色viewer->addPointCloud(cloud, original_color, "original_cloud", vp_1);// 创建视口2,显示子集点云int vp_2;viewer->createViewPort(0.5, 0.0, 1.0, 1.0, vp_2);  // 右侧窗口viewer->setBackgroundColor(0.98, 0.98, 0.98, vp_2);  // 浅灰色背景viewer->addText("Subset PointCloud", 10, 10, "vp2_text", vp_2);pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> subset_color(subset_cloud, 255, 0, 0);  // 红色viewer->addPointCloud(subset_cloud, subset_color, "subset_cloud", vp_2);// 设置点的大小viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "original_cloud", vp_1);viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "subset_cloud", vp_2);// 启动可视化循环while (!viewer->wasStopped()){viewer->spinOnce(100);}
}int main(int argc, char** argv)
{// 读取点云数据pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);if (pcl::io::loadPCDFile("bunny.pcd", *cloud) == -1){PCL_ERROR("Couldn't read the file\n");return -1;}// 定义前 1000 个点的索引std::vector<int> indices;for (int i = 0; i < std::min(1000, static_cast<int>(cloud->points.size())); ++i){indices.push_back(i);}// 根据索引提取点云子集pcl::PointCloud<pcl::PointXYZ>::Ptr subset_cloud = extractSubsetByIndices(cloud, indices);// 可视化原始点云和子集点云visualizePointClouds(cloud, subset_cloud);return 0;
}

三、实现效果


http://www.mrgr.cn/news/40341.html

相关文章:

  • 创建视图提示:View‘s SELECT contains a subquery in the FROM clause.
  • 华为OD机试真题-荒岛逃生游戏-2024年OD统一考试(E卷)
  • 025.Oracle_DBMS_job定时任务
  • Java之线程篇七
  • 问:JAVA阻塞队列实现类及最佳实践?
  • 数据库 - Redis数据库
  • 如何实现多套环境的自动化测试?
  • 使用Jmeter进行http接口性能测试
  • 2024年9月总结及随笔之丢卡
  • Divide Rows and Conquer Cells: Towards Structure Recognition for Large Table
  • Debezium日常分享系列之:Debezium 3.0.0.CR2发布
  • JMeter 性能测试基本过程及示例
  • 开发平台 开放平台 集成平台 配置平台的区别
  • Java服务端数据库连接:连接池的资源优化
  • python itertools模块介绍
  • lambda表达式底层实现:反编译LambdaMetafactory + 转储dump + 运行过程 + 反汇编 + 动态指令invokedynamic
  • ICM20948 DMP代码详解(53)
  • 前端规范工程-5:Git提交信息规范(commitlint + czg)
  • 问:JAVA中阻塞队列的概念、原理及使用场景?
  • 基于JAVA Web的校园快递代领系统设计与实现(源码+定制+文档)