PCL PLY转PCD及批量处理

       学习点云库PCL过程中,总会遇到数据格式转换,流行的3D数据基准库 大都是ply格式的,并且是二进制格式,ply在PCL库中是可以处理的,但是更好的做其他处理,我一般都先把ply转pcd,方便的以后处理,格式转为ascii的,这样就可以用txt ultraedit打开  其数据是可看到的。

        ply 一般有两种格式 头文件处理VCGLIB生成 的ply 用简单的程序ply->pcd 就可以转化pcd,VTK 生成的 则 ply->vtk->pcd, 程序如下:

*  两种格式都能处理
		//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));

		}

有个坑 就是pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGBA> color(cloud);PointCloudColorHandlerRGBField 一定不能写成 RGBAField,尽管pcd是PointXYZRGBA格式的,这样才能完全显示颜色 保真

以上便是转换代码,下面是对所有PLY格式的文件进行批量处理的程序:

第一种 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();




  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值