【问题标题】:How to add custom metadata to OpenCV/numpy image?如何将自定义元数据添加到 OpenCV/numpy 图像?
【发布时间】:2012-04-06 04:45:08
【问题描述】:

我有一个问题。

我正在对 OpenCV 中捕获的一些图像执行一系列操作(调整大小、复制等),但我想为这些图像设置一些特定的元数据(属性名称也应该由我定义),这将在这些操作中幸存下来,以后可以提取。我没有设置分辨率值或在这些操作之后发生变化的任何其他值。我怎样才能做到这一点?听说过pyexiv2,但没见过涉及OpenCV的例子。

提前致谢!

【问题讨论】:

  • 我们在这里都有问题:-) 我认为您是在谈论在将图像写入文件时添加元数据? OpenCV(包括版本 2.3.1 - 最新版本)总是通过“HighGUI”库提供它的图像 I/O。所以你至少可以写一个.jpg、.png、.tiff。等等。然而,在此之前,附加到内部图像类的元数据的概念——底层的 IplImage——是不存在的。因此,您必须将所有 EXIF 数据事后写入文件。
  • P.S.在这种情况下,您使用 pyexiv2 可能是正确的。根据上一个问题:stackoverflow.com/questions/765396/…

标签: python image-processing opencv numpy python-2.7


【解决方案1】:

因此,最终,您可以将 2 个文件内容(数据和元数据)隐藏在您自己的 python 类后面:

import cv 
import pyexiv2

class MyImage():

  _filename = None
  _data = None
  _metadata = None

  def __init__(self,fname):

    _filename = fname
    _data = cv.LoadImage(_filename)
    _metadata = pyexiv2.ImageMetadata(_filename)
    _metadata.read()

  def addMeta(self,key,value):
    _metadata[key] = pyexiv2.ExifTag(key, value)

  def delMeta(self,delkey):
    newdict = {key: value for key, value in some_dict.items()
                if value is not delkey}

  def resize(self,newx,newy):
    tmpimage = cv.CreateMat(newy, newx, cv.CV_8UC3)
    cv.Resize(_data,tmpimage)
    _data = tmpimage
    try: # Set metadata tags to new size if exist!
      _metadata['Exif.Image.XResolution'] = newx
      _metadata['Exif.Image.YResolution'] = newy
    except:
      pass

  def save(self):
    cv.SaveImage(_filename,_data) 
    _metadata.write()

【讨论】:

  • 感谢您这么好的回复!使用 ttf 或 jpg 等格式的唯一问题是,我没有将图像保存在任何地方。它们被抓取、通过网络连接传输、显示,仅此而已。我尝试了cv2.imencode(),但由于某种错误,它不会生成 JPEG。唯一的方法是转换为 cvMat 并使用旧方法 cv.EncodeImage(),这将不再保留元数据。
  • 啊 - 我相信我看到了你的问题。即使您使用 PIL ImagefromBuffer() 方法,您至少可以从 OpenCV 原始数据中创建内存中的图像。但是,您似乎无法通过PIL.ExifTags...创建/更新新的EXIF标签...:-(请参阅here
猜你喜欢
  • 1970-01-01
  • 2014-02-22
  • 2011-10-30
  • 1970-01-01
  • 2016-05-19
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
相关资源
最近更新 更多