PCL 读写OBJ格式文件(IO_OBJIO)

PCL专栏目录及须知-CSDN博客

注意:PCL中OBJ可读取为点云和mesh两种形式

1.OBJ格式

  • OBJ文件是一种3D模型文件。不包含动画、材质特性、贴图路径、动力学、粒子等信息。
  • OBJ文件主要支持多边形(Polygons)模型。虽然也支持曲线(Curves)、表面(Surfaces)、点组材质(Point Group Materials),但Maya导出的OBJ文件并不包括这些信息。
  • OBJ文件支持三个点以上的面,这一点很有用。很多其它的模型文件格式只支持三个点的面,所以导入Maya的模型经常被三角化了,这对于我们对模型进行再加工甚为不利。
  • OBJ文件支持法线和贴图坐标。在其它软件中调整好贴图后,贴图坐标信息可以存入OBJ文件中,这样文件导入Maya后只需指定一下贴图文件路径就行了,不需要再调整贴图坐标。

相关博客推荐:obj文件格式详解及示例

2.读取

读取obj文件包括两种方式。详见下方5.代码中内容。

一般读取使用如下方法:

    pcl::io::loadOBJFile("D:/code/csdn/data/bird/buba1.obj", *cloud_obj);       // 读取为点云格式
    pcl::io::loadOBJFile("D:/code/csdn/data/bird/buba1.obj", *cloud_obj_mesh);       // 读取为mesh格式

3.写入

OBJ文件可用如下两个函数写入,参数类型分别为pcl::TextureMesh &tex_mesh及pcl::PolygonMesh &mesh。

PCL_EXPORTS int saveOBJFile (const std::string &file_name,
                 const pcl::TextureMesh &tex_mesh,
                 unsigned precision = 5);

PCL_EXPORTS int saveOBJFile (const std::string &file_name,
                 const pcl::PolygonMesh &mesh,
                 unsigned precision = 5);

示例:

    pcl::PolygonMesh::Ptr cloud_obj_mesh(new pcl::PolygonMesh);

    /****************写入obj文件********************/
    pcl::io::saveOBJFile("D:/code/csdn/data/buba1_new.obj", *cloud_obj_mesh);                      // 写入obj文件

5.代码

#include <iostream>
#include <pcl/io/obj_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>

#define OBJ_LOAD_FUNC

int main()
{
    /****************读取OBJ文件********************/
    pcl::OBJReader* objReader = new pcl::OBJReader();     // obj对象
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_obj(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PolygonMesh::Ptr cloud_obj_mesh(new pcl::PolygonMesh);

#ifdef OBJ_LOAD_FUNC

    /****************方式一********************/
    pcl::io::loadOBJFile("D:/code/csdn/data/bird/buba1.obj", *cloud_obj);       // 读取为点云格式
    pcl::io::loadOBJFile("D:/code/csdn/data/bird/buba1.obj", *cloud_obj_mesh);       // 读取为mesh格式

#else

    /****************方式二********************/
   // 读取文件头
    pcl::PCLPointCloud2 cloud2_obj_header;             // 结果点云数据头信息
    Eigen::Vector4f origin_header;                     // 传感器采集原点(仅适用于>FILE_V7,如果不存在则为空)
    Eigen::Quaternionf orientation_header;             // 传感器采集方向(仅适用于>FILE-V7)
    int file_version_header;                           // 文件的file版本(file_V6或file_V7)
    int data_type_header;                              // 数据类型(二进制数据=1,obj=0等)
    unsigned int data_idx_header;                      // 文件中点云数据的偏移量

    objReader->readHeader("D:/code/csdn/data/bird/buba1.obj", cloud2_obj_header, origin_header, orientation_header, file_version_header, data_type_header, data_idx_header, 0);

    // 读取文件
    pcl::PCLPointCloud2 cloud2_obj;             // 结果点云数据
    Eigen::Vector4f origin;                     // 传感器采集原点(仅适用于>FILE_V7,如果不存在则为空)
    Eigen::Quaternionf orientation;             // 传感器采集方向(仅适用于>FILE-V7)
    int file_version;                           // 文件的file版本(file_V6或file_V7)

    objReader->read("D:/code/csdn/data/bird/buba1.obj", cloud2_obj, origin, orientation, file_version);
    pcl::fromPCLPointCloud2<pcl::PointXYZ>(cloud2_obj, *cloud_obj);         // 转换为pcl::point<pointT>形式

    // 打印
    std::cout << "传感器采集原点(仅适用于>FILE_V7,如果不存在则为空):" << origin_header << std::endl;
    std::cout << "传感器采集方向(仅适用于>FILE-V7):" << orientation_header << std::endl;
    std::cout << "文件的file版本(file_V6或file_V7):" << file_version_header << std::endl;
    std::cout << "数据类型(二进制数据=1,ascii=0等):" << data_type_header << std::endl;
    std::cout << "文件中点云数据的偏移量:" << data_idx_header << std::endl;

#endif // OBJ_LOAD_FUNC

    // 展示
    boost::shared_ptr<pcl::visualization::PCLVisualizer> view_raw(new pcl::visualization::PCLVisualizer("raw"));
    view_raw->addPointCloud(cloud_obj, "raw cloud");
    view_raw->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "raw cloud");

    boost::shared_ptr<pcl::visualization::PCLVisualizer> view_1(new pcl::visualization::PCLVisualizer("mesh"));
    view_1->addPolygonMesh(*cloud_obj_mesh, "mesh cloud");
    view_1->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "mesh cloud");

    while (!view_raw->wasStopped() || !view_1->wasStopped())
    {
        view_raw->spinOnce(100);
        view_1->spinOnce(100);
        boost::this_thread::sleep(boost::posix_time::microseconds(100000));
    }
}

6.结果展示

(1)使用windows文件预览:

(2)PCL读取为模型展示:

(3)PCL读取为点云展示:

(4)写入为OBJ之后的文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值