目录
一、概述
1.1原理
1.2实现步骤
1.3应用场景
二、代码实现
2.1关键函数
2.2完整代码
三、实现效果
PCL点云算法汇总及实战案例汇总的目录地址链接:
PCL点云算法与项目实战案例汇总(长期更新)
一、概述
1.1原理
TXT格式的点云文件通常以纯文本的形式存储点的坐标数据,每一行代表一个点的三维坐标(X, Y, Z)。通过读取这些坐标数据,可以将其转换为PCL格式的点云数据,并在PCL的可视化窗口中显示。
1.2实现步骤
- 打开并读取TXT格式的点云文件,逐行解析文件内容,提取点的三维坐标。
- 将提取的坐标信息存储到PCL的 pcl::PointCloud 对象中。
- 使用PCL可视化工具显示读取的点云数据。
1.3应用场景
- 简单点云数据可视化:TXT文件格式简单明了,适用于存储和共享基本的点云数据,可以快速读取并可视化。
- 数据预处理与验证:在数据预处理过程中,TXT格式的点云数据可以方便地进行手动检查和验证。
- 教学与研究:在教学和研究中,TXT格式常用于演示和实验点云处理算法的输入输出。
二、代码实现
2.1关键函数
1.TXT文件读取:
- std::ifstream:用于打开和读取TXT文件。
- std::istringstream:用于解析每一行的坐标数据。
2. 点云数据存储:
- pcl::PointCloud<pcl::PointXYZ>:用于存储读取的点云数据。
3.点云可视化:
- pcl::visualization::PCLVisualizer:创建一个可视化窗口并显示点云数据。
- viewer->addPointCloud:将点云数据添加到可视化窗口中进行显示。
2.2完整代码
#include <iostream>
#include <fstream>
#include <sstream>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
// 封装的函数:从TXT文件加载点云数据并生成pcl::PointCloud<pcl::PointXYZ>对象
pcl::PointCloud<pcl::PointXYZ>::Ptr loadPointCloudFromTXT(const std::string& filename)
{
// 1. 创建一个空的PointCloud对象,用于存储点云数据
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
// 2. 打开TXT文件
std::ifstream infile(filename); // 使用std::ifstream打开文件
if (!infile.is_open()) // 如果文件无法打开,输出错误信息并返回空指针
{
std::cerr << "Error opening file: " << filename << std::endl;
return nullptr;
}
std::string line;
// 3. 逐行读取文件内容
while (std::getline(infile, line))
{
std::istringstream iss(line); // 使用std::istringstream解析每一行
pcl::PointXYZ point;
// 解析一行中的X, Y, Z坐标,并存储到point对象中
if (!(iss >> point.x >> point.y >> point.z))
{
std::cerr << "Error parsing line: " << line << std::endl;
break; // 如果解析失败,输出错误信息并退出循环
}
cloud->points.push_back(point); // 将解析的点添加到点云对象中
}
infile.close(); // 关闭文件
// 4. 设置点云的基本属性
cloud->width = cloud->points.size(); // 设置点云的宽度为点的数量
cloud->height = 1; // 设置点云的高度为1(表示这是一个无序点云)
cloud->is_dense = true; // 设置点云为稠密点云
// 5. 返回生成的点云对象
return cloud;
}
int main(int argc, char** argv)
{
// 1. 使用封装的函数从TXT文件中加载点云数据
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud = loadPointCloudFromTXT("Elephant.txt");
if (!cloud) // 如果点云数据加载失败,退出程序
{
return -1;
}
// 2. 创建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"); // 设置点的大小
// 3. 启动可视化主循环
while (!viewer->wasStopped())
{
viewer->spinOnce(100); // 刷新窗口
}
return 0;
}