PCL教程指南-读取PCD文件,写入PCD文件,合并点云
一.读取PCD文件
读取PCD应用pcl::io::loadPCDFile<pcl::PointT>(pcd文件,点云对象)
函数,针对官方文档代码进行注释解释
#include <iostream>
#include <pcl/io/pcd_io.h> //pcd流头文件
#include <pcl/point_types.h> //点类型即现成的pointT
int
main (int argc, char** argv)
{
//创建点云指针
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
//直接读取pcd文件到cloud中,并判断是否读取正确
if (pcl::io::loadPCDFile<pcl::PointXYZ> ("test_pcd.pcd", *cloud) == -1) //* load the file
{
PCL_ERROR ("Couldn't read file test_pcd.pcd \n");
return (-1);
}
//控制台输出点云宽高(无序点云为总数)
std::cout << "Loaded "
<< cloud->width * cloud->height
<< " data points from test_pcd.pcd with the following fields: "
<< std::endl;
//遍历点云输出坐标
for (const auto& point: *cloud)
std::cout << " " << point.x
<< " " << point.y
<< " " << point.z << std::endl;
return (0);
}
二.写入PCD文件
将点云写入PCD文件应用pcl::io::savePCDFileASCII (pcd文件, 点云对象)
函数
注意:写入的代码点云对象不是指针所以与读取代码略有不同,具体栈和堆创建区别自行查找C++基础
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
int
main (int argc, char** argv)
{
//创建栈上的点云对象
pcl::PointCloud<pcl::PointXYZ> cloud;
//为点云基础属性赋值;
cloud.width = 5;//总数
cloud.height = 1;
cloud.is_dense = false;//是否有限,即是否包含NAN或者INF
cloud.points.resize (cloud.width * cloud.height);//更新点云内部存储结构大小
//随机为每个点赋值
for (auto& point: cloud)
{
point.x = 1024 * rand () / (RAND_MAX + 1.0f);
point.y = 1024 * rand () / (RAND_MAX + 1.0f);
point.z = 1024 * rand () / (RAND_MAX + 1.0f);
}
//将cloud存入pcd文件中
pcl::io::savePCDFileASCII ("test_pcd.pcd", cloud);
std::cerr << "Saved " << cloud.size () << " data points to test_pcd.pcd." << std::endl;
//控制台输出
for (const auto& point: cloud)
std::cerr << " " << point.x << " " << point.y << " " << point.z << std::endl;
return (0);
}
三.合并点云数据
由于官方文档代码过长,大部分都是随机创建数据,只提取关键部分;
点云合并的官方文档
(小白提示:官方文档中合并的代码整个流程即对A和B两个点云的位置XYZ纵向合并 和对A点云的位置XYZ字段与B点云的法向量XYZ字段横向合并)
- 对于纵向合并,直接A+B即可
- 横向字段合并,采用
pcl::concatenateFields (cloud_a, n_cloud_b, p_n_cloud_c);