點雲數據的存儲格式


//保存到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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM