读取点云文件
#include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> int main (int argc, char** argv) { pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>); 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 (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); }
我们也可以读取一个PCLPointCloud2 blob,因为点云的动态特性,我们更愿意把它们当做blob(二进制大文件)来读取,然后把它们转换成我们想用的。
pcl::PCLPointCloud2 cloud_blob; pcl::io::loadPCDFile ("test_pcd.pcd", cloud_blob); pcl::fromPCLPointCloud2 (cloud_blob, *cloud); //* convert from pcl/PCLPointCloud2 to pcl::Po
下面是pcl文件的写入
#include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> int main (int argc, char** argv) { pcl::PointCloud<pcl::PointXYZ> cloud; // Fill in the cloud data 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 ("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); }
点云连接
对于两个点云连接,有约束那就是点云的域的数量和类型必须相等。对于不同域的点云连接,约束是每个点云数据集里面点的数量要相等。
#include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> int main (int argc, char** argv) { if (argc != 2) { std::cerr << "please specify command line arg '-f' or '-p'" << std::endl; exit(0); } pcl::PointCloud<pcl::PointXYZ> cloud_a, cloud_b, cloud_c; pcl::PointCloud<pcl::Normal> n_cloud_b; pcl::PointCloud<pcl::PointNormal> p_n_cloud_c; // Fill in the cloud data cloud_a.width = 5; cloud_a.height = cloud_b.height = n_cloud_b.height = 1; cloud_a.points.resize (cloud_a.width * cloud_a.height); if (strcmp(argv[1], "-p") == 0) { cloud_b.width = 3; cloud_b.points.resize (cloud_b.width * cloud_b.height); } else{ n_cloud_b.width = 5; n_cloud_b.points.resize (n_cloud_b.width * n_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); } if (strcmp(argv[1], "-p") == 0) 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); } else for (size_t i = 0; i < n_cloud_b.points.size (); ++i) { n_cloud_b.points[i].normal[0] = 1024 * rand () / (RAND_MAX + 1.0f); n_cloud_b.points[i].normal[1] = 1024 * rand () / (RAND_MAX + 1.0f); n_cloud_b.points[i].normal[2] = 1024 * rand () / (RAND_MAX + 1.0f); } std::cerr << "Cloud A: " << std::endl; for (size_t i = 0; i < cloud_a.points.size (); ++i) std::cerr << " " << cloud_a.points[i].x << " " << cloud_a.points[i].y << " " << cloud_a.points[i].z << std::endl; std::cerr << "Cloud B: " << std::endl; if (strcmp(argv[1], "-p") == 0) for (size_t i = 0; i < cloud_b.points.size (); ++i) std::cerr << " " << cloud_b.points[i].x << " " << cloud_b.points[i].y << " " << cloud_b.points[i].z << std::endl; else for (size_t i = 0; i < n_cloud_b.points.size (); ++i) std::cerr << " " << n_cloud_b.points[i].normal[0] << " " << n_cloud_b.points[i].normal[1] << " " << n_cloud_b.points[i].normal[2] << std::endl; // Copy the point cloud data if (strcmp(argv[1], "-p") == 0) { cloud_c = cloud_a; cloud_c += cloud_b; std::cerr << "Cloud C: " << std::endl; for (size_t i = 0; i < cloud_c.points.size (); ++i) std::cerr << " " << cloud_c.points[i].x << " " << cloud_c.points[i].y << " " << cloud_c.points[i].z << " " << std::endl; } else { pcl::concatenateFields (cloud_a, n_cloud_b, p_n_cloud_c); std::cerr << "Cloud C: " << std::endl; for (size_t i = 0; i < p_n_cloud_c.points.size (); ++i) std::cerr << " " << p_n_cloud_c.points[i].x << " " << p_n_cloud_c.points[i].y << " " << p_n_cloud_c.points[i].z << " " << p_n_cloud_c.points[i].normal[0] << " " << p_n_cloud_c.points[i].normal[1] << " " << p_n_cloud_c.points[i].normal[2] << std::endl; } return (0); }
我们定义了5个点云用来连接:3个输入的(cloud_a,cloud_b,n_cloud_b),两个输出(cloud_c,p_cloud_c)。下一步我们把2个输入的点云给填满。(对于点来说,cloud_a,cloud_b对于域来说cloud_a,n_cloud_b).
接下去:
std::cerr << "Cloud A: " << std::endl; for (size_t i = 0; i < cloud_a.points.size (); ++i) std::cerr << " " << cloud_a.points[i].x << " " << cloud_a.points[i].y << " " << cloud_a.points[i].z << std::endl; std::cerr << "Cloud B: " << std::endl; if (strcmp(argv[1], "-p") == 0) for (size_t i = 0; i < cloud_b.points.size (); ++i) std::cerr << " " << cloud_b.points[i].x << " " << cloud_b.points[i].y << " " << cloud_b.points[i].z << std::endl; else for (size_t i = 0; i < n_cloud_b.points.size (); ++i) std::cerr << " " << n_cloud_b.points[i].normal[0] << " " << n_cloud_b.points[i].normal[1] << " " << n_cloud_b.points[i].normal[2] << std::endl;
我们显示了cloud_a和cloud_b或者n_cloud_b
把两个点云相连接
cloud_c = cloud_a;
cloud_c += cloud_b;
把点云的域相连接
pcl::concatenateFields (cloud_a, n_cloud_b, p_n_cloud_c);
剩下的代码把内容显示出来