2011-02-08 14 views
7

nie wydaje się uchwycić klatek z pliku za pomocą OpenCV - Mam skompilowany ze źródeł na Ubuntu ze wszystkimi niezbędnymi prereqs według: http://opencv.willowgarage.com/wiki/InstallGuide%20%3A%20DebianOpenCV + python - grab klatek z pliku wideo

#!/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 

wyjściowa:

[email protected]:~/opencv$ ./test.py bbb.avi 
<Capture 0xa37b130> 
0.0 
0.0 

ramki są zawsze Żaden ...

mam transkodowanie plików wideo do formatu i420 używając:

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

Wszelkie pomysły?

+0

To jest dokładnie to, czego szukałem.To działało idealnie dla mnie w Ubuntu 10.04 przy użyciu pakietów Opencv 2.1. Dzięki! – Cerin

Odpowiedz

4

Używam OpenCV 2.2.0, skompilowany na Ubuntu ze źródła. Mogę potwierdzić, że podany kod źródłowy działa zgodnie z oczekiwaniami. Więc problem jest gdzie indziej.

nie mogę odtworzyć problemu przy użyciu MEncodera (instalacji jest to trochę problem na moim komputerze), więc użyłem ffmpeg zawinąć surowego wideo w kontenerze AVI:

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

(majster. yuv to standardowa sekwencja obrazów CIF, którą można znaleźć w Internecie, jeśli: look around).

Uruchamianie AVI z ffmpeg przez źródła daje to:

[email protected]:~/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)> 
... 

Więc wszystko działa zgodnie z oczekiwaniami. Co należy sprawdzić:

  • Czy występują błędy na standardowym wyjściu/standardowy błąd? OpenCV używa bibliotek ffmpeg do odczytywania plików wideo, więc szukaj wiadomości informacyjnych. Oto co się dzieje, jeśli starają się grać RAW pliku wideo bez pojemnika (brzmi podobnie do Twojego problemu):

błąd:

[email protected]:~/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 
  • Upewnij się, że plik AVI rzeczywiście zawiera wymaganych informacji aby odtworzyć wideo. Co najmniej powinny to być wymiary ramy. Filmy RAW zazwyczaj nie zawierają żadnych informacji poza faktycznymi danymi pikseli, więc znają wymiary ramki i FPS. Możesz się domyślić, że FPS nadal wyświetla wideo, ale jeśli uzyskasz błędne wymiary, wideo będzie niemożliwe do oglądania.
  • Upewnij się, że plik AVI, który próbujesz otworzyć, jest faktycznie możliwy do odtworzenia. Wypróbuj ffplay file.avi - jeśli to się nie powiedzie, problem prawdopodobnie dotyczy pliku. Spróbuj użyć transkrypcji ffmpeg zamiast mencoder.
  • Upewnij się, że możesz odtwarzać inne filmy, używając tej samej metody, co powyżej. Jeśli nie możesz, to prawdopodobnie twoja instalacja ffmpeg jest zepsuta.
+0

Dzięki misha, spróbuję wypróbować te pomysły - bez błędów z ffmpeg, o ile mogę to stwierdzić ... Jedno pytanie, czy używałeś różnych pakietów podczas instalowania wszystkich zależności od tego, co mają na swojej wiki? –

5

Nie mają gstreamer-ffmpeg lub gsteamer-python lub gsteamer-python-devel pakietami. Zainstalowałem wszystkie trzy. i dokładnie ten sam problem został rozwiązany.

+0

To literówka, ale ci, którzy kopiują/wklejają, upewnij się, że dostajesz "gstreamer-python" i "gstreamer-python-devel". Nie zapomnij o R. – billmalarky

Powiązane problemy