OpenCV + python - захватывать кадры из видеофайла - PullRequest
7 голосов
/ 08 февраля 2011

Мне кажется, что я не могу захватить кадры из файла с помощью 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

Рамки всегда Нет ...

Я перекодировал видеофайл в формат i420, используя:

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

Есть идеи?

Ответы [ 2 ]

5 голосов
/ 05 июля 2012

У вас не установлены пакеты gstreamer-ffmpeg или gsteamer-python или gsteamer-python-devel. Я установил все три из них. и точно такая же проблема была решена.

4 голосов
/ 08 февраля 2011

Я использую OpenCV 2.2.0, скомпилированный на Ubuntu из исходных текстов.Я могу подтвердить, что предоставленный вами исходный код работает должным образом.Так что проблема в другом.

Я не смог воспроизвести вашу проблему с помощью mencoder (установка на моем компьютере - небольшая проблема), поэтому я использовал ffmpeg, чтобы обернуть необработанное видео в контейнер AVI:

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

(foreman.yuv - стандартная последовательность изображений CIF, которую вы можете найти в сети, если вы осмотрите ).

Запуск AVI из ffmpeg через ваш источник дает следующее:

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-видео обычно не содержит никакой информации, кроме фактических данных о пикселях, поэтому необходимо знать размеры кадра и FPS.Вы можете ошибочно угадать FPS и по-прежнему получать просматриваемое видео, но если вы ошибетесь в размерах, видео будет недоступно для просмотра.
  • Убедитесь, что файл AVI, который вы пытаетесь открыть, действительно воспроизводим.Попробуйте ffplay file.avi - если это не удастся, проблема, скорее всего, связана с файлом.Попробуйте использовать ffmpeg для транскодирования вместо mencoder.
  • Убедитесь, что вы можете воспроизводить другие видео, используя тот же метод, что и выше.Если вы не можете, значит, ваша ffmpeg установка не работает.
...