pcl c++ 文件后缀名批处理修改 ply->pcd 走过的坑及问题
2016-04-20 15:04
886 查看
学习点云库PCL过程中,总会遇到数据格式转换,流行的3D数据基准库 大都是ply格式的,并且是二进制格式,ply在PCL库中是可以处理的,但是更好的做其他处理,我一般都先把ply转pcd,方便的以后处理,格式转为ascii的,这样就可以用txt ultraedit打开 其数据是可看到的。
<span style="background-color: rgb(255, 255, 255);">去年的时候 曾经做过 转过,但是当时由于没有备份,所以现在又折腾两天处理数据格式问题,太多的坑,太浪费时间了,所以今天 记录在案 程序及说明</span>
首先上一些网址 这些都是做研究 很官方 很有名的3D数据库 http://www.cs.washington.edu/node/4669
htp://rgbd-dataset.cs.washington.edu/
http://rgbd-dataset.cs.washington.edu/dataset/rgbd-scene-labeling/ http://staffhome.ecm.uwa.edu.au/~00053650/recognition.html http://www.vision.deis.unibo.it/keypoints3d/?page_id=2 http://staffhome.ecm.uwa.edu.au/~00053650/ http://graphics.stanford.edu/data/3Dscanrep/ http://www.vision.deis.unibo.it/research/78-cvlab/80-shot
ply 一般有两种格式 头文件处理VCGLIB生成 的ply 用简单的程序ply->pcd 就可以转化pcd,VTK 生成的 则 ply->vtk->pcd, 程序如下
ply 的数据 一般都是
点属性:xyzrgba
边属性:索引值
由于pcd的颜色编码不同,程序吧ply转出pcd后,颜色值四通道 变成一个值,以上三种转法,会把ply的rgba数据 转化 很大的一个数 几千万 真的,我当时也蒙了,难道说颜色丢失了 没有转换过了,但是想到去年的时候,确实颜色也转过来了,我就用显示pcl viewer 来看颜色是否转过来了
有个坑
显示转后后的pcd是否颜色也转过来,有个坑 就是
pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGBA> color(cloud);
PointCloudColorHandlerRGBField 一定不能写成 RGBAField,尽管pcd是PointXYZRGBA格式的,这样才能完全显示颜色 保真
转换代码已经知道,但是一个一个转 程序确实感觉臃肿,,用批处理,保证代码简洁。两种方法
第一种 stringstream 名字要整齐一致
第二种 把所有ply放到一个data文件下,在定义一个txt,存放个ply的相对路径,这种方法不对名字做要求,俺现在就用的这种
txt
<span style="background-color: rgb(255, 255, 255);">去年的时候 曾经做过 转过,但是当时由于没有备份,所以现在又折腾两天处理数据格式问题,太多的坑,太浪费时间了,所以今天 记录在案 程序及说明</span>
首先上一些网址 这些都是做研究 很官方 很有名的3D数据库 http://www.cs.washington.edu/node/4669
htp://rgbd-dataset.cs.washington.edu/
http://rgbd-dataset.cs.washington.edu/dataset/rgbd-scene-labeling/ http://staffhome.ecm.uwa.edu.au/~00053650/recognition.html http://www.vision.deis.unibo.it/keypoints3d/?page_id=2 http://staffhome.ecm.uwa.edu.au/~00053650/ http://graphics.stanford.edu/data/3Dscanrep/ http://www.vision.deis.unibo.it/research/78-cvlab/80-shot
ply 一般有两种格式 头文件处理VCGLIB生成 的ply 用简单的程序ply->pcd 就可以转化pcd,VTK 生成的 则 ply->vtk->pcd, 程序如下
</pre><pre code_snippet_id="1654405" snippet_file_name="blog_20160420_1_7281699" name="code" class="cpp">
/* 两种格式都能处理
//pcd文件显示 pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGBA>()); //pcl::io::loadPCDFile("model1.pcd",*cloud); //ply文件显示 pcl::PolygonMesh mesh; vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New(); pcl::io::loadPolygonFilePLY("mario/Scene1.ply", mesh); // ply另存vtk //pcl::io::saveVTKFile("temp.vtk", mesh); pcl::io::mesh2vtk(mesh, polydata); pcl::io::vtkPolyDataToPointCloud(polydata, *cloud); //两种存贮方式 pcd另存pcd pcl::PCDWriter pcdwriter; //pcdwriter.write<pcl::PointXYZRGBA>("save_ply2vtk2pcd.pcd", *cloud); pcl::io::savePCDFileASCII("mario/Scene11.pcd", *cloud); */ /*VCGLIB生成 的ply
pcl::PCLPointCloud2 clod; pcl::io::loadPLYFile("mario/Scene1.ply", clod); pcl::io::savePCDFile("mario/Scene111.pcd", clod); */
/*VCGLIB生成 的ply
pcl::PCLPointCloud2 clod; pcl::PLYReader reader; reader.read("mario/Scene1.ply", clod); pcl::PCDWriter writer; writer.writeASCII("mario/Scene1111.pcd", clod); writeBinary */
ply 的数据 一般都是
点属性:xyzrgba
边属性:索引值
由于pcd的颜色编码不同,程序吧ply转出pcd后,颜色值四通道 变成一个值,以上三种转法,会把ply的rgba数据 转化 很大的一个数 几千万 真的,我当时也蒙了,难道说颜色丢失了 没有转换过了,但是想到去年的时候,确实颜色也转过来了,我就用显示pcl viewer 来看颜色是否转过来了
有个坑
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGBA>()); pcl::io::loadPCDFile("mario/Scene1111.pcd", *cloud); boost::shared_ptr<pcl::visualization::PCLVisualizer> viewe(new pcl::visualization::PCLVisualizer("ss")); viewe->initCameraParameters(); viewe->setBackgroundColor(0.3,0.3,0.3); viewe->addCoordinateSystem(1.0f); pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGBA> color(cloud); viewe->addPointCloud<pcl::PointXYZRGBA>(cloud, color, "cloud"); viewe->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_FONT_SIZE, 3, "cloud"); while (!viewe->wasStopped()) { viewe->spinOnce(100); boost::this_thread::sleep(boost::posix_time::microseconds(100000)); }
显示转后后的pcd是否颜色也转过来,有个坑 就是
pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGBA> color(cloud);
PointCloudColorHandlerRGBField 一定不能写成 RGBAField,尽管pcd是PointXYZRGBA格式的,这样才能完全显示颜色 保真
转换代码已经知道,但是一个一个转 程序确实感觉臃肿,,用批处理,保证代码简洁。两种方法
第一种 stringstream 名字要整齐一致
stringstream ss_tou; ss_tou<<"E://datasets//SHOT//dataset4 kinect cvlab//3D models scenes//CVLab//xx//"; // 最后一定要zai加个 // for (int i = 1; i<24; i++) { stringstream ss; ss<<ss_tou.str()<<i<<".ply";
第二种 把所有ply放到一个data文件下,在定义一个txt,存放个ply的相对路径,这种方法不对名字做要求,俺现在就用的这种
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr clud(new pcl::PointCloud<pcl::PointXYZRGBA>()); //pcl::io::loadPCDFile("model1.pcd",*cloud); //修改后缀名 路径不变 std::string file = "standford/mario_object_templates.txt"; std::ifstream input(file); std::string ply_file, pcd_file; while (input.good()) //判断文件是否结束 { std::getline(input, ply_file); std::string::size_type pos = ply_file.rfind("ply"); // 双字符 if (ply_file.empty() || ply_file.at(0) =='#' ) continue; pcl::PolygonMesh mesh; vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New(); pcl::io::loadPolygonFilePLY(ply_file, mesh); pcl::io::mesh2vtk(mesh, polydata); pcl::io::vtkPolyDataToPointCloud(polydata, *clud); pcd_file = ply_file; if (pos != std::string::npos) //npos就是到头了 pcd_file.replace(pos, 3, "pcd"); // 双字符 pcl::io::savePCDFile(pcd_file, *clud); } input.close();
txt
相关文章推荐
- 深入解析C语言中函数指针的定义与使用
- C++STL库中string类的find()和findfirstof()函数比较
- C++中的左值和右值
- C语言03数组
- C语言中的函数指针基础学习教程
- C++自定义缓冲区streambuf
- 位运算在算法题中的使用(C++)
- 实例解析C++中类的成员函数指针
- Effective C++笔记(六):继承与面向对象设计
- c++文件操作std::ifstream std::string::find() 和 std::string::npos
- c++知识总结
- C++编程中的函数指针初步解析
- C语言02基础深入理解(二)
- C 数列计算问题
- C++中的c_str()函数用法
- Hypertable 简介 一个 C++ 的Bigtable开源实现
- C++ WINDOWS API 如何使用NMAKE和CL编译
- C++编写DLL的方法
- segmentation fault (core dumped) 调试
- C++ map关联容器删除元素