从PCD文件中写入和读取点云数据

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chuquanchang1051/article/details/79172433

我的编译环境是pcl1.8.0+vs2013+win10系统。
安利:这真的是一个非常不错的网址,对于学习PCL与kienct 实现三维重建。可惜需要翻墙。。。。
(http://robotica.unileon.es/index.php/PhD-3D-Object-Tracking)
(1).写入点云数据

#include <iostream>              //标准C++库中的输入输出的头文件
#include <pcl/io/pcd_io.h>           //PCD读写类相关的头文件
#include <pcl/point_types.h>      //PCL中支持的点类型的头文件

int
main(int argc, char** argv)
{
    //实例化的模板类PointCloud  每一个点的类型都设置为pcl::PointXYZ
    /*************************************************
    点PointXYZ类型对应的数据结构
    Structure PointXYZ{
    float x;
    float y;
    float z;
    };
    **************************************************/
    pcl::PointCloud<pcl::PointXYZ> cloud;

    // 创建点云  并设置适当的参数(width height is_dense)
    cloud.width = 5;
    cloud.height = 1;
    cloud.is_dense = false;  //不是稠密型的
    cloud.points.resize(cloud.width * cloud.height);  //点云总数大小
    //用随机数的值填充PointCloud点云对象 
    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);
    }
    //把PointCloud对象数据存储在 test_pcd.pcd文件中
    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;
    getchar();
    return (0);
}

得到的结果:
这里写图片描述
在自己程序下面可得到test_pcd.pcd图片,
这里写图片描述
(2).读取点云数据


 #include <iostream>              //标准C++库中的输入输出的头文件
 #include <pcl/io/pcd_io.h>       //PCD读写类相关的头文件
 #include <pcl/point_types.h>     //PCL中支持的点类型的头文件

 int
 main(int argc, char** argv)
 {
    //创建一个PointCloud<pcl::PointXYZ>    boost共享指针并进行实例化
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);

    //打开点云文件
    if (pcl::io::loadPCDFile<pcl::PointXYZ>("test_pcd.pcd", *cloud) == -1)
    {
        PCL_ERROR("Couldn't read file test_pcd.pcd \n");
        return (-1);
    }
    //默认就是而二进制块读取转换为模块化的PointCLoud格式里pcl::PointXYZ作为点类型  然后打印出来
    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;
    getchar();
    return (0);
 }

得到的结果

这里写图片描述
终于迈出第一步。

猜你喜欢

转载自blog.csdn.net/chuquanchang1051/article/details/79172433
今日推荐