PCL专栏目录及须知-CSDN博客
注意:ASCII码型点云包含:*.txt、*.asc、*.neu、*.xyz、*.pts、*.csv几种文件后缀的类型。
1.ASCII码
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是一种字符编码标准,用于将字符映射为数字,以便计算机能够处理和传输这些字符。它是现代字符编码体系的基石,广泛应用于通讯协议、文档编写、编程语言等领域。点云数据中,多种文件格式使用该码编译。
博客推荐:全面解析ASCII码:ASCII码表、大小顺序与实际应用详解
2.使用场景
很多时候,工作里面的点云是*.txt、*.xyz、*.csv几种类型,需用读取ASCII码点云的方式读取。
3.注意事项
无。
4.关键函数
(1)设置文件字段(必须给ASCII读取器设置文件字段,否则容易出现读取错误)
// 设置文件字段
std::vector<pcl::PCLPointField> filedHeader = pcl::getFields<pcl::PointXYZ>();
asciiReader->setInputFields(filedHeader);
(2)注意pcl::ASCIIReader包含读取文件头
asciiReader->readHeader("D:/code/csdn/data/rabbit.txt", cloud2_ascii_header, origin_header, orientation_header, file_version_header, data_type_header, data_idx_header);
和读取文件
asciiReader->read("D:/code/csdn/data/rabbit.txt", cloud2_ascii, origin, orientation, file_version);
两个方法。调用读取文件头的方法时,点云数据中没有具体的点信息。
5.代码
#include <iostream>
#include <pcl/io/ascii_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>
int main()
{
/****************读取ASCII文件********************/
pcl::ASCIIReader* asciiReader = new pcl::ASCIIReader(); // ascii对象
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_ascii(new pcl::PointCloud<pcl::PointXYZ>);
// 设置文件字段
std::vector<pcl::PCLPointField> filedHeader = pcl::getFields<pcl::PointXYZ>();
asciiReader->setInputFields(filedHeader);
// 读取文件头
pcl::PCLPointCloud2 cloud2_ascii_header; // 结果点云数据头信息
Eigen::Vector4f origin_header; // 传感器采集原点(仅适用于>FILE_V7,如果不存在则为空)
Eigen::Quaternionf orientation_header; // 传感器采集方向(仅适用于>FILE-V7)
int file_version_header; // 文件的file版本(file_V6或file_V7)
int data_type_header; // 数据类型(二进制数据=1,ascii=0等)
unsigned int data_idx_header; // 文件中点云数据的偏移量
asciiReader->readHeader("D:/code/csdn/data/rabbit.txt", cloud2_ascii_header, origin_header, orientation_header, file_version_header, data_type_header, data_idx_header);
// 读取文件
pcl::PCLPointCloud2 cloud2_ascii; // 结果点云数据
Eigen::Vector4f origin; // 传感器采集原点(仅适用于>FILE_V7,如果不存在则为空)
Eigen::Quaternionf orientation; // 传感器采集方向(仅适用于>FILE-V7)
int file_version; // 文件的file版本(file_V6或file_V7)
asciiReader->read("D:/code/csdn/data/rabbit.txt", cloud2_ascii, origin, orientation, file_version);
pcl::fromPCLPointCloud2<pcl::PointXYZ>(cloud2_ascii, *cloud_ascii); // 转换为pcl::point<pointT>形式
// 打印
std::cout << "传感器采集原点(仅适用于>FILE_V7,如果不存在则为空):" << origin_header << std::endl;
std::cout << "传感器采集方向(仅适用于>FILE-V7):" << orientation_header << std::endl;
std::cout << "文件的file版本(file_V6或file_V7):" << file_version_header << std::endl;
std::cout << "数据类型(二进制数据=1,ascii=0等):" << data_type_header << std::endl;
std::cout << "文件中点云数据的偏移量:" << data_idx_header << std::endl;
// 展示
boost::shared_ptr<pcl::visualization::PCLVisualizer> view_raw(new pcl::visualization::PCLVisualizer("raw"));
view_raw->addPointCloud(cloud_ascii, "raw cloud");
view_raw->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "raw cloud");
while (!view_raw->wasStopped())
{
view_raw->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
}
6.结果展示
打印信息:
可视化结果: