Cent ans de solitude 2024-03-09 22:16 采纳率: 20%
浏览 20

关于RandLA-Net中提供的模型识别结果的.ply文件问题

这是我在 https://github.com/QingyongHu/RandLA-Net?tab=readme-ov-file

img

里面下载的预训练模型和他识别的结果,我下载之后打开,然后想打开里面的.ply文件看一下他的结果是怎么样的,用了meshlab和cloudcompare都打开不了,一打开txt才发现乱码,如下图所示

img

请问各位,这种.ply文件如何正确查看

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-09 22:17
    关注

    引自免费微信小程序:皆我百晓生

    在RandLA-Net中,模型输出的.ply文件是用于存储点云数据以及每个点对应的预测标签和真实标签。从您提供的信息来看,该.ply文件采用的是二进制格式(binary little endian 1.0),并且定义了两个属性:pred(预测标签)和label(实际标签),它们都是无符号8位整数(uint8)。

    由于一般的3D模型查看器如MeshLab或CloudCompare可能不直接支持带有特定属性标签的二进制.ply文件,因此无法正确打开和显示。要正确查看这种包含分类标签信息的点云.ply文件,您可以采取以下步骤:

    1. 使用支持读取带属性标签的点云软件

      • PotreeViewer是一个可以处理大规模点云且能展示分类标签的工具,但它需要先将数据转换为Potree格式。
      • 或者您可以编写Python脚本来读取.ply文件并将其转换成其他可视化工具支持的格式,例如LAS/LAZ或者CSV等,然后利用例如ParaView、CloudCompare(加载CSV插件)进行可视化。
    2. 自定义脚本解析.ply文件: 您可以编写一个简单的Python脚本来读取这个二进制.ply文件,并根据.ply文件的头部信息将点云数据及其标签读取出来,然后使用matplotlib、mayavi或其他三维可视化库来展示点云及其分类结果。

    下面是一个简单的Python脚本示例,用于读取二进制ply文件中的点云数据及标签:

    import struct
    
    def read_ply_binary(filename):
        with open(filename, 'rb') as f:
            header = f.readline().decode('utf-8').split()  # Read the header line
            assert header[0] == 'format' and header[1] == 'binary'
            
            elements = []
            while True:
                line = f.readline().decode('utf-8')
                if not line or line.startswith('end_header'):
                    break
                element_name, num_elements = line.split()[1:3]
                properties = [p.split() for p in f.readline().decode('utf-8').strip().split('property')]
                
                elements.append({
                    'name': element_name,
                    'num': int(num_elements),
                    'properties': {p[0]: {'type': p[1], 'size': struct.calcsize(p[1])} for p in properties}
                })
            
            vertices = elements[0]  # Assuming the first element is vertex data
            
            points = []
            for _ in range(vertices['num']):
                point_data = f.read(sum(prop['size'] for prop in vertices['properties'].values()))
                point_dict = {}
                offset = 0
                for prop_name, prop in vertices['properties'].items():
                    value_size = prop['size']
                    dtype = prop['type']
                    fmt = '<' + dtype  # Little-endian format
                    value = struct.unpack(fmt, point_data[offset:offset+value_size])[0]
                    point_dict[prop_name] = value
                    offset += value_size
                points.append(point_dict)
            
            return points
    
    # 使用函数读取.ply文件
    points = read_ply_binary('Area_1_conferenceRoom_1.ply')
    
    # 然后你可以遍历points来查看或可视化点云及其标签
    for point in points:
        print(f"Point: {point['x']}, {point['y']}, {point['z']} - Prediction: {point['pred']} - Label: {point['label']}")
    
    # 进一步地,利用matplotlib或其他3D可视化库绘制点云及分类结果
    # ...
    

    请注意,上述代码仅作为参考示例,具体实现可能需要根据实际.ply文件结构进行调整。同时,请确保你安装了必要的Python库(如numpy和struct)。对于可视化部分,您还需要找到合适的库(如matplotlib.pyplot.scatter3d、mayavi.mlab.points3d等)来展示带有颜色编码的点云标签。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月9日

悬赏问题

  • ¥15 我想在WPF的Model Code中获取ViewModel Code中的一个参数
  • ¥15 arcgis处理土地利用道路 建筑 林地分类
  • ¥20 使用visual studio 工具用C++语音,调用openslsx库读取excel文件的sheet问题
  • ¥100 寻会做云闪付tn转h5支付链接的技术
  • ¥15 DockerSwarm跨节点无法访问问题
  • ¥15 使用dify通过OpenAI 的API keys添加OpenAI模型时报了“Connection Error”错误
  • ¥40 想找个软件,但我不知道怎么找到它,我甚至不知道有没有
  • ¥15 怎么把60秒的视频时长改成显示0秒?且视频内容没有任何变化的正常播放?目的是为了解决一些平台对视频时长的要求,最好有自动处理的工具!
  • ¥15 累加器设初值为00H
  • ¥15 webAPI接口返回值判断