如何向OpenCV/numpy图像添加自定义元数据?

9
我有一个问题。
我正在使用OpenCV对一些捕获的图像执行一系列操作(调整大小、复制等),但我想为这些图像设置一些特定的元数据(属性名也应由我定义),这些元数据将在这些操作后保留,并且可以在以后提取。我没有设置分辨率值或任何其他在这些操作之后更改的值。我该怎么做呢?我听说过pyexiv2,但是我从未看到涉及OpenCV的示例。
谢谢!

我们都有问题:-)我想你是在谈论在将图像写入文件时添加元数据吧?OpenCV(包括最新的2.3.1版本)一直通过“HighGUI”库提供其图像I/O。因此,您至少可以编写.jpg、.png、.tiff等格式的文件。但是,在此之前,将元数据附加到内部图像类——底层的IplImage——的概念并不存在。因此,您必须在后期将任何EXIF数据写入文件。 - timlukins
如果您需要处理EXIF数据,那么使用pyexiv2是一个不错的选择,正如之前在stackoverflow上提到的:https://dev59.com/G3RA5IYBdhLWcg3w9y10 - timlukins
1个回答

4
所以,最终,您可以将两个文件内容(数据和元数据)隐藏在自己的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()

1
非常感谢您的回复!使用ttf或jpg这样的格式唯一的问题是,我没有将图像保存在任何地方。它们被抓取、通过网络连接传输、显示,就这样而已。我尝试过cv2.imencode(),但由于某种错误,它无法生成JPEG。唯一的方法是转换为cvMat并使用传统方法cv.EncodeImage(),但这将不再保留元数据。 - Subhamoy S.
1
啊 - 我相信我看到了你的问题。即使你使用PIL [Image](http://www.pythonware.com/library/pil/handbook/image.htm)类中的`fromBuffer()`方法,你至少可以从OpenCV原始数据中创建一个内存中的图像。然而,似乎你不能通过`PIL.ExifTags`创建/更新新的EXIF标签... :-( 请参见这里 - timlukins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接