当前位置: 首页 > news >正文

点云PLY、PCD、OBJ、TXT文件互相转换

一、代码

本文点云文件的转换只针对点云的顶点信息,它们之间的相互转换关系一共12种。这份代码没有用PCL,不需要配置PCL环境也可以使用

Python

import reclass FormatTrans:def __init__(self):pass@staticmethoddef writePLYHeader(ply_file, num_points):ply_file.write("ply\n")ply_file.write("format ascii 1.0\n")ply_file.write("element vertex " + str(num_points) + "\n")ply_file.write("property float x\n")ply_file.write("property float y\n")ply_file.write("property float z\n")ply_file.write("end_header\n")@staticmethoddef writePCDHeader(pcdFile, vertexCount):pcdFile.write("# .PCD v0.7 - Point Cloud Data file format\n")pcdFile.write("VERSION 0.7\n")pcdFile.write("FIELDS x y z\n")pcdFile.write("SIZE 4 4 4\n")pcdFile.write("TYPE F F F\n")pcdFile.write("COUNT 1 1 1\n")pcdFile.write("WIDTH " + str(vertexCount) + "\n")pcdFile.write("HEIGHT 1\n")pcdFile.write("VIEWPOINT 0 0 0 1 0 0 0\n")pcdFile.write("POINTS " + str(vertexCount) + "\n")pcdFile.write("DATA ascii\n")@staticmethoddef txtToply(txtpath, plypath):txtfile = open(txtpath, "r")plyfile = open(plypath, "w")txtNum = []num_points = int(txtfile.readline())while True:line = txtfile.readline()if not line:breakline = line[:-1]lineList = line.split(" ")txtNum.append(lineList)txtfile.close()FormatTrans.writePLYHeader(plyfile, num_points)for i in range(num_points):content = txtNum[i][0] + " " + txtNum[i][1] + " " + txtNum[i][2] + "\n"plyfile.write(content)plyfile.close()@staticmethoddef txtTopcd(txtpath, pcdpath):txtfile = open(txtpath, "r")pcdfile = open(pcdpath, "w")txtNum = []num_points = int(txtfile.readline())while True:line = txtfile.readline()if not line:breakline = line[:-1]lineList = line.split(" ")txtNum.append(lineList)txtfile.close()FormatTrans.writePCDHeader(pcdfile, num_points)for i in range(num_points):content = txtNum[i][0] + " " + txtNum[i][1] + " " + txtNum[i][2] + "\n"pcdfile.write(content)pcdfile.close()@staticmethoddef txtToobj(txtpath, objpath):txtfile = open(txtpath, "r")objfile = open(objpath, "w")txtNum = []num_points = int(txtfile.readline())while True:line = txtfile.readline()if not line:breakline = line[:-1]lineList = line.split(" ")txtNum.append(lineList)txtfile.close()for i in range(num_points):content = "v " + txtNum[i][0] + " " + txtNum[i][1] + " " + txtNum[i][2] + "\n"objfile.write(content)objfile.close()@staticmethoddef plyTotxt(plypath, txtpath):txtfile = open(txtpath, "w")plyfile = open(plypath, "r")flag = 0plyNum = []while True:line = plyfile.readline()if not line:breakif flag == 1:line = line[:-1]lineList = line.split(" ")plyNum.append(lineList)if flag == 0 and re.findall("end_header", line):flag = 1plyfile.close()num_points = len(plyNum)for i in range(num_points):content = plyNum[i][0] + " " + plyNum[i][1] + " " + plyNum[i][2] + "\n"txtfile.write(content)txtfile.close()@staticmethoddef pcdTotxt(pcdpath, txtpath):txtfile = open(txtpath, "w")pcdfile = open(pcdpath, "r")flag = 0pcdNum = []while True:line = pcdfile.readline()if not line:breakif flag == 1:line = line[:-1]lineList = line.split(" ")pcdNum.append(lineList)if flag == 0 and re.findall("DATA ascii", line):flag = 1pcdfile.close()num_points = len(pcdNum)for i in range(num_points):content = pcdNum[i][0] + " " + pcdNum[i][1] + " " + pcdNum[i][2] + "\n"txtfile.write(content)txtfile.close()@staticmethoddef objTotxt(objpath, txtpath):txtfile = open(txtpath, "w")objfile = open(objpath, "r")objNum = []while True:line = objfile.readline()if line.startswith("#"):continueif not line:breakline = line[2:-1]lineList = line.split(" ")objNum.append(lineList)objfile.close()num_points = len(objNum)for i in range(num_points):content = objNum[i][0] + " " + objNum[i][1] + " " + objNum[i][2] + "\n"txtfile.write(content)txtfile.close()@staticmethoddef plyTopcd(plypath, pcdpath):pcdfile = open(pcdpath, "w")plyfile = open(plypath, "r")flag = 0plyNum = []while True:line = plyfile.readline()if not line:breakif flag == 1:line = line[:-1]lineList = line.split(" ")plyNum.append(lineList)if flag == 0 and re.findall("end_header", line):flag = 1plyfile.close()num_points = len(plyNum)FormatTrans.writePCDHeader(pcdfile, num_points)for i in range(num_points):content = plyNum[i][0] + " " + plyNum[i][1] + " " + plyNum[i][2] + "\n"pcdfile.write(content)pcdfile.close()@staticmethoddef plyToobj(plypath, objpath):objfile = open(objpath, "w")plyfile = open(plypath, "r")flag = 0plyNum = []while True:line = plyfile.readline()if not line:breakif flag == 1:line = line[:-1]lineList = line.split(" ")plyNum.append(lineList)if flag == 0 and re.findall("end_header", line):flag = 1plyfile.close()num_points = len(plyNum)for i in range(num_points):content = "v " + plyNum[i][0] + " " + plyNum[i][1] + " " + plyNum[i][2] + "\n"objfile.write(content)objfile.close()@staticmethoddef pcdToply(pcdpath, plypath):plyfile = open(plypath, "w")pcdfile = open(pcdpath, "r")flag = 0pcdNum = []while True:line = pcdfile.readline()if not line:breakif flag == 1:line = line[:-1]lineList = line.split(" ")pcdNum.append(lineList)if flag == 0 and re.findall("DATA ascii", line):flag = 1pcdfile.close()num_points = len(pcdNum)FormatTrans.writePLYHeader(plyfile, num_points)for i in range(num_points):content = pcdNum[i][0] + " " + pcdNum[i][1] + " " + pcdNum[i][2] + "\n"plyfile.write(content)plyfile.close()@staticmethoddef objToply(objpath, plypath):plyfile = open(plypath, "w")objfile = open(objpath, "r")objNum = []while True:line = objfile.readline()if line.startswith("#"):continueif not line:breakline = line[2:-1]lineList = line.split(" ")objNum.append(lineList)objfile.close()num_points = len(objNum)FormatTrans.writePLYHeader(plyfile, num_points)for i in range(num_points):content = objNum[i][0] + " " + objNum[i][1] + " " + objNum[i][2] + "\n"plyfile.write(content)plyfile.close()@staticmethoddef pcdToobj(pcdpath, objpath):objfile = open(objpath, "w")pcdfile = open(pcdpath, "r")flag = 0pcdNum = []while True:line = pcdfile.readline()if not line:breakif flag == 1:line = line[:-1]lineList = line.split(" ")pcdNum.append(lineList)if flag == 0 and re.findall("DATA ascii", line):flag = 1pcdfile.close()num_points = len(pcdNum)for i in range(num_points):content = "v " + pcdNum[i][0] + " " + pcdNum[i][1] + " " + pcdNum[i][2] + "\n"objfile.write(content)objfile.close()@staticmethoddef objTopcd(objpath, pcdpath):pcdfile = open(pcdpath, "w")objfile = open(objpath, "r")objNum = []while True:line = objfile.readline()if line.startswith("#"):continueif not line:breakline = line[2:-1]lineList = line.split(" ")objNum.append(lineList)objfile.close()num_points = len(objNum)FormatTrans.writePCDHeader(pcdfile, num_points)for i in range(num_points):content = objNum[i][0] + " " + objNum[i][1] + " " + objNum[i][2] + "\n"pcdfile.write(content)pcdfile.close()if __name__ == "__main__":f = FormatTrans()# f.txtToply("data/data_bunny.txt", "data/data_bunny.ply")# f.txtTopcd("data/data_bunny.txt", "data/data_bunny.pcd")# f.txtToobj("data/data_bunny.txt", "data/data_bunny.obj")# f.plyTotxt("data/data_bunny.ply", "data/data_bunny1.txt")# f.pcdTotxt("data/data_bunny.pcd", "data/data_bunny2.txt")# f.objTotxt("data/data_bunny.obj", "data/data_bunny3.txt")# f.plyTopcd("data/data_bunny.ply", "data/data_bunny1.pcd")# f.plyToobj("data/data_bunny.ply", "data/data_bunny2.obj")# f.pcdToply("data/data_bunny.pcd", "data/data_bunny2.ply")# f.objToply("data/data_bunny.obj", "data/data_bunny3.ply")# f.pcdToobj("data/data_bunny.pcd", "data/data_bunny3.obj")f.objTopcd("data/data_bunny.obj", "data/data_bunny2.pcd")

