Python Video in OpenCV von Stdin lesen

Sukrim

Lieutenant
Registriert
Apr. 2009
Beiträge
958
Aloha!

Ich hab mich mal aus Interesse in perceptual hashes eingelesen (toller Artikel: http://www.hackerfactor.com/blog/index.php?/archives/432-Looks-Like-It.html) und möchte das jetzt auch mal etwas weiter treiben und auf Videos anwenden.

Damit's erst mal schnell zu schreiben geht, habe ich einen leicht abgewandelten pHash Algorithmus in Python implementiert. Das klappt auch schon mal ganz fein, allerdings stehe ich nun vor dem Problem, dass es offenbar gar nicht so leicht wie gedacht ist, ein Video frameweise zu zerlegen (z.B. da oft bei neuen Codecs nur Keyframes vorhanden sind etc.).

Bisher habe ich das bei meinen Tests einfach per "Dateispam" erledigt:
Code:
ffmpeg -i Big_Buck_Bunny_1080p.avi -pix_fmt gray -filter scale=32:32 image-%d.png
spuckt mir einfach alle Frames in 32x32 auf die Platte, fein skaliert und in Graustufen.

Was ich nun erreichen möchte, ist mit ffmpeg das Video schon mal wenigstens in ein Format zu wandeln, das ich dann mit OpenCV lesen kann (scipy/numpy scheinen max. mit Bildern umgehen zu können leider). Idealerweise pipe ich das Video gleich direkt an meine Hashfunktion weiter, ohne eine Datei auf die HDD schreiben zu müssen - allerdings spuckt mir da OpenCV in die Suppe: http://opencv.willowgarage.com/docu...writing_images_and_video.html#capturefromfile verlangt einen Dateinamen und anscheinend existiert /dev/stdin nicht unter Windows...

Momentan verwende ich nur scipy und numpy, OpenCV habe ich aber mal testweise schon installiert, es ging dann aber schon mit numpy und scipy das für Bilder zu berechnen...

Irgendwelche Tipps/Hinweise wie man das besser lösen könnte (gerne auch ohne OpenCV!) sind gern gesehen!
 
Moin,

einige Videos kannst du direkt mit OpenCV öffnen und Frame für Frame verarbeiten (Welche Codecs weiß ich leider nicht). Wenn das ganze mit "allen" Codecs laufen soll muss aber wohl wirklich ffmpeg oder ähnliches her. Eine spontane Google-Suche hat aber das hier aufgewühlt: Link. Das scheint doch genau das zu sein was du möchtest, oder? Damit kann man direkt eine Datei via ffmpeg öffnen und einzelne Frames anfordern.

Gruß
 
Da fallen mir gleich zwei mögliche Lösungen ein.

1) Ich weiß nicht, ob es die auch unter Windows gibt, aber unter Linux würde man eine named pipe / fifo benutzen. Das ist eine Pipe für die eine künstliche Datei erzeugt wird und die auch so angesprochen werden kann.

2) Ich habe gesehen, dass OpenCV die VfW Schnittstelle benutzt um das Video zu öffnen. Deswegen ist Avisynth wohl die perfekte Lösung für dich. Eine Avisynth Scriptfile lässt sich von jeder VfW-kompatiblen Software wie eine Videodatei öffnen. Der Frameserver lädt dann über verschiedene Quellfilter die Datei und übergibt die Bilder im Raw-Format an die Software. Der Quellfilter übernimmt falls nötig auch die Indexierung der Quelldatei, so dass es selbst bei komplexen Formaten wie H.264 framegenau arbeiten kann.
 
Zuletzt bearbeitet:
Also normalerweise benutzt OpenCV ffmpeg zum Videos öffnen. Muss aber beim selberkompilieren angegeben werden. Die Binärversion für Windows enthält jedenfalls auch ffmpeg. Und bei mir klappt es auch problemlos bspw. DIVX zu öffnen und auch Frames einzeln anzuspringen mit set(CV_CAP_PROP_POS_FRAMES, nummer_des_frames) auf dem VideoCapture Objekt. Wenn du also OpenCV selber kompiliert hast, würde ich mal die Compilerflags checken. Und wenn du unter Linux ein Distributionspaket genommen hast, würde ich an deiner Stelle mal checken, ob die es gegen ffmpeg gelinkt haben. (am besten mal im Paketmanager schauen, ob ffmpeg als Abhängigkeit vom OpenCV angegeben ist oder so).
 
erebos schrieb:
Eine spontane Google-Suche hat aber das hier aufgewühlt: Link. Das scheint doch genau das zu sein was du möchtest, oder? Damit kann man direkt eine Datei via ffmpeg öffnen und einzelne Frames anfordern.

pyffmpeg ist leider seit bald 2 Jahren nicht mehr aktualisiert worden, nicht wirklich dokumentiert und scheint so ein bisschen im ewigen Alphastatus rumzugammeln - aber ist eine Möglichkeit, danke für's googlen! :)

Limit schrieb:
1)named pipe

2) Avisynthscript

1) Offenbar kann Windows sowas auch, gleich mal weiterlesen/googlen. Startpunkt, falls jemand ähnliche Probleme hat: http://en.wikipedia.org/wiki/Named_pipe#In_Windows

2) werde ich mich ebenfalls mal einlesen, danke für den Tip!

geisterfahrer schrieb:
Also normalerweise benutzt OpenCV ffmpeg zum Videos öffnen.

Hm, gleich nochmal checken... mir scheint es jedoch, als würde da echt nur VfW verwendet. Ich verwende die aktuelle 2.4.3 von opencv.org unter Windows 7 mit Python 2.7 und es scheint da durchaus etwas heikel bezüglich Inputformat zu sein.

Ich bin mir auch nicht sicher, was OpenCV dann macht, wenn man ihm ein VFR (variable frame rate) Video vorsetzt... daher werde ich wohl erstmal Avisynth genauer anschauen - aber ja, theoretisch sollte ffmpeg in OpenCV das ja erledigen. Wieso es das nicht tut? Keine Ahnung...
 
Zurück
Oben