分为:
- 写入数据
- 读出数据
- 点云连接
- 获取传感器深度
1. 写入数据
pcl::io::savePCDFileASCII("../test_pcd.pcd", *cloud);
实验代码
/*
* @Description: 写入数据
* @Author: HCQ
* @Company(School): UCAS
* @Email: 1756260160@qq.com
* @Date: 2020-10-09 10:42:31
* @LastEditTime: 2020-10-27 16:24:56
* @FilePath: /pcl-learning/08IO输入输出/1write_pcd/write_pcd.cpp
*/
#include <iostream> //标准C++库中的输入输出的头文件
#include <pcl/io/pcd_io.h> //PCD读写类相关的头文件
#include <pcl/point_types.h> //PCL中支持的点类型的头文件
int main(int argc, char **argv)
{
//实例化的模板类PointCloud 每一个点的类型都设置为pcl::PointXYZ
/*************************************************
点PointXYZ类型对应的数据结构
Structure PointXYZ{
float x;
float y;
float z;
};
**************************************************/
pcl::PointCloud<pcl::PointXYZ> cloud;
// 创建点云 并设置适当的参数(width height is_dense)
cloud.width = 5;
cloud.height = 1;
cloud.is_dense = false; //不是稠密型的
cloud.points.resize(cloud.width * cloud.height); //点云总数大小
//用随机数的值填充PointCloud点云对象
for (size_t i = 0; i < cloud.points.size(); ++i)
{
cloud.points[i].x = 1024 * rand() / (RAND_MAX + 1.0f);
cloud.points[i].y = 1024 * rand() / (RAND_MAX + 1.0f);
cloud.points[i].z = 1024 * rand() / (RAND_MAX + 1.0f);
}
//把PointCloud对象数据存储在 test_pcd.pcd文件中
pcl::io::savePCDFileASCII("../test_pcd.pcd", *cloud);
//打印输出存储的点云数据
std::cerr << "Saved " << cloud.points.size() << " data points to test_pcd.pcd." << std::endl;
for (size_t i = 0; i < cloud.points.size(); ++i)
std::cerr << " " << cloud.points[i].x << " " << cloud.points[i].y << " " << cloud.points[i].z << std::endl;
return (0);
}
2. 读出数据
//打开点云文件
if (pcl::io::loadPCDFile<pcl::PointXYZ>("../test_pcd.pcd", *cloud) == -1)
{
PCL_ERROR("Couldn't read file test_pcd.pcd \n");
return (-1);
}
/*
* @Description: 读取pcd文件:https://www.cnblogs.com/li-yao7758258/p/6435568.html
* @Author: HCQ
* @Company(School): UCAS
* @Email: 1756260160@qq.com
* @Date: 2020-10-09 12:56:02
* @LastEditTime: 2020-10-27 16:27:55
* @FilePath: /pcl-learning/08IO输入输出/2read_pcd/read_pcd.cpp
*/
#include <iostream> //标准C++库中的输入输出的头文件
#include <pcl/io/pcd_io.h> //PCD读写类相关的头文件
#include <pcl/point_types.h> //PCL中支持的点类型的头文件
int main(int argc, char **argv)
{
//创建一个PointCloud<pcl::PointXYZ> boost共享指针并进行实例化
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
//打开点云文件
if (pcl::io::loadPCDFile<pcl::PointXYZ>("../test_pcd.pcd", *cloud) == -1)
{
PCL_ERROR("Couldn't read file test_pcd.pcd \n");
return (-1);
}
//默认就是而二进制块读取转换为模块化的PointCLoud格式里pcl::PointXYZ作为点类型 然后打印出来
std::cout << "Loaded "
<< cloud->width * cloud->height // 宽*高
<< " data points from test_pcd.pcd with the following fields: "
<< std::endl;
for (size_t i = 0; i < cloud->points.size(); ++i)
std::cout << " " << cloud->points[i].x
<< " " << cloud->points[i].y
<< " " << cloud->points[i].z << std::endl;
return (0);
}
3. 点云连接
连接分为两种:
- 点云连接concatenate points (多个点云拼到一起)
-
cloud_c += cloud_b; //把cloud_a和cloud_b连接一起创建cloud_c 后输出
- 字段连接concatenate fields (坐标和rgb值拼到一起)
-
//连接字段 把cloud_a和 n_cloud_b字段连接 一起创建 p_n_cloud_c) pcl::concatenateFields(cloud_a, n_cloud_b, p_n_cloud_c);
点云连接和字段间连接的区别
- 字段连接是在行的基础后连接
- 点云连接是在列的下方连接,
- 最重要的就是要考虑维度问题,同时每个点云都有XYZ三个数据值
4. 获取传感器深度
获取传感器的深度信息可以使用OpenNI Grabber类