读取点云文件
#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>intmain (int argc, char** argv) {pcl::PointCloud<pcl::PointXYZ> cloud;// Fill in the cloud datacloud.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>intmain (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 datacloud_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);}elsefor (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;elsefor (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 dataif (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;elsefor (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);
剩下的代码把内容显示出来