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之后的文件