OpenCV + python -- 从视频文件抓取帧

7 投票
2 回答
15208 浏览
提问于 2025-04-16 11:25

我在用OpenCV从文件中提取帧的时候遇到问题——我在Ubuntu上按照这个链接的步骤编译了所有需要的东西: http://opencv.willowgarage.com/wiki/InstallGuide%20%3A%20Debian

#!/usr/bin/env python

import cv
import sys

files = sys.argv[1:]

for f in files:
    capture = cv.CaptureFromFile(f)
    print capture

    print cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_WIDTH)
    print cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_HEIGHT)

    for i in xrange(10000):
        frame = cv.QueryFrame(capture)
        if frame:
            print frame

输出结果:

ubuntu@local:~/opencv$ ./test.py bbb.avi 
<Capture 0xa37b130>
0.0
0.0

提取的帧总是None……

我用下面的命令把一个视频文件转码成了i420格式:

mencoder $1 -nosound -ovc raw -vf format=i420 -o $2

有什么建议吗?

2 个回答

4

我正在使用OpenCV 2.2.0,这是在Ubuntu上从源代码编译的。我可以确认你提供的源代码是正常工作的。所以问题出在别的地方。

我没有办法用mencoder重现你的问题(在我的机器上安装它有点麻烦),所以我用ffmpeg把一个原始视频包装成AVI格式:

ffmpeg -s cif -i ~/local/sample-video/foreman.yuv -vcodec copy foreman.avi

(foreman.yuv是一个标准的CIF图像序列,你可以在网上找到,如果你多找找的话)。

ffmpeg生成的AVI文件通过你的源代码运行后,结果是:

misha@misha-desktop:~/Desktop/stackoverflow$ python ocv_video.py foreman.avi
<Capture 0xa71120>
352.0
288.0
<iplimage(nChannels=3 width=352 height=288 widthStep=1056 )>
<iplimage(nChannels=3 width=352 height=288 widthStep=1056 )>
...

所以一切都按预期工作。你应该检查以下几点:

  • 在标准输出或标准错误中有没有错误信息?OpenCV使用ffmpeg库来读取视频文件,所以要留意一些有用的提示。如果你尝试播放一个没有容器的RAW视频文件(这听起来和你的问题类似),会发生这样的情况:

错误信息:

misha@misha-desktop:~/Desktop/stackoverflow$ python ocv_video.py foreman.yuv 
[IMGUTILS @ 0x7fff37c8d040] Picture size 0x0 is invalid
[IMGUTILS @ 0x7fff37c8cf20] Picture size 0x0 is invalid
[rawvideo @ 0x19e65c0] Could not find codec parameters (Video: rawvideo, yuv420p)
[rawvideo @ 0x19e65c0] Estimating duration from bitrate, this may be inaccurate
GStreamer Plugin: Embedded video playback halted; module decodebin20 reported: Your GStreamer installation is missing a plug-in.
<Capture 0x19e3130>
0.0
0.0
  • 确保你的AVI文件确实包含播放视频所需的信息。至少应该有帧的尺寸。RAW视频通常只包含实际的像素数据,不包含其他信息,所以知道帧的尺寸和帧率是必须的。你可以错误估计帧率,仍然能得到一个可观看的视频,但如果尺寸错了,视频就无法观看。
  • 确保你尝试打开的AVI文件是可以播放的。试试ffplay file.avi -- 如果失败了,那问题可能出在文件上。可以尝试用ffmpeg进行转码,而不是用mencoder
  • 确保你能用上面的方法播放其他视频。如果不能,那可能是你的ffmpeg安装有问题。
5

你没有安装 gstreamer-ffmpeggstreamer-python 或者 gstreamer-python-devel 这些软件包。我安装了这三样东西,结果同样的问题就解决了。

撰写回答