//保存到PCD文件
pcd格式的数据支持两种数据类型存储:ASSIC码和BinaryCompressed(二进制)。
1、pcl::io::savePCDFileBinaryCompressed("test_pcdc.pcd",cloud); //存储
2、 pcl::io::savePCDFileASCII ("test_pcd.pcd", cloud);
3、pcl::io::savePCDFile("pointcloud1.pcd", *cloud);(一般默认格式都是:ASSIC码的)
一个简单的存储例子
#include <iostream> //标准输入输出流 #include <pcl/io/pcd_io.h> //PCL的PCD格式文件的输入输出头文件 #include <pcl/point_types.h> //PCL对各种格式的点的支持头文件 int main (int argc, char** argv) { 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); } //保存到PCD文件 pcl::io::savePCDFileASCII ("test_pcd.pcd", cloud); //将点云保存到PCD文件中 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); }
上面是直接存储数据的,这个是读取图片中的数据并保存pcd
#include <iostream> //标准输入/输出 #include <boost/thread/thread.hpp> //多线程 #include <pcl/common/common_headers.h> #include <pcl/range_image/range_image.h> //深度图有关头文件 #include <pcl/io/pcd_io.h> //pcd文件输入/输出 #include <pcl/visualization/range_image_visualizer.h> //深度图可视化 #include <pcl/visualization/pcl_visualizer.h> #include <pcl/console/parse.h> //命令行参数解析 #include <pcl/visualization/cloud_viewer.h> //#include " distance.h" typedef pcl::PointXYZ PointType; // C++ 标准库 #include <iostream> #include <string> using namespace std; // OpenCV 库 #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> // PCL 库 #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> // 定义点云类型 typedef pcl::PointXYZRGBA PointT; typedef pcl::PointCloud<PointT> PointCloud; // 相机内参 const double camera_factor = 1000; const double camera_cx = 325.5; const double camera_cy = 253.5; const double camera_fx = 518.0; const double camera_fy = 519.0; // 主函数 int main(int argc, char** argv) { // 读取./data/rgb.png和./data/depth.png,并转化为点云 // 图像矩阵 cv::Mat rgb, depth; // 使用cv::imread()来读取图像 // API: http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html?highlight=imread#cv2.imread rgb = cv::imread("rgb.png"); // rgb 图像是8UC3的彩色图像 // depth 是16UC1的单通道图像,注意flags设置-1,表示读取原始数据不做任何修改 depth = cv::imread("depth.png", -1); // 点云变量 // 使用智能指针,创建一个空点云。这种指针用完会自动释放。 PointCloud::Ptr cloud(new PointCloud); // 遍历深度图 for (int m = 0; m < depth.rows; m++) for (int n = 0; n < depth.cols; n++) { // 获取深度图中(m,n)处的值 ushort d = depth.ptr<ushort>(m)[n]; // d 可能没有值,若如此,跳过此点 if (d == 0) continue; // d 存在值,则向点云增加一个点 PointT p; // 计算这个点的空间坐标 p.z = double(d) / camera_factor; p.x = (n - camera_cx) * p.z / camera_fx; p.y = (m - camera_cy) * p.z / camera_fy; // 从rgb图像中获取它的颜色 // rgb是三通道的BGR格式图,所以按下面的顺序获取颜色 p.b = rgb.ptr<uchar>(m)[n * 3]; p.g = rgb.ptr<uchar>(m)[n * 3 + 1]; p.r = rgb.ptr<uchar>(m)[n * 3 + 2]; // 把p加入到点云中 cloud->points.push_back(p); } // 设置并保存点云 cloud->height = 1; cloud->width = cloud->points.size(); cout << "point cloud size = " << cloud->points.size() << endl; cloud->is_dense = false; pcl::io::savePCDFile("pointcloud.pcd", *cloud); // 清除数据并退出 cloud->points.clear(); cout << "Point cloud saved." << endl; //可视化 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// return 0; }
所用的图片是rgb depth图片可以到
http://www.cnblogs.com/gaoxiang12/p/4652478.html#3572953下载 代码也是从博士那里转的
参考:
http://www.cnblogs.com/gaoxiang12/p/4652478.html#3572953