现在开始C++巩固加上数据结构刷题加PCL库系统学习开始交替进行。感觉东西越学越多,忘得也越来越多,戒骄戒躁,持之以恒。
本文主要介绍PCL库的点云读入,拼接和保存的用法:
两点说明:
1、 在定义点云变量时,如下代码中有两种方法:
一种是指针型的(pcl::PointCloud<pcl::PointXYZ>::Ptr cloudPtr(new pcl::PointCloud<pcl::PointXYZ>))
一种是常规(pcl::PointCloud<pcl::PointXYZ> cloud)
两种定义方法在使用的时候有如下的转换关系:
cloudPtr = cloud.makeShared();
cloud = *cloudPtr;
但是在什么情况下,用哪一种定义方式更加合适,没有想到一个可实施的规范,欢迎大家补充;
2、 在新建点云时有一个变量:
cloud.is_dense = false;
相信很多人都写过,但是“is_dense”含义不一定明确。查询官网解释如下:
True if no points are invalid (e.g., have NaN or Inf values in any of their floating point fields).
#include<iostream>
#include<pcl/io/pcd_io.h>
#include<pcl/point_types.h>
template<typename T>
void show(T &cloud)
{
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;
}
std::cout << std::endl;
}
int main()
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ> cloud1;
pcl::PointCloud<pcl::PointXYZ> cloud2;
pcl::PointCloud<pcl::PointNormal> cloud3;
if(pcl::io::loadPCDFile<pcl::PointXYZ>("C:\\Users\\13427\\Desktop\\test.pcd",*cloud)==-1){
PCL_ERROR("couldn't find file!");
return -1;
}
cloud1.height = 1;
cloud1.width = 5;
cloud1.resize(cloud1.height*cloud1.width);
cloud1.is_dense = false;
for (size_t i = 0; i < cloud1.points.size(); i++) {
cloud1.points[i].x = rand() / (RAND_MAX + 1.0f);
cloud1.points[i].y = rand() / (RAND_MAX + 1.0f);
cloud1.points[i].z = rand() / (RAND_MAX + 1.0f);
}
std::cout << "cloud data: " << std::endl;
show(*cloud);
std::cout << "cloud1 data: " << std::endl;
show(cloud1);
//Merge two point clouds
std::cout << "cloud + cloud1 data: " << std::endl;
cloud2 = *cloud + cloud1;
show(cloud2);
pcl::io::savePCDFileASCII("C:\\Users\\13427\\Desktop\\test_concated.pcd", cloud2);
//concated two point clouds character
std::cout << "cloud + cloud1 data: " << std::endl;
pcl::concatenateFields(*cloud, cloud1, cloud3);
show(cloud3);
pcl::io::savePCDFileASCII("C:\\Users\\13427\\Desktop\\test_concated2.pcd", cloud3);
}