点云文件的操作
讀取點云文件
#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);剩下的代碼把內容顯示出來
總結
- 上一篇: 【OpenCV 例程200篇】88. 频
- 下一篇: 【课题总结】OpenCV 抠图项目实战(