从视频/图像中提取元数据



我正在查看并保存在我的计算机上的IP摄像机的MJPEG流。我如何做到这一点的代码可以在这里找到。答案解释了如何从流中提取图像并保存它们。

为了提取图像,我使用答案中列出的方法,并保存它,我只是使用OpenCV将图像放在avi容器中。代码如下:

writer=cv.CreateVideoWriter("video1.avi", cv.CV_FOURCC('X', '2', '6', '4'), fps, (320,240))
cv_image = cv2.imdecode(np.fromstring(jpg, dtype=np.uint8),cv2.CV_LOAD_IMAGE_COLOR)bitmap=cv.CreateImageHeader((cv_image.shape[1], cv_image.shape[0]), cv.IPL_DEPTH_8U, 3)
cv.SetData(bitmap, cv_image.tostring(), cv_image.dtype.itemsize * 3 * cv_image.shape[1])
cv.WriteFrame(writer, bitmap)

这里的位图是我在avi容器中显示和放置的图像。

由于图像来自IP摄像机,它必须有一些元数据,如摄像机插入的时间戳。

问题:如何提取元数据?

我想到了两种方法:

  1. 从视频中提取帧,然后访问它们以访问时间戳。
  2. 从视频本身提取时间戳

我该如何继续?我该用哪种方法?我正在使用Python和Opencv,我正在Windows 7上工作。

我也觉得这和我想做的事情有关。

如果有任何附加到(单个图像)文件的元数据,不幸的是,opencv将丢弃它。

此外,mjpeg协议本身没有任何时间戳(它只是一个http-多部分形式与图像交错[非常类似于电子邮件附件],所以内容类型和内容长度是你在那里得到的全部[并且只有当你使用http1.1])。

对于否定的答案很抱歉,但是你必须寻找除了opencv之外的图像处理工具。

对于Java,您可以使用元数据提取器。除此之外,您还可以使用ImageMagick和Exiflib,它们都是优秀的库(优秀的定义是高度稳定、健壮和积极开发),但是它们都是命令行工具。对于imagemagick,您可以找到其他语言绑定。

我很幸运地访问了ffmpeg的视频元数据。

ffmpeg -i video_file.mp4

打印出如下信息:

  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: isommp42
    creation_time   : 2019-02-25T00:00:07.000000Z
    location        : +XX.XXXX+XXX.XXXX/
    location-eng    : +XX.XXXX+XXX.XXXX/
  Duration: 00:16:28.86, start: 0.000000, bitrate: 7331 kb/s
    Stream #0:0(eng): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 1920x1080, 7236 kb/s, SAR 1:1 DAR 16:9, 10.91 fps, 30 tbr, 90k tbn, 180k tbc (default)
    Metadata:
      creation_time   : 2019-02-25T00:00:07.000000Z
      handler_name    : VideoHandle
    Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 96 kb/s (default)
    Metadata:
      creation_time   : 2019-02-25T00:00:07.000000Z
      handler_name    : SoundHandle

有用于ffmpeg的python包装器,例如。, ffmpeg-python。我个人只是用shell脚本提取了我需要的信息(creation_time),当然可以通过subprocess模块调用。

对于视频元数据,请使用Martin Drohmann所说的ffmpeg

对于图像元数据(称为"EXIF"):

OpenCV将丢弃图像元数据;例如,cv2.imread('bear.jpg')将生成一个像素强度的三维numpy数组(第三个维度是R,G,B通道)。

因此,为了提取EXIF数据,您可以使用Python的另一个图像处理库,该库非常流行,称为 pillow

首先,在命令行上安装pillow: pip install pillow

然后可以从bear.jpg中提取EXIF数据:

import PIL.Image
from PIL.ExifTags import TAGS
from pprint import pprint
image = PIL.Image.open('bear.jpg')
# Get the exif data and map to the correct tags
exif_data = {
                PIL.ExifTags.TAGS[k]: v
                for k,v in image._getexif().items()
                if k in PIL.ExifTags.TAGS
            }
pprint(exif_data)

显示EXIF数据:

{'ExposureBiasValue': (0, 3),
 'ExposureTime': (1, 40),
 'FNumber': (280, 100),
 'ISOSpeedRatings': 100,
 ...
}

有关EXIF的完整信息,请参见https://exiv2.org/tags.html

我也需要从视频中获取元数据,而OpenCV就是做不到。

我发现这个和这个似乎得到元数据。

我还没有测试过

相关内容

  • 没有找到相关文章

最新更新