OpenCV + python - захватывать кадры из видеофайла
Кажется, я не могу захватить кадры из файла с помощью 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 ответа
У вас нет gstreamer-ffmpeg
или же gsteamer-python
или же gsteamer-python-devel
пакеты установлены. Я установил все три из них. и точно такая же проблема была решена.
Я использую 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/stackru$ 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/stackru$ 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
установка не работает