验证:

你可以把注释按照顺序一共12个,每一个都解开注释,解开一个之后,前面的都注释掉,进行测试,我这里解开了第一个。你可以用cloudcompare软件进行查看,每次测试生成的文件。

完整项目和实验数据:点云PLY、PCD、OBJ、TXT文件互相转换代码资源-CSDN文库

相关文章:

  • 优思学院|质量和企业的盈利能力有何关系?
  • 超短代码实现!!基于langchain+chatglm3+BGE+Faiss创建拥有自己知识库的大语言模型(持续更新)本人python版本3.11.0 windows环境
  • Enzo Life Sciences Cortisol(皮质醇) ELISA kit
  • 阿里云服务器使用教程_2024建站教程_10分钟网站搭建流程
  • 通义千问1.5(Qwen1.5)大语言模型在PAI-QuickStart的微调与部署实践
  • selenium 4.17正式发布,这几项更新值得关注
  • Python测试框架pytest介绍用法
  • 安卓面试题 11-20
  • Unity 动画(旧版-新版)
  • 【ARM 嵌入式 编译系列 10.5 -- .linkonce 段详细介绍】
  • OpenHarmony教程指南—事件的订阅和发布
  • ospf虚链路实验简述
  • vue2 elementui 封装一个动态表单复杂组件
  • Neo4J
  • 数据库_关系代数的运算
  • CSS中外联样式表代表的含义
  • vue-loader 源码解析系列之 selector
  • webpack入门学习手记(二)
  • 阿里研究院入选中国企业智库系统影响力榜
  • 从setTimeout-setInterval看JS线程
  • 高性能JavaScript阅读简记(三)
  • 机器学习中为什么要做归一化normalization
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 聊聊flink的BlobWriter
  • 普通函数和构造函数的区别
  • 七牛云假注销小指南
  • 前言-如何学习区块链
  • 嵌入式文件系统
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 原生js练习题---第五课
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​iOS安全加固方法及实现
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #1014 : Trie树
  • #git 撤消对文件的更改
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (分布式缓存)Redis持久化
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (简单) HDU 2612 Find a way,BFS。
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .Family_物联网
  • .Net 8.0 新的变化
  • .Net CoreRabbitMQ消息存储可靠机制
  • .net web项目 调用webService
  • .NET 使用配置文件
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .net快速开发框架源码分享
  • .NET连接数据库方式
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • @Builder用法