我有一个.ply格式模型,并试图创建一个.pcd文件。在检查了.pcd格式的外观,并编写了一些代码将其转换为.pcd格式之后,我的结果是该模型仅为黑色,而不是像.ply格式模型那样的多颜色。
在.ply格式中,每一行都有7个参数(x,y,z,r,g,b,a),而在.pcd格式中,参数应该是(x )。我不知道如何从.ply文件中计算rgb。
这里是我的一些.ply文件数据:
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 使用代码后的和一些.pcd文件数据:
# .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这里是.pcd应该是什么样的(在点云网站中找到)
# .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问题:,这些值是什么: 4.2108e+06作为第四个参数,我如何通过.ply格式生成它?
,这是我目前在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)通过对代码的这些更改,结果是白色云点而不是黑色:
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"用于比较的软件: CloudCompare
期望的结果:

当前结果:

发布于 2020-06-20 16:55:26
我正在努力解决一个类似的问题,并通过使用Open3D库为我找到了一个非常方便的方法。
只需使用pip pip install open3d或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检查)。
发布于 2019-04-13 13:01:55
您可以从这里中得到r,g,b和rgb之间的关系。
PointXYZRGB p;
// unpack rgb into r/g/b
uint32_t rgb = *reinterpret_cast<int*>(&p.rgb);
uint8_t r = (rgb >> 16) & 0x0000ff;
uint8_t g = (rgb >> 8) & 0x0000ff;
uint8_t b = (rgb) & 0x0000ff;好吧,你可以改变
output.write(" ".join(s.split(" ", 4)[:4]))至
x,y,z,r,g,b = s.split(" ", 6)[:6]
rgb = str((int(r)<<16) + (int(g)<<8) + (int(b)))
output.write(" ".join((x,y,z,rgb)))发布于 2018-12-01 16:37:48
我知道我去派对已经很晚了,但是为什么不给python库一个机会呢?具体来说,您可以以这种方式使用方法pcl.save():
cloud_in = pcl.load("path-to-ply-cloud.ply")
pcl.save(cloud_in, "path-to-ply-cloud.pcd")注意,pcl.save方法根据文件路径或方法参数中提供的文件扩展名保存云。也许你打算写你自己的函数,但我仍然把这个答案留在这里,希望它对你或其他人有用。
https://stackoverflow.com/questions/51350493
复制相似问题