Hinzufügen von opencv Verarbeitung gstreamer-Anwendung
Ich versuche, Folgendes zu tun: empfangen von video-Streams unter Verwendung von gstreamer und verarbeiten es mit opencv. Ich habe einige Lösungen, und einer von Ihnen ist zu schreiben, video-in (von gstreamer) fifo und dann Lesen Sie es mit opencv. (OPTION3 hier MJPEG-streaming und-Dekodierung). Das problem ist ich kann nicht öffnen Rohr. cvCreateFileCapture einfach nie zurück. Hier ist ein Teil code, den ich schrieb:
if(mkfifo("fifo.avi", S_IRUSR| S_IWUSR) == -1)
{
cout<<"Cant create fifo"<<endl;
cout<<errno<<endl;
}
loop = g_main_loop_new(NULL, false);
fsink = gst_element_factory_make("filesink", "fsink");
g_object_set(G_OBJECT(fsink), "location", "fifo.avi", NULL);
playbin = gst_element_factory_make("playbin2", "play");
g_object_set(G_OBJECT(playbin), "uri", uri.c_str(), NULL);
g_object_set(G_OBJECT(playbin), "video-sink", fsink, NULL);
bus = gst_pipeline_get_bus(GST_PIPELINE(playbin));
gst_bus_add_signal_watch(bus);
g_signal_connect(bus, "message::buffering", G_CALLBACK(&set_playbin_state), playbin);
gst_object_unref(bus);
cvNamedWindow("output", CV_WINDOW_AUTOSIZE);
capture = cvCreateFileCapture("fifo.avi");
Des Programm-stacks in der letzten Zeile.
PS: ich bin mit opencv 2.3.1.
Du musst angemeldet sein, um einen Kommentar abzugeben.
So. Nach der Suche eine Weile, ich habe eine Lösung gefunden, die beinhaltet das abrufen von Daten aus dem Puffer. Also die Idee ist, erstellen Sie playbin und setzen appsink als "video-sink". Hier ist Beispielcode:
dieser funktioniert.
PS. Es gibt eine Menge von Informationen über diese Methode, aber ich verbrachte viel Zeit mit der Suche für Sie. Also habe ich beschlossen es hier zu posten, um zumindest einige keywords zu suchen.
UPDATE.
Und ein bisschen mehr Informationen über den Anschluss gstreamer und opencv. Es geht um die Umwandlung Puffer iplimage jetzt.
Zunächst müssen wir erhalten rgb-buffer, um die Konvertierung so einfach, wie möglich. Um dies zu tun, werden wir ersetzen appsinks mit appsink, verbunden mit ffmpegcolorspace
Ich hoffe das hilft jemandem.
Hier ist mein kompletter source-code-Lösung für Gstreamer 1.4.0 und OpenCV 2.4.9.
Es nutzt
gst_parse_launch()
analysieren normalen Befehl Linie, die Sie geben würdegst-launch
. Gstreamer-pipeline konvertiert frames RGB888-format, bevor Sie Sie füttern zu OpenCV so, dass die Umstellung so einfach wie möglich.OpenCV Rahmen der Verarbeitung ist nicht in
new_sample()
callback-aber nur, packt den frame aus gstreamer und schieben Sie es in die Warteschlange, die dann verbraucht wird, in den Haupt-thread. Auf diese Weise haben wir die mat nennen, z.B. imshow() von OpenCV zum Rendern Bild auf den Bildschirm.~150 Zeilen... durch das entfernen von debug-prints usw. könnte verkürzt werden zu <100 Zeilen code.
Vermutlich sollte man hinzufügen, dass es thread-Synchronisation um deque Lesen /schreiben
Kompilieren auf OSX /Linux die make-Datei soll dies gerne tun:
Kann ich nicht kommentieren Mikael post (nicht genug Punkte).
Ich habe einige änderungen und Korrekturen in das Programm, können Sie es hier in meinem Kern.
https://gist.github.com/patrickelectric/5dca1cb7cef4ffa7fbb6fb70dd9f9edc