【问题标题】:Store a file metadata in an extra file将文件元数据存储在额外文件中
【发布时间】:2011-07-28 07:09:06
【问题描述】:

我有一堆图像文件(主要是 .jpg)。我想存储有关这些文件的元数据(例如主色、颜色分布、最大梯度流场、兴趣点……)。这些数据字段不是固定的,并非在所有图像中都可用。

现在,我将每个文件的元数据存储为具有相同名称但扩展名不同的单独文件。格式只是文本:

metadataFieldName1 metadataFieldValue1
metadataFieldName2 metadataFieldValue2

这让我想知道,有没有更好/更简单的方法来存储这些元数据?我想到了 ProtocolBuffer,因为我需要能够在 C++ 和 Python 中读取和写入这些信息。但是,我如何支持某些元数据不可用的情况?

【问题讨论】:

  • 您是否研究过 boost 序列化基础架构?我相信它与 python 配合得很好。

标签: c++ python linux serialization computer-vision


【解决方案1】:

我建议您将此类元数据存储在图像文件本身中。

大多数图像格式都支持存储元数据。我认为.jpeg 通过Exif 支持它。

如果您使用的是 Windows,则可以使用 WIC 在 unified manner 中存储和检索元数据。

【讨论】:

  • 我考虑过 EXIF,但我的许多图像不是 jpg 格式。我也不在 Windows 上。
【解决方案2】:

为什么是协议缓冲区而不是 XML 或 INI 文件或任何文本格式?只需选择某种格式...

“元数据不可用”是什么意思?由您的应用程序来响应此类错误情况...这与存储格式有什么关系?

【讨论】:

    【解决方案3】:

    看看http://www.yaml.org。 YAML 比 XML 更简洁,更易于阅读。

    有适用于 C++、Python 和许多其他语言的 YAML 库。

    例子:

    import yaml
    
    data = { "field1" : "value1",
             "field2" : "value2" }
    
    serializedData = yaml.dump(data, default_flow_style=False)
    
    open("datafile", "w").write(serializedData)
    

    【讨论】:

    • YAML 很好,但上次我检查它涉及到相当多的编码。你有 YAML 库推荐吗?
    • Python 的 PyYAML。请参阅我在编辑后的答案中添加的代码示例,它只需要很少的代码行。
    • 用于转储是的,但将其读回结构的 C++ 向量并不简单。
    【解决方案4】:

    我在这件事上想了很久,并使用 ProtocolBuffer 为我的图像存储元数据。对于每个图像,例如Image00012.jpg,我将元数据存储在 Image00012.jpg.pbmd 中。一旦我设置了 .proto 文件,Python 类和 C++ 类就会自动生成。它工作得很好,只需要我花很少的时间在解析上(显然比为 YAML 文件编写自定义阅读器要好)。

    RestRisiko 提出了一个很好的观点,即我应该如何处理不可用的元数据。 ProtocolBuffer 的好处是它支持可选/必填字段。这解决了我在这方面的问题。

    我认为 XML 和 INI 不适合此目的的原因是因为我的许多元数据很复杂(颜色分布,...)并且需要一些存储自定义。 ProtocolBuffer 允许我嵌套 proto 声明。此外,元数据文件的大小和解析速度明显优于我的手动 XML 读/写。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-24
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      • 2021-10-03
      相关资源
      最近更新 更多