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

时间:2014-03-14 05:19:39

标签: python opencv video metadata ip-camera

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

为了提取图像我使用答案中列出的方法并保存它我只是使用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. 从视频中提取时间戳。
  3. 我该怎么办?我使用哪种方法?我正在使用Python和Opencv,我正在使用Windows 7。

    我还阅读this与我想要做的事情有关。它没有解决我的问题。

4 个答案:

答案 0 :(得分:2)

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

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

对于否定的答案感到抱歉,但除了opencv之外,你还需要研究图像处理工具。

答案 1 :(得分:2)

对于Java,您可以使用Metadata Extractor。此外,您可以使用ImageMagick和Exiflib,两者都非常出色(优秀定义为高度稳定,强大且积极开发)库,但这些是命令行工具。对于imagemagick,您可以找到其他语言绑定。

答案 2 :(得分:0)

我也需要从视频中获取元数据,而OpenCV却无法实现。

我发现thisthis似乎获得了元数据。

我还没有测试过它。

答案 3 :(得分:0)

我很幸运用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模块调用该信息。