目录
一、概述
1.1原理
1.2实现步骤
1.3应用场景
二、代码实现
2.1关键函数
2.2完整代码
三、实现效果
3.1原始点云
3.2数据显示
PCL点云算法汇总及实战案例汇总的目录地址链接:
PCL点云算法与项目实战案例汇总(长期更新)
一、概述
1.1原理
STL(Stereo Lithography)是一种常见的三维模型文件格式,通常用于3D打印和计算机辅助设计(CAD)中。STL文件描述了三维物体的表面网格,其中包含大量三角形面片的顶点信息。通过读取这些顶点信息,可以将STL文件转换为点云数据,供进一步处理和分析。
1.2实现步骤
- 使用PCL库中的 pcl::io::loadPolygonFileSTL 函数读取STL文件,并提取其表面网格的顶点信息。
- 将提取的顶点信息转换为点云数据。
- 将生成的点云数据保存为PCD文件,或进行其他进一步处理。
1.3应用场景
- 三维模型分析:通过将STL文件转换为点云,可以进行进一步的点云处理,如噪声过滤、特征提取等。
- 三维重建:将多个STL文件的点云数据合并,可以用于三维重建和模型修复。
- 计算机视觉与机器人:点云数据在计算机视觉和机器人导航中广泛应用,STL文件转换为点云后可以用于路径规划、物体识别等任务。
二、代码实现
2.1关键函数
1.STL文件读取与转换:
- pcl::io::loadPolygonFileSTL:用于读取STL文件并提取顶点信息。
- pcl::PolygonMesh:用于存储STL文件的网格数据。
- pcl::fromPCLPointCloud2:用于将PCL格式的点云数据从网格顶点中提取出来。
2.点云处理与保存:
- pcl::PointCloud<pcl::PointXYZ>:用于存储生成的点云数据。
- pcl::io::savePCDFileASCII:用于将点云数据保存为PCD文件。
2.2完整代码
#include <pcl/io/pcd_io.h>
#include <pcl/io/vtk_lib_io.h> // 包含加载STL文件的头文件
#include <pcl/point_types.h>
#include <pcl/PolygonMesh.h>
#include <pcl/conversions.h> // 用于点云格式转换
#include <pcl/visualization/pcl_visualizer.h> // 包含PCL可视化的头文件
int main(int argc, char** argv)
{
// 1. 创建PolygonMesh对象,用于存储STL文件的网格数据
pcl::PolygonMesh mesh;
// 2. 读取STL文件,并将网格数据存储到PolygonMesh对象中
if (pcl::io::loadPolygonFileSTL("horse-V2w(binary).stl", mesh) == -1) // 文件路径
{
PCL_ERROR("Couldn't read STL file\n");
return -1;
}
// 3. 将网格数据的顶点转换为点云数据
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::fromPCLPointCloud2(mesh.cloud, *cloud);
// 4. 保存转换后的点云数据为PCD文件
pcl::io::savePCDFileASCII("output.pcd", *cloud);
// 5. 输出点云数据的基本信息
std::cout << "Loaded " << cloud->points.size() << " data points from STL file." << std::endl;
// 6. 创建PCLVisualizer对象,用于显示点云数据
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"); // 设置点的大小
// 7. 启动可视化主循环
while (!viewer->wasStopped())
{
viewer->spinOnce(100); // 让可视化窗口刷新
}
return 0;
}
三、实现效果
3.1原始点云
3.2数据显示
Loaded 19851 data points from STL file.