文本形式读写三维重建中的mesh网格模型数据

pcl中的mesh网格数据适合保存于obj文件中,但是由于obj不同于pcd、ply文件储存格式,obj没有二进制形式的储存格式,所以有时候为了方便数据的读取,选择使用文本读写的形式进行存储,反而更加方便。

1、将mesh数据写入到obj文件

void writeOBJzxr(pcl::Mesh& mesh, string filename){
	FILE* f;
	f = fopen(filename.c_str(), "w");
    pcl::PointCloud tempCloud;
    pcl::fromPointCloud2(mesh.cloud,tempCloud);//polygonMesh中的cloud是PointCloud2类型的无法直接读取,所以这里进行转换
	int numf = mesh.polygons.size(), numv = mesh.cloud.data.size();
	fprintf(f, "# faces %d, vetices %d \n", numf, numv);
	for (int i = 0; i < numv; i++){
		fprintf(f, "v %f %f %f\n", tempCloud.points[i].x, tempCloud.points[i].y, tempCloud.points[i].z);
	}
	for (int i = 0; i < numf; i++){
		fprintf(f, "f %d %d %d\n", mesh.polygons[1].vertices[0] + 1,mesh.polygons[1].vertices[1]+ 1, mesh.polygons[1].vertices[2] + 1);
	}
	fclose(f);
    return;
}

2、从obj文件中读取mesh数据

using namespace pcl;
void readOBJzxr( string filename, Mesh& mesh){
	FILE* f;
	f = fopen(file2.c_str(), "r");
	pcl::PointCloud tempCloud;
	char buf[256];
	while (1)
	{
		if (fgets(buf, 256, f) == NULL) break;
		if (buf[0] == '\n' | buf[0] == '#') continue;
		char* p;
		p = buf;
		if (p[0] == 'v'){
			pcl::PointXYZ tp;
			sscanf(p, "v%f%f%f", &tp.x, &tp.y, &tp.z);
			tempCloud.points.push_back(tp);
		}
		else{
			if (p[0] == 'f'){
				pcl::Vertices ttri;
				ttri.vertices.resize(3);
				sscanf(p, "f%d%d%d", &ttri.vertices[0], &ttri.vertices[1], &ttri.vertices[2]);//obj文件中下标从1开始,c++中的数组或者向量下标从0
				//Triangle ttri0;
				//sscanf(p, "f%d/%d/%d/%d/%d/%d/", &ttri.P0Index, &ttri0.P0Index, &ttri.P1Index, &ttri0.P1Index, &ttri.P2Index, &ttri0.P2Index);
				ttri.vertices[0] -= 1, ttri.vertices[1] -= 1, ttri.vertices[2] -= 1;
				mesh.polygons.push_back(ttri);
				
				
			}
		}

	}
	pcl::toPCLPointCloud2(tempCloud, mesh.cloud);
    return;
}

 

你可能感兴趣的:(三维重建之基本知识)