【问题标题】:invalid start byte error while reading PCD files读取 PCD 文件时出现无效起始字节错误
【发布时间】:2020-07-30 03:31:15
【问题描述】:

我正在尝试从我在网上找到的人脸数据集中提取数据,该数据集提供 png 图片及其相应的 pcd 文件。但是,每当我尝试从 pcd 文件中提取数据时,都会出现错误:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc0 in position 202: invalid start byte

我知道这是因为我正在尝试读取非 ASCII 字符,但是,我没有看到任何人在打开外部源的 .pcd 文件时遇到此问题。数据集末尾是否有错误,或者是否有解决方法可以让我读取此文件。我最终想为机器学习应用程序开发深度图像(我对机器学习还很陌生)。

如果这是数据集的问题,我很想听听其他 RGB-D 人脸数据集,因为我找不到任何其他提供深度信息的数据集。

如果这是我的问题,我想知道我能做些什么来解决它,因为我尝试了许多不同的技术和库来读取文件并且只得到了这个错误。

谢谢!

import os
import math
import numpy as np
from PIL import Image


filePath = "001_01_cloud.pcd"

with open(filePath, "r") as pcd_file:
    lines = [line.strip().split(" ") for line in pcd_file.readlines()]

【问题讨论】:

    标签: python runtime-error point-clouds


    【解决方案1】:

    搜索specification for the PCD format 表示实际的点云数据可以二进制形式存储,我假设这就是这里发生的情况:

    DATA - 指定存储点云数据的数据类型。从 0.7 版本开始,支持两种数据类型:ascii 和二进制。

    由于您使用模式 "r" 打开文件,Python 将假定它是文本,并会轻松尝试将所有内容解释为 UTF-8(默认情况下;您可以传递 encoding="...")。

    但是,由于该格式有一个文本标题,后跟文本或二进制数据,因此您需要以二进制模式打开它,"rb"。 (这意味着从文件中读取将产生bytes 对象,而不是字符串。)如果您需要将它们作为文本处理,您可以将.decode() 字节对象转换为字符串。

    你也不应该在这样的文件中使用.readlines();文本标题后面的二进制数据可以包含\n 字符,如果分割成行,该数据将被“破坏”。

    无论如何,您可能在这里重新发明轮子; there seems to be a Python library for PCD files.

    【讨论】:

    • 我之前尝试过使用该库,但似乎存在一些问题,可能是自行创建的。我使用了编写的示例代码(插入我的文件名),它给了我“AttributeError:模块'pypcd'没有属性'PointCloud'”。不过,我可能已经找到了替代解决方案。感谢您的帮助。
    • 啊,是的,看起来 PyPCD 库已经过时了(即为 Python 2 而不是 Python 3 编写的)...
    • 是的,我需要使用的其他库的重新创建要复杂得多,并且是用 python3 编写的。
    • 显然有一个 Python3 兼容的 PyPCD 分支,您可以使用 pip install -U git+https://github.com/klintan/pypcd.git 安装 :)
    • 感谢实际工作。但是,该模块会为二进制 pcd 格式吐出一个错误,所以不幸的是,我认为我不能以任何一种方式使用它。错误是“ValueError:字段'__0000'出现不止一次”
    猜你喜欢
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多