[OpenCV] Récuperer le flux video d'une camera

Messages postés
16
Date d'inscription
mercredi 22 février 2006
Statut
Membre
Dernière intervention
4 juin 2007
- - Dernière réponse : jimnastiq
Messages postés
16
Date d'inscription
mercredi 22 février 2006
Statut
Membre
Dernière intervention
4 juin 2007
- 8 févr. 2007 à 11:52
Salut,

voila je cherche a recupérer le flux video d'une camera sans
fil! pour vous donner le contexte j'ai un recepteur qui capte le signal
de la camera et qui le transmet a une carte d'acquisition qui est relié
au PC(sous Win XP) par l'USB.


Donc j'ai un code qui tente de récupérer le flux video mais seulement il ne trouve pas ce flux , voici le code :

#include <highgui.h>

void main()
{
     /* Variables */
     IplImage *im;
     IplImage *im2;
     CvCapture *avi;
     int i = 0;
     /* Ouverture de la video */
     avi = cvCaptureFromCAM(-1);
     cvNamedWindow("Ma fenetre", CV_WINDOW_AUTOSIZE);
     while(cvGrabFrame(avi))
     {                 
      im = cvRetrieveFrame(avi);
      /* Traitement de l’image */
      cvWaitKey(40);
      cvShowImage("Ma fenetre", im);  
     }     
     cvWaitKey(0);
}

avec ce code la fenetre reste grise alors j'ai cherché des codes sur le net et je suis tombé sur celui ci mais avec celui ci j'ai le message d'erreur qui me dit qu'il ne trouve pas le flux :

#include <cv.h>
#include <cvaux.h>
#include <highgui.h>
#include <stdio.h>

void on_mouse(int event, int x, int y, int flags, void *param)
{
    switch(event)
    {
        case CV_EVENT_LBUTTONDOWN: printf("MouseLeftButtonDown x= %d y= %d\n",x,y);break;
        case CV_EVENT_RBUTTONDOWN: printf("MouseRightButtonDown x= %d y= %d\n",x,y);break;
    }
}

int main()
{
    CvCapture* capture=cvCaptureFromCAM(0);
    cvNamedWindow("Capture Webcam", CV_WINDOW_AUTOSIZE);
    cvNamedWindow("Lissage Gaussien", CV_WINDOW_AUTOSIZE);
    cvSetMouseCallback("Capture Webcam",on_mouse,0);

    if(capture)
    {
        IplImage* frame=cvQueryFrame(capture);
        int width = (int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH );
        int height= (int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT);
        IplImage* gray     = cvCreateImage(cvSize(width,height), IPL_DEPTH_8U ,1);
        IplImage* gaussian = cvCreateImage(cvSize(width,height), IPL_DEPTH_8U ,1);
   
        printf("PRESS SPACE TO QUIT \n\n");
       
        while(1)
        {
            frame = cvQueryFrame(capture);
            cvShowImage("Capture Webcam",frame);
            cvConvertImage(frame,gray,1);
            cvSmooth(gray,gaussian,CV_GAUSSIAN,5,5);
            cvShowImage("Lissage Gaussien",gaussian);
            if(cvWaitKey(1)==' ')break;
        }
    }
    else printf("Video stream not found\n\n");
    cvWaitKey(0);
    return 0;
}
Afficher la suite 

12 réponses

Meilleure réponse
Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
1
1
Merci
Alors, la, je sais pas, le code que je t'ai filé marche tres bien chez moi.
En plus, je vois pas comment ce code fonctionne sans CvCapture* camera = cvCaptureFromCAM(0);

Dire « Merci » 1

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 200 internautes nous ont dit merci ce mois-ci

Commenter la réponse de turnerom
Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
1
0
Merci
Change dans ta ligne
avi = cvCaptureFromCAM(-1);

-1 par 0, 1, 2, ... 9 jusqu'à ce que tu trouve un flux.
Commenter la réponse de turnerom
Messages postés
16
Date d'inscription
mercredi 22 février 2006
Statut
Membre
Dernière intervention
4 juin 2007
0
Merci
Merci pour ta réponse mais ce ne fonctionne pas!

d'ailleurs '-1' devrait fonctionner car cj'ai lu qu'avec une seul camera cela fonctionne ...

sinon penses tu que c'est un probleme de driver avec la camera, ou un probleme de compatibilité openCV-camera?
Commenter la réponse de jimnastiq
Messages postés
16
Date d'inscription
mercredi 22 février 2006
Statut
Membre
Dernière intervention
4 juin 2007
0
Merci
j'ajoute tout de meme qu'avec certaine valeurs avant de m'afficher une fenetre grise on me demande de selectionner ma source video avec dans la liste ma camera! donc il l'a reconnait non?
Commenter la réponse de jimnastiq
Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
1
0
Merci
Ok, mais question bete, tu arrive à l'afficher correctement avec windows (si tu l'ouvre avec l'application livré avec)?
Commenter la réponse de turnerom
Messages postés
16
Date d'inscription
mercredi 22 février 2006
Statut
Membre
Dernière intervention
4 juin 2007
0
Merci
oui sous msn et sous studio 10 la camera fonctionne! une idée du probleme?
Commenter la réponse de jimnastiq
Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
1
0
Merci
Essaye avec ce bout de code qui marche chez moi ( en faisant varier la valuer de cvCaptureFromCAM(0);)

ps : laisse appuyé sur la touche 'c' pour acquérir la vidéo

_________________________________________________________________

// C++ includes.
#include

// OpenCV includes.
#include <cv.h>
#include <highgui.h>

void printCamResolution(CvCapture* camera)
{
std::cout << std::endl;
std::cout << "Camera Capture Resolution:" << std::endl;
std::cout << "=================" << std::endl;
std::cout << "Video width: " << cvGetCaptureProperty(
camera, CV_CAP_PROP_FRAME_WIDTH) << std::endl;
std::cout << "Video height: " << cvGetCaptureProperty(
camera, CV_CAP_PROP_FRAME_HEIGHT) << std::endl;
std::cout << std::endl;
}

int main(int argc, char* argv[])
{
// Tell OpenCV to capture data from a camera.
CvCapture* camera = cvCaptureFromCAM(0);

// Print the camera's properties.
printCamResolution(camera);

// Create a window with the given name (displayed at the top of the
// window). Also, we'll make it automatically resize to whatever content
// it displays.
cvNamedWindow("My Window", CV_WINDOW_AUTOSIZE);

// Loop forever until the user quits.
while(1)
{
// This will return the code of the pressed key or -1 if
// nothing was pressed before 10 ms elapsed.
int keyCode = cvWaitKey(10);

if ('c' == (char)keyCode)
{
// The user pressed 'c' (for 'capture').

// Get the latest image from the camera. This
// image should NOT be released manually.
IplImage* image = cvQueryFrame(camera);

// Make the image show up in the named window.
cvShowImage("My Window", image);

// Save the image to a file.
static int imageCount = 0;
char filename[32];
sprintf(filename, "image%d.png", imageCount);
cvSaveImage(filename, image);
++imageCount;
}
else if(keyCode >= 0)
{
// A non-capture key was pressed, so end the loop.
break;
}
}

// Destroy the capture object and the window.
cvReleaseCapture(&camera);
cvDestroyWindow("My Window");

return 0;
}
Commenter la réponse de turnerom
Messages postés
16
Date d'inscription
mercredi 22 février 2006
Statut
Membre
Dernière intervention
4 juin 2007
0
Merci
j'ai testé mais toujours pareil il me demande la source video je selectionne la cam et une fentre grise s'affiche, puis quand j'appui sur 'c' message d'erreur NULL pointer.....

je commence a croire que la cam ne fonctionne pas avec OpenCV
Commenter la réponse de jimnastiq
Messages postés
16
Date d'inscription
mercredi 22 février 2006
Statut
Membre
Dernière intervention
4 juin 2007
0
Merci
j'ai de nouvelles infos qui peuvent peut etre eclairer ta lanterne !

j'ai testé les differents algos avec une webcam "classique"(Logitech) et cela fonctionne donc je  le probleme viens de ma cam ou de la carte d'acquisition!je sais que ma cam fournit du PAL , crois tu que cela peut  etre la cause des problemes recontrés?
Commenter la réponse de jimnastiq
Messages postés
16
Date d'inscription
mercredi 22 février 2006
Statut
Membre
Dernière intervention
4 juin 2007
0
Merci
avec ce code cela fonctionne... donc openCV peut fonctionner avec ma cam mais maintenant je me demande pourquoi cela marche avec ce code et pas avec le précédent! et je me demande comment recuperer les trales avec le code qui fonctionne...

#include "cvcam.h"
#include "highgui.h"

int ShowCamVideo(HWND hwnd, int width, int height)
{
    VidFormat vidFmt={ width, height, 30.0};

    int ncams = cvcamGetCamerasCount( );
    cvcamSetProperty(0, CVCAM_PROP_ENABLE, CVCAMTRUE);
    cvcamSetProperty(0, CVCAM_PROP_CALLBACK,0);
    cvcamSetProperty(0, CVCAM_PROP_WINDOW, &hwnd);  

    //Set Video Format Property
    cvcamSetProperty( 0, CVCAM_PROP_SETFORMAT, &vidFmt);

    if( !cvcamInit() )
        return 0;
    cvcamStart();
    return 1;
}

int main( int argc, char** argv )
{
    cvNamedWindow("cvcam window", CV_WINDOW_AUTOSIZE);
    if( ShowCamVideo((HWND)cvGetWindowHandle("cvcam window"), 640, 480) )
    {
        cvWaitKey(0);
        cvcamStop();
    }
    cvcamExit();
}
Commenter la réponse de jimnastiq
Messages postés
16
Date d'inscription
mercredi 22 février 2006
Statut
Membre
Dernière intervention
4 juin 2007
0
Merci
je rajoute qu'a la ligne : cvcamSetProperty(0, CVCAM_PROP_CALLBACK,0);

le dernier parametre etait callback mais j'avais une erreur de compil du genre invalid conversion  from `void (*)(IplImage*)' to `void*'

pourtant c'est avec ce callback que l'on peut recuperer les trames
Commenter la réponse de jimnastiq
Messages postés
16
Date d'inscription
mercredi 22 février 2006
Statut
Membre
Dernière intervention
4 juin 2007
0
Merci
ok bon ben c'est un mystere alors! en fait avec cvcam j'y arrive mais je semble etre le seul au monde a avoir un compilateur qui rechigne sur le callback!!

en tout cas merci beaucoup pour ton aide
Commenter la réponse de jimnastiq