【问题标题】:Convertion of .ply format to .pcd format将 .ply 格式转换为 .pcd 格式
【发布时间】:2018-12-23 07:58:42
【问题描述】:

我有一个 .ply 格式的模型并尝试创建一个 .pcd 文件。在检查 .pcd 格式的外观并编写一些代码将其转换为 .pcd 格式后,我的结果是该模型仅是黑色的,而不是像 .ply 格式模型那样的多色。

在 .ply 格式中,每条点线都有 7 个参数 (x,y,z,r,g,b,a),在 .pcd 上应该是 (x y z rgb)。我不确定如何评估 .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 作为第 4 个参数,我如何通过 .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

期望的结果:

当前结果:

【问题讨论】:

    标签: python point-cloud-library point-clouds ply-file-format


    【解决方案1】:

    我正在努力解决类似的问题,并通过使用Open3D library 找到了一种对我来说非常方便的方法。

    只需使用 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 检查)。

    【讨论】:

      【解决方案2】:

      你可以从here获取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)))
      

      【讨论】:

      • 请说明这与所讨论的 .ply 和 .pcd 格式有何关系。
      【解决方案3】:

      当我使用您的方法时,我收到以下错误:

      Traceback (most recent call last):
        File "/home/me/shared/test.py", line 49, in <module>
          convertionOfPlyToPcd(ply_file, pcd_file)
        File "/home/me/shared/test.py", line 23, in convertionOfPlyToPcd
          for s in input_file.readlines():
        File "/usr/lib/python3.6/codecs.py", line 321, in decode
          (result, consumed) = self._buffer_decode(data, self.errors, final)
      UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 252: invalid start byte
      

      我也尝试安装 pcl 库,显然我无法让它运行它的错误,我的 python 解释器甚至在pip install python-pcl 之后都看不到它 不只是 import pcl 工作我得到一个 ModuleNotFoundError

      任何其他转换方法我仍然坚持使用 .ply 文件??

      【讨论】:

        【解决方案4】:

        我知道我参加聚会已经很晚了,但是为什么不给python-pcl library 一个机会呢?具体可以这样使用pcl.save()方法:

        cloud_in = pcl.load("path-to-ply-cloud.ply")
        pcl.save(cloud_in, "path-to-ply-cloud.pcd")
        

        请注意,pcl.save 方法根据您在文件路径中或作为方法参数提供的文件扩展名保存云。也许您打算编写自己的函数,但我仍将这个答案留在这里,希望对您或其他人有用。

        【讨论】:

        • 到目前为止,这是一个超级错误且未完成的 Python 库。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-18
        • 1970-01-01
        • 1970-01-01
        • 2023-02-03
        • 1970-01-01
        相关资源
        最近更新 更多