点云保存off格式

方法1,meshlab,export mesh as

选择off格式。

方法2:obj转off

def obj2off(objpath, offpath):
    '''
    将obj文件转换为off文件
    :param objpath: .obj文件的路径
    :param offpath: .off文件的路径的保存地址
    :return: 无
    '''
    line = ""

    vset = []
    fset = []
    with open(objpath,'r') as f:
        lines = f.readlines()
    p = re.compile(r'/+')
    space = re.compile(r' +')

    for line in lines:
        #拿到obj文件中一行,作为一个字符串
        tailMark = " "
        line = line+tailMark
        if line[0]!='v' and line[0]!='f' :
            continue

        parameters = space.split(line.strip())
        if parameters[0] == "v":   #如果是顶点的话
                Point = []
                Point.append(eval( parameters[1]) )
                Point.append(eval( parameters[2]) )
                Point.append(eval( parameters[3]) )
                vset.append(Point)

        elif parameters[0] == "f":   #如果是面的话,存放顶点的索引
                vIndexSets = []          #临时存放点的集合
                for i in range(1,len(parameters) ):
                    x = parameters[i]
                    ans = p.split(x)[0]
                    index = eval(ans)
                    index -= 1          #因为顶点索引在obj文件中是从1开始的,而我们存放的顶点是从0开始的,因此要减1
                    vIndexSets.append(index)

                fset.append(vIndexSets)

    with open(offpath, 'w') as out:
        out = open(offpath, 'w')
        out.write("OFF\n")
        out.write(str(vset.__len__()) + " " + str(fset.__len__()) + " 0\n")
        for j in range(len(vset)):
            out.write(str(vset[j][0]) + " " + str(vset[j][1]) + " " + str(vset[j][2]) + "\n")

        for i in range(len(fset)):
            s = str(len( fset[i] ))
            for j in range( len( fset[i] ) ):
                s = s+ " "+ str(fset[i][j])
            s += "\n"
            out.write(s)

    print("{} 转换成 {} 成功!".format( p.split(objpath)[-1], p.split(offpath)[-1] ))

stl转off格式: 

import os
import re  # 正则表达式
import time

start = time.clock()  # 记录程序开始时间
with open('bunny.stl', 'r') as infile:
    content = infile.read()  # 将所有stl数据读到content中
reg = 'vertex (.*?)\n'  # 正则
vertexs = re.findall(reg, content)  # 保存所有在'vertexs'和回车之间的数据
print("未去重前的点个数:", len(vertexs))
s = sorted(set(vertexs), key=lambda x: (x))  # 排序,去除重复点
print("去除重复点后点个数:", len(s))
dic = {}
n = 0
for each in s:  # 给字典中每个点添加键值
    dic[each] = n
    n = n + 1
outfile = open('bunny.off', 'w')  # 打开保存文件
outfile.write('OFF' + '\n' + str(len(s)) + ' ' + str(len(vertexs) / 3) + ' ' + str(0) + '\n')  # off文件开头
for each in s:  # 保存所有的顶点
    outfile.write(each + '\n')
k = 0
for f in vertexs:  # 保存所有的面,每个面是三个点的键值
    if k % 3 == 0:
        outfile.write(str(3))
    outfile.write(' ' + str(dic[f]))
    if k % 3 == 2:
        outfile.write('\n')
    k = k + 1
outfile.close()
end = time.clock()
print("程序运行时间:%.03f" % (end - start))
os.system("pause")

1、Assimp
    Open Asset Import是一个库,用于将各种3d文件格式加载为共享的内存格式。它支持40多种用于导入的文件格式和越来越多的用于导出的文件格式选择,使用人数多。

支持导入的格式:3DS、3MF、DAE/Collada、DXF、FBX、GLTF、STP、STL、PLY   

支持导出的格式:DAE (Collada)、STL、OBJ、PLY、JSON、STEP
GitHub地址链接:https://github.com/assimp/assimp 
2、Meshlab
      Meshlab:是一个开源、可移植和可扩展的三维几何处理系统,主要用于交互处理和非结构化编辑三维三角形网格。

支持导入的格式:PLY, STL, OBJ, 3DS, COLLADA, PTX, V3D, PTS, APTS, XYZ, GTS, TRI, ASC, X3D, X3DV, VRML, ALN

导出: PLY, STL, OFF, OBJ, 3DS, COLLADA, VRML, DXF, GTS, U3D, IDTF, X3D

Meshlab不支持fbx和gltf格式,且在转换过程无材质等信息。
地址链接:https://github.com/cnr-isti-vclab/meshlab
3、gltf官网也提供了些转换工具 https://www.khronos.org/gltf/ 

该网址提供了开源的转换工具,可将COLLADA,FBX和OBJ转换为gltf格式。在此附上github项目地址

obj2gltf:https://github.com/CesiumGS/obj2gltf 

dae2gltf:https://github.com/KhronosGroup/COLLADA2GLTF
fbx2gltf: https://github.com/facebookincubator/FBX2glTF
————————————————
版权声明:本文为CSDN博主「wish_jk」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Angel_fallen/article/details/106059317

你可能感兴趣的:(3D视觉)