一、3D点云数据
3D点云数据是什么:
3D点云数据是在一个三维坐标系统中的一组向量的集合,这些数据通常是通过3D扫描设备,如激光雷达(2D/3D)、RGB双目、3D结构光相机、tof相机(time-of-flight camera)等,以自动化的方式测量物体表面大量的点的信息,并以某种数据文件形式输出的。每个点云数据中的点都包含了丰富的信息,包括三维坐标(X,Y,Z)、颜色、分类值、强度值和时间等。这些信息使得点云数据能够精确地描述和表示现实世界的物体和场景。
3D点云数据在三维重建中作用:
首先,点云数据提供了物体表面的精确几何信息。通过高密度的点云数据,可以精细地描述物体表面的形状、结构和细节。这使得三维重建模型能够更准确地还原真实世界的物体。其次,点云数据的灵活性使得它可以表示任何类型的三维形状,包括不规则形状。这使得三维重建不再局限于简单的几何体或规则形状,而是可以应用于各种复杂的物体和场景。此外,点云数据的获取方式多样,包括激光雷达等设备。这些设备可以在不同的环境和条件下获取点云数据,从而适应各种三维重建需求。例如,在建筑和文化遗产保护中,通过激光扫描获取的点云数据可以实现精确的三维重建,有助于保护和修复古建筑;在地质勘探中,点云数据可以实现对地质地形进行精确的三维重建,对于地质灾害预警和资源勘探具有重要意义。
如何处理3D点云数据:
处理3D点云数据是一个复杂且多步骤的过程,主要涉及数据预处理、特征提取、分割、配准以及三维重建等步骤:
- 数据预处理:预处理是点云数据处理的首要步骤,主要目的是去除噪声、平滑数据、降低数据密度和补全缺失的数据区域。通过预处理,可以提高点云数据的精度和质量,为后续的配准和重建提供更好的基础。
- 特征提取:特征提取是从点云数据中提取出用于后续处理的关键信息。这些特征可以是点云的几何形状、统计特性或拓扑结构等。通过特征提取,可以更好地理解和描述点云数据的特性,为后续的处理步骤提供便利。
- 分割:点云分割是将点云数据划分为具有相似特性的多个子集或区域的过程。分割的方法有多种,包括基于法向量的分割、基于曲率的分割以及基于深度学习的分割等。通过分割,可以更好地理解和分析点云数据的结构和组成。
- 配准:配准是将多个点云数据集对齐到同一坐标系下的过程。配准通常包括粗配准和优化调整两个步骤。粗配准是为了快速地确定点云之间的相对位置和方向,而优化调整则是为了进一步提高配准的精度。通过配准,可以将多个点云数据集整合成一个完整的三维模型。
- 三维重建:三维重建是根据点云数据生成三维模型的过程。这通常涉及将点云数据投影到二维坐标平面内,进行平面内的三角化,从而得到各点的拓扑连接关系,进而重建得到曲面模型。通过三维重建,可以将点云数据转化为直观、可视化的三维模型。
二、点云滤波项目
代码:
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/visualization/pcl_visualizer.h>
int main(int argc, char** argv)
{
// 创建一个PointCloud对象来存储点云数据
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
// 尝试从PCD文件中加载点云数据
if (pcl::io::loadPCDFile<pcl::PointXYZ>("D:\\VS\\VS_Project\\Pcl_demo\\Pcl_demo\\lowres.pcd", *cloud) == -1)
{
PCL_ERROR("无法读取文件 \n");
return (-1);
}
// 输出原始点云中的数据点数量
std::cout << "原始点云数据点数量: " << cloud->width * cloud->height << std::endl;
// 创建体素滤波对象
pcl::VoxelGrid<pcl::PointXYZ> sor;
// 设置体素滤波器的输入点云和体素大小
sor.setInputCloud(cloud);
sor.setLeafSize(0.5f, 0.5f, 0.5f); // 设置体素大小,这里设置为0.05米
// 创建一个新的PointCloud对象来存储滤波后的点云数据
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);
// 应用体素滤波
sor.filter(*cloud_filtered);
// 输出滤波后点云中的数据点数量
std::cout << "滤波后点云数据点数量: " << cloud_filtered->width * cloud_filtered->height << std::endl;
pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
// 设置背景颜色为黑色
viewer->setBackgroundColor(0, 0, 0);
// 添加原始点云到可视化器中,并设置其渲染属性
viewer->addPointCloud<pcl::PointXYZ>(cloud, "sample cloud");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 255, 0, 0, "sample cloud"); // 设置原始点云为红色
// 添加滤波后的点云到可视化器中,并设置其渲染属性
viewer->addPointCloud<pcl::PointXYZ>(cloud_filtered, "filtered cloud");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "filtered cloud");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 255, 0, "filtered cloud"); // 设置滤波后点云为绿色
// 添加坐标系到可视化器中
viewer->addCoordinateSystem(1.0);
// 初始化相机参数,以便获得更好的视图
viewer->initCameraParameters();
// 开始可视化并等待用户交互
viewer->spin();
// 程序结束,点云数据和可视化窗口会被销毁
return 0;
}
注意:
1.在设置体素大小时,要根据每个点云文件的不同来设置。
2.在将点云添加到可视化滤波器中,设置其渲染属性,将初始的点云设置为红色,将滤波后的点云设置为绿色。
运行结果: