OpenCV + python - 从视频文件中获取帧

Mat*_*ein 7 python opencv video-processing

我似乎无法使用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
Run Code Online (Sandbox Code Playgroud)

输出:

ubuntu@local:~/opencv$ ./test.py bbb.avi 
<Capture 0xa37b130>
0.0
0.0
Run Code Online (Sandbox Code Playgroud)

帧总是无......

我使用以下代码将视频文件转码为i420格式:

mencoder $1 -nosound -ovc raw -vf format=i420 -o $2
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

小智 5

你没有gstreamer-ffmpeggsteamer-pythongsteamer-python-devel软件包安装.我安装了所有这三个.并解决了完全相同的问题.


mpe*_*kov 4

我使用的是 OpenCV 2.2.0,它是在 Ubuntu 上从源代码编译的。我可以确认您提供的源代码按预期工作。所以问题出在其他地方。

我无法使用 mencoder 重现您的问题(在我的机器上安装它有点问题),所以我曾经ffmpeg将原始视频包装在 AVI 容器中:

ffmpeg -s cif -i ~/local/sample-video/foreman.yuv -vcodec copy foreman.avi
Run Code Online (Sandbox Code Playgroud)

(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 )>
...
Run Code Online (Sandbox Code Playgroud)

所以事情按预期进行。您应该检查什么:

  • 您在标准输出/标准错误上遇到任何错误吗?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
Run Code Online (Sandbox Code Playgroud)
  • 确保您的 AVI 文件确实包含播放视频所需的信息。至少,这应该是框架尺寸。RAW 视频通常不包含除实际像素数据之外的任何信息,因此需要了解帧尺寸和 FPS。您可以错误地猜测 FPS,但仍然可以获得可观看的视频,但如果尺寸错误,则视频将无法观看。
  • 确保您尝试打开的 AVI 文件确实可以播放。尝试一下ffplay file.avi——如果失败,则问题可能出在该文件上。尝试使用ffmpeg转码而不是mencoder.
  • 确保您可以使用与上述相同的方法播放其他视频。如果不能,那么您的ffmpeg安装可能已损坏。