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

Signaler
Messages postés
16
Date d'inscription
mercredi 22 février 2006
Statut
Membre
Dernière intervention
4 juin 2007
-
Messages postés
16
Date d'inscription
mercredi 22 février 2006
Statut
Membre
Dernière intervention
4 juin 2007
-
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;
}

12 réponses

Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
1
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);
Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
1
Change dans ta ligne
avi = cvCaptureFromCAM(-1);

-1 par 0, 1, 2, ... 9 jusqu'à ce que tu trouve un flux.
Messages postés
16
Date d'inscription
mercredi 22 février 2006
Statut
Membre
Dernière intervention
4 juin 2007

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?
Messages postés
16
Date d'inscription
mercredi 22 février 2006
Statut
Membre
Dernière intervention
4 juin 2007

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?
Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
1
Ok, mais question bete, tu arrive à l'afficher correctement avec windows (si tu l'ouvre avec l'application livré avec)?
Messages postés
16
Date d'inscription
mercredi 22 février 2006
Statut
Membre
Dernière intervention
4 juin 2007

oui sous msn et sous studio 10 la camera fonctionne! une idée du probleme?
Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
1
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;
}
Messages postés
16
Date d'inscription
mercredi 22 février 2006
Statut
Membre
Dernière intervention
4 juin 2007

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
Messages postés
16
Date d'inscription
mercredi 22 février 2006
Statut
Membre
Dernière intervention
4 juin 2007

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?
Messages postés
16
Date d'inscription
mercredi 22 février 2006
Statut
Membre
Dernière intervention
4 juin 2007

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();
}
Messages postés
16
Date d'inscription
mercredi 22 février 2006
Statut
Membre
Dernière intervention
4 juin 2007

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
Messages postés
16
Date d'inscription
mercredi 22 février 2006
Statut
Membre
Dernière intervention
4 juin 2007

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