将文件元数据存储在额外文件中

时间:2011-04-02 15:20:52

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

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

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

metadataFieldName1 metadataFieldValue1
metadataFieldName2 metadataFieldValue2

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

4 个答案:

答案 0 :(得分:2)

我建议您将这些元数据存储在图像文件中。

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

看看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)

答案 3 :(得分:0)

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

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

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