从PCD文件中读取点云
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
int main()
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud< pcl::PointXYZ>); //共享指针
if (pcl::io::loadPCDFile<pcl::PointXYZ>("mydata.pcd", *cloud) == -1) //打开点云文件
{
PCL_ERROR("Couldn't read file mydata.pcd\n");
return 0;
}
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;
}
运行结果
向PCD文件中写入点云数据
int main()
{
pcl::PointCloud<pcl::PointXYZ> cloud;
cloud.width = 5;
cloud.height = 1;
cloud.is_dense = false;
cloud.points.resize(cloud.width * cloud.height);
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);
}
pcl::io::savePCDFileASCII("save_data.pcd", cloud);
return 0;
}
保存的点云文件
点云连接
两个点云数据连接
int main()
{
pcl::PointCloud<pcl::PointXYZ> cloud_a;
pcl::PointCloud<pcl::PointXYZ> cloud_b;
pcl::PointCloud<pcl::PointXYZ> cloud_c;
cloud_a.width = 3;
cloud_b.width = 2;
cloud_a.height = cloud_b.height = 1;
cloud_a.is_dense = cloud_b.is_dense = false;
cloud_a.points.resize(cloud_a.width * cloud_a.height);
cloud_b.points.resize(cloud_b.width * cloud_b.height);
for (size_t i = 0; i < cloud_a.points.size(); i++)
{
cloud_a.points[i].x = 1024 * rand() / (RAND_MAX + 1.0f);
cloud_a.points[i].y = 1024 * rand() / (RAND_MAX + 1.0f);
cloud_a.points[i].z = 1024 * rand() / (RAND_MAX + 1.0f);
}
for (size_t i = 0; i < cloud_b.points.size(); i++)
{
cloud_b.points[i].x = 1024 * rand() / (RAND_MAX + 1.0f);
cloud_b.points[i].y = 1024 * rand() / (RAND_MAX + 1.0f);
cloud_b.points[i].z = 1024 * rand() / (RAND_MAX + 1.0f);
}
cloud_c = cloud_a + cloud_b;
std::cerr << "Cloud_A" << std::endl;
for (size_t i = 0; i < cloud_a.points.size(); i++)
{
std::cout << " " << cloud_a.points[i].x << " " << cloud_a.points[i].y << " " << cloud_a.points[i].z << std::endl;
}
std::cerr << "Cloud_B" << std::endl;
for (size_t i = 0; i < cloud_b.points.size(); i++)
{
std::cout << " " << cloud_b.points[i].x << " " << cloud_b.points[i].y << " " << cloud_b.points[i].z << std::endl;
}
std::cerr << "Cloud_C" << std::endl;
for (size_t i = 0; i < cloud_c.points.size(); i++)
{
std::cout << " " << cloud_c.points[i].x << " " << cloud_c.points[i].y << " " << cloud_c.points[i].z << std::endl;
}
}
运行结果·
两个点云数据连接
int main()
{
pcl::PointCloud<pcl::PointXYZ> cloud_a;
pcl::PointCloud<pcl::Normal> cloud_b;
pcl::PointCloud<pcl::PointNormal> cloud_c;
cloud_a.width = 3;
cloud_b.width = 3;
cloud_a.height = cloud_b.height = 1;
cloud_a.is_dense = cloud_b.is_dense = false;
cloud_a.points.resize(cloud_a.width * cloud_a.height);
cloud_b.points.resize(cloud_b.width * cloud_b.height);
for (size_t i = 0; i < cloud_a.points.size(); i++)
{
cloud_a.points[i].x = 1024 * rand() / (RAND_MAX + 1.0f);
cloud_a.points[i].y = 1024 * rand() / (RAND_MAX + 1.0f);
cloud_a.points[i].z = 1024 * rand() / (RAND_MAX + 1.0f);
}
for (size_t i = 0; i < cloud_b.points.size(); i++)
{
cloud_b.points[i].normal[0] = 1024 * rand() / (RAND_MAX + 1.0f);
cloud_b.points[i].normal[1] = 1024 * rand() / (RAND_MAX + 1.0f);
cloud_b.points[i].normal[2] = 1024 * rand() / (RAND_MAX + 1.0f);
}
pcl::concatenateFields(cloud_a, cloud_b, cloud_c);
std::cerr << "Cloud_A" << std::endl;
for (size_t i = 0; i < cloud_a.points.size(); i++)
{
std::cout << " " << cloud_a.points[i].x << " " << cloud_a.points[i].y << " " << cloud_a.points[i].z << std::endl;
}
std::cerr << "Cloud_B" << std::endl;
for (size_t i = 0; i < cloud_b.points.size(); i++)
{
std::cout << " " << cloud_b.points[i].normal[0] << " " << cloud_b.points[i].normal[1] << " " << cloud_b.points[2].normal[0] << std::endl;
}
std::cerr << "Cloud_C" << std::endl;
for (size_t i = 0; i < cloud_c.points.size(); i++)
{
std::cout << " " << cloud_c.points[i].x << " " << cloud_c.points[i].y << " " << cloud_c.points[i].z <<
" " << cloud_c.points[i].normal[0] << " " << cloud_c.points[i].normal[1] << " " << cloud_c.points[i].normal[2] << std::endl;
}
}
运行结果