L'ajout d'opencv traitement de gstreamer application
Je suis en train d'effectuer les opérations suivantes: recevoir des flux vidéo en utilisant gstreamer et le traiter avec opencv. J'ai trouvé quelques solutions, et l'un d'eux est d'écrire la vidéo (à partir de gstreamer) fifo et puis le lire à l'aide d'opencv. (OPTION3 ici MJPEG streaming et de décodage). Le problème est que je ne peux pas ouvrir le canal. cvCreateFileCapture juste ne retourne jamais. Voici une partie du code que j'ai écrit:
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");
Le programme des piles dans la dernière ligne.
PS: je suis en utilisant opencv 2.3.1.
OriginalL'auteur Roman | 2012-05-01
Vous devez vous connecter pour publier un commentaire.
. Après avoir cherché un moment, j'ai trouvé une solution, qui consiste à récupérer des données à partir de la mémoire tampon. Donc l'idée est de créer playbin et définir appsink "vidéo-récepteur". Voici l'exemple de code:
cela fonctionne.
PS. Il y a beaucoup d'infos sur cette méthode, mais j'ai passé beaucoup de temps à chercher pour cela. J'ai donc décidé de le poster ici afin de fournir au moins quelques mots clés de la recherche.
Mise à JOUR.
Et un peu plus d'informations sur la connexion de gstreamer et opencv. C'est sur la conversion de la mémoire tampon pour iplimage maintenant.
Tout d'abord, nous avons besoin de recevoir rvb tampon, de faire la conversion facile, que possible. Pour ce faire, nous allons remplacer appsinks avec appsink, connecté à ffmpegcolorspace
J'espère que cela aidera quelqu'un.
OriginalL'auteur Roman
Voici mon code source complet de la solution pour Gstreamer 1.4.0 et OpenCV 2.4.9.
Il utilise
gst_parse_launch()
pour analyser la normale de la ligne de commande que vous donneriez àgst-launch
. Pipeline Gstreamer convertit les images de RGB888 format avant de nourrir OpenCV, de sorte que la conversion est aussi facile que possible.OpenCV cadre du traitement n'est pas fait dans
new_sample()
de rappel, mais il ne récupère l'image à partir de gstreamer et pousser à la file d'attente qui alors sera consommé dans le thread principal. De cette façon, nous tapis d'appel par exemple, imshow() à partir d'OpenCV pour afficher l'image à l'écran.~150 lignes... en supprimant debug imprime etc. pourrait être réduite à <100 lignes de code.
Probablement on doit y ajouter la synchronisation des threads autour deque lecture /écriture
Pour compiler sur mac OSX /Linux fichier de créer, comme cela devrait le faire:
OriginalL'auteur Mikael Lepistö
Je ne peux pas commenter Mikael post (pas assez de points pour que).
J'ai fait quelques modifications et corrections dans le programme, vous pouvez le vérifier ici dans mon résumé.
https://gist.github.com/patrickelectric/5dca1cb7cef4ffa7fbb6fb70dd9f9edc
OriginalL'auteur Patrick José Pereira