python - Convertion of .ply format to .pcd format
问题描述
I've a .ply format model and trying to create a .pcd file one. After checking how .pcd format should look like and writing some code to convert it to .pcd format, my results are that the model is black colored only, instead of multi-colored like the .ply format model.
In the .ply format there are 7 parameters in every point line (x,y,z,r,g,b,a) and on .pcd one it should be (x y z rgb). I'm not sure how to evaluate the rgb from the .ply file.
Here's some of my .ply file data:
ply
format ascii 1.0
comment VCGLIB generated
element vertex 130474
property float x
property float y
property float z
property uchar red
property uchar green
property uchar blue
property uchar alpha
element face 0
property list uchar int vertex_indices
end_header
169.345 0.00190678 -356.222 128 138 80 255
170.668 0.00202459 -355.459 58 36 16 255
170.6 0.00285877 -355.877 59 46 45 255
170.307 0.00326565 -354.98 149 107 81 255
170.581 0.00329066 -355.646 61 38 28 255
And some of the .pcd file data after using the code:
# .PCD v.7 - Point Cloud Data file format
VERSION .7
FIELDS x y z rgb
SIZE 4 4 4 1
TYPE F F F F
COUNT 1 1 1 1
WIDTH 130474
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 130474
DATA ascii
169.345 0.00190678 -356.222 128
170.668 0.00202459 -355.459 58
170.6 0.00285877 -355.877 59
Here's how the .pcd should look like (found in point cloud website)
# .PCD v.7 - Point Cloud Data file format
VERSION .7
FIELDS x y z rgb
SIZE 4 4 4 4
TYPE F F F F
COUNT 1 1 1 1
WIDTH 213
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 213
DATA ascii
0.93773 0.33763 0 4.2108e+06
0.90805 0.35641 0 4.2108e+06
0.81915 0.32 0 4.2108e+06
Question: What are these values: 4.2108e+06 as the 4th parameter and how can I generate it through the .ply format?
Here's the code I'm currently using on PyCharm:
#!/usr/bin/env python
import sys
import os
header = "# .PCD v.7 - Point Cloud Data file format\n\
VERSION .7\n\
FIELDS x y z rgb\n\
SIZE 4 4 4 1\n\
TYPE F F F F\n\
COUNT 1 1 1 1\n\
WIDTH XXXX\n\
HEIGHT 1\n\
VIEWPOINT 0 0 0 1 0 0 0\n\
POINTS XXXX\n\
DATA ascii"
def convertionOfPlyToPcd(ply_file, pcd_file):
input_file = open(ply_file)
out = pcd_file
output = open(out, 'w')
write_points = False
points_counter = 0
nr_points = 0
for s in input_file.readlines():
if s.find("element vertex") != -1:
nr_points = int(s.split(" ")[2].rstrip().lstrip())
new_header = header.replace("XXXX", str(nr_points))
output.write(new_header)
output.write("\n")
if s.find("end_header") != -1:
write_points = True
continue
if write_points and points_counter < nr_points:
points_counter = points_counter + 1
output.write(" ".join(s.split(" ", 4)[:4]))
output.write("\n")
input_file.close()
output.close()
if __name__ == "__main__":
# We request the path to the script, if it's not found - exit
if sys.argv[0] == "":
sys.exit(1)
# PLY file - We convert this format to PCD format
ply_file = sys.argv[1]
# PCD file - generated from PLY file
pcd_file = sys.argv[2]
# Function which converts .ply format files to .pcd files
convertionOfPlyToPcd(ply_file, pcd_file)
With these changes to the code the results are white cloud points instead of black:
header = "# .PCD v.7 - Point Cloud Data file format\n\
VERSION .7\n\
FIELDS x y z\n\
SIZE 4 4 4\n\
TYPE F F F \n\
COUNT 1 1 1\n\
WIDTH XXXX\n\
HEIGHT 1\n\
VIEWPOINT 0 0 0 1 0 0 0\n\
POINTS XXXX\n\
DATA ascii"
Software used for comparison: CloudCompare
解决方案
我正在努力解决类似的问题,并通过使用Open3D 库为我找到了一种非常方便的方法。
pip install open3d
只需使用 pip或 conda安装库conda install -c open3d-admin open3d
并运行以下三行:
import open3d as o3d
pcd = o3d.io.read_point_cloud("source_pointcloud.ply")
o3d.io.write_point_cloud("sink_pointcloud.pcd", pcd)
它工作正常并保持颜色(使用 CloudCompare 检查)。
推荐阅读
- google-cloud-automl - AutoML 如何知道训练好的模型?
- mysql - 如何递归运行sql查询?
- javascript - 使用 Cocoa 填充 PDF - 使用 NSTextField 内容填充 PDF 文本字段?
- symfony - Symfony 3 - 无法使用自定义存储库
- ruby-on-rails - 在 Ruby on Rails 中使用 IP 代理
- reactjs - how to use React Redux to display data without mapping method
- python - 使用两个变量在 Flask 中更新 MySQL 数据库
- javascript - 如何在类构造函数中记录对象?
- excel - How to Return a Comma Separated Value List to single Excel Cell based on Condition from Range
- expression - 在 Qlik Sense 中为变量值添加书签