zoukankan      html  css  js  c++  java
  • 点云数据的存储格式

    //保存到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
  • 相关阅读:
    C/C++中的堆、栈和队列
    网卡工作状态检测
    Delphi 2007 的midas程序注册问题
    使用SQL语句备份与恢复数据库
    C/C++中的堆、栈和队列
    Delphi 2007 的midas程序注册问题
    如何使用VirtualBox的共享文件夹(转)
    如何使用VirtualBox的共享文件夹(转)
    C语言struct的使用
    printf常用格式
  • 原文地址:https://www.cnblogs.com/zhaobinyouth/p/6188705.html
Copyright © 2011-2022 走看看