Salut les développeurs!!!
Alors voilà, j'aimerais intégrer une fonction de capture vidéo à partir de la webcam dans une interface GTK+. La capture vidéo se faisant par OpenCV.
Etant donner qu'un programme GTK+ entre dans une boucle infini, qui ne s'arrête que lorsqu'on quitte le programme, je ne pouvais pas faire une boucle pour la capture vidéo via OpenCV. J'ai donc dû intégrer une fonction ne capturant qu'une seule image qui serait appelée périodiquement pour avoir un flux vidéo. A chaque appel de cette fonction, l'idée serait de sauvegarder l'image puis de l'afficher dans la GUI par le biais de GtkImage.
Voici mon code :
- Pour la capture de l'image :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| // Capture video avec openCV
guint cameraCapture (void)
{
// CvCapture* capture = cvCaptureFromCAM(0); // capture from video device #0
CvCapture* capture = cvCreateCameraCapture(0); // cree une capture
IplImage* img = 0;
/// Capture avec la webcam
// Capture d'une image et verification si la capture s'est bien deroulee
if (!cvGrabFrame(capture))
{
printf("Could not grab a frame\n\7");
}
else
{
// Recuperation de l'image capturer
img=cvRetrieveFrame(capture);
// Si l'image a ete capturee correctement, l'afficher avec un delai de x ms
if (img)
{
// Sauvegarde l'image
cvSaveImage("camera.jpg", img);
}
cvReleaseCapture(&capture);
capture = NULL;
}
return TRUE;
} |
- Pour l'intégration dans l'interface :
g_timeout_add(40, (GSourceFunc)cameraCapture, NULL);
J'appel ma fonction toute les 40 ms donc.
Le problème est que l'intégration de ma fonction dans la boucle évènementielle de GTK+ fige le GUI et on ne peut plus rien faire ...
Je n'ai pas coder l'affichage de l'image dans l'interface étant donnée que celle-ci est figée ...
Ma question est la suivante : Comment faire pour intégrer un flux vidéo venant d'OpenCV dans une interface graphique GTK+?
J'ai l'idée d'intégrer un boutton d'activant et désactivant cette intégration de la fonction dans la boucle évènementielle. Si j'ai bien lu la documentation de la Glib concernant les boucles évènementielles, je devrais utiliser g_source_remove (); c'est bien ça?
Je vous remercie d'avance.
Kurapix
Partager