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

jimnastiq Messages postés 16 Date d'inscription mercredi 22 février 2006 Statut Membre Dernière intervention 4 juin 2007 - 6 févr. 2007 à 17:49
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;
}
A voir également:

12 réponses

turnerom Messages postés 492 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 12 janvier 2012 1
8 févr. 2007 à 11:46
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);
1
turnerom Messages postés 492 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 12 janvier 2012 1
7 févr. 2007 à 11:21
Change dans ta ligne
avi = cvCaptureFromCAM(-1);

-1 par 0, 1, 2, ... 9 jusqu'à ce que tu trouve un flux.
0
jimnastiq Messages postés 16 Date d'inscription mercredi 22 février 2006 Statut Membre Dernière intervention 4 juin 2007
7 févr. 2007 à 11:38
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?
0
jimnastiq Messages postés 16 Date d'inscription mercredi 22 février 2006 Statut Membre Dernière intervention 4 juin 2007
7 févr. 2007 à 11:49
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?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
turnerom Messages postés 492 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 12 janvier 2012 1
7 févr. 2007 à 11:56
Ok, mais question bete, tu arrive à l'afficher correctement avec windows (si tu l'ouvre avec l'application livré avec)?
0
jimnastiq Messages postés 16 Date d'inscription mercredi 22 février 2006 Statut Membre Dernière intervention 4 juin 2007
7 févr. 2007 à 13:18
oui sous msn et sous studio 10 la camera fonctionne! une idée du probleme?
0
turnerom Messages postés 492 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 12 janvier 2012 1
7 févr. 2007 à 14:07
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;
}
0
jimnastiq Messages postés 16 Date d'inscription mercredi 22 février 2006 Statut Membre Dernière intervention 4 juin 2007
7 févr. 2007 à 14:38
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
0
jimnastiq Messages postés 16 Date d'inscription mercredi 22 février 2006 Statut Membre Dernière intervention 4 juin 2007
7 févr. 2007 à 15:14
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?
0
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 à 09:23
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();
}
0
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 à 09:41
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
0
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
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
0
Rejoignez-nous