Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 14/03/2011, à 12:53

pem1664

opencv utilisation de 2 webcam simultanément

Salut a tous,
dans le cadre d'un projet j'essai de visualiser 2 webcam identiques  simultanément, pour ce j'utilise une classe qui utilise les librairies d'opencv et qui fonctionne tres bien avec une seule webcam.
ma classe c'est ca:

Init::Init (IplImage* src1, CvCapture* capture, IplImage* src2, CvCapture* capture1)
{

        capture = cvCreateCameraCapture( 0 );
        capture1 = cvCreateCameraCapture( 1 );
        cvNamedWindow("Cam1", CV_WINDOW_AUTOSIZE);
        cvNamedWindow("Cam2", CV_WINDOW_AUTOSIZE);

        printf ("initialisation ok vue normale CAM1\n");
        printf ("initialisation ok vue normale CAM2\n");

        // Tant qu'on n'a pas appuyé sur Q, on continue :
        while(key != 'q')
        {
        src1= cvRetrieveFrame( capture );
        src2= cvRetrieveFrame( capture1 );
        cvShowImage( "Cam1", src1 );
        cvShowImage( "Cam2", src2 );
        key = cvWaitKey(10);
        if (!cvGrabFrame( capture))
            key ='q';
        key = cvWaitKey(10);
        if (!cvGrabFrame( capture1 ))
            key ='q';
        }
            // On détruit les fenêtres créées : nouvelle fonction ;)
            cvDestroyAllWindows();


            // On n'a pas besoin de détruire l'image.
            src1=src2 = NULL;

            // On détruit la capture
            cvReleaseCapture( &capture );
            // On détruit la capture
            cvReleaseCapture( &capture1 );


}

le probleme c'est que lors de l'utilisation de : if (!cvGrabFrame( capture)).
Soit il ne m'affiche qu'une des 2 webcam et refuse de faire un cvGrabFrame (capture1), soit il essaie de faire les 2 et la j'ai une erreur disant que l'espace est plein..
le message d'erreur c'est :
VIDIOC_STREAMON : aucun espace disponible sur le périphérique
de ce que j'ai compris c'est la fonction cvGrabFrame qui a déja recu ses données et qui refuse de récupérer une autre frame.

si quelqu'un a une solution SVP!


Pas de problème sans solutions, mettre [résolu] dans son premier post permet de rechercher plus facilement une solution... ;)

Hors ligne

#2 Le 17/03/2011, à 14:17

Karl_le_rouge

Re : opencv utilisation de 2 webcam simultanément

Sans plus d'informations, je ne peux guère que te donner quelques pistes:
1. visiblement, tu utilises OpenCV 1.x qui a un support merdique des caméras  ==> passe à OpenCV 2.x qui a un support plus robuste.
2. l'ordre des opérations c'est Grab puis Retrieve pas l'inverse. Et
3. OpenCV 2.x a une "vraie" API C++, oublie l'API C qui est pourrie.
4. le message d'erreur semble indiquer que tu utilises le pilote v4l qui est pourri
* tu  peux forcer l'utilisation d'un pilote moins pourri comme unicap, c'est simple tu remplaces index de la caméra par CV_CAP_UNICAP + index
* tu  peux utiliser le wrapper de compatibilité v4l1/v4l2 de Hans de Goede via LD_PRELOAD=/usr/lib64/libv4l/v4l1compat.so

Hors ligne

#3 Le 18/03/2011, à 09:17

pem1664

Re : opencv utilisation de 2 webcam simultanément

Hello, merci pour ta réponse, qui m'ammene a poser d'autre questions:
tu me parles d'Opencv 1.x et 2.x, j'ai installé opencv via

 sudo apt-get install libcv-dev libcv4 libcvaux-dev libcvaux-dev libcvaux4 libhighgui-dev libhighgui4 opencv-doc 

Comment puis-je savoir quelle version d'opencv j'utilise? et les fonctions que j'utilise sont elles les meme? (comme  cvGrabFrame ou autre par exemple)
J'ai bien noté l'inversion a faire entre grab et retreive, merci.
Quand tu me dis que je peux forcer l'utilisation d'un pilote,

Karl_le_rouge a écrit :

tu remplaces index de la caméra par CV_CAP_UNICAP + index
* tu  peux utiliser le wrapper de compatibilité v4l1/v4l2 de Hans de Goede via LD_PRELOAD=/usr/lib64/libv4l/v4l1compat.so

Pourrais-tu me détailler ca stp, je ne comprend pas trop qu'est ce que je dois remplacer par CV_CAP_UNICAP + index? capture = cvCreateCameraCapture( 0 ); ?
J'ai depuis modifié mon code :

#include <iostream>
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <stdlib.h>
#include <stdio.h>
#include <string>
#include  <cstring>
#include <sstream>

//........................................classes
#include "tRs232.h"
#include  "serpent.h"
//#include  "Initwebcam.h"



using namespace std;
//int cam;
//char num;

int main()
{
    cout << "Start \n" << endl;

    //................................................VIDE0

    //déclarations

    IplImage* src1;
    CvCapture* capture;


    //................................................RS232

    //déclarations

    /*char pPort[20]="/dev/ttyUSB0";
    int Vitesse=BPS9600;
    int NbBits=BIT8;
    int Parite=PAS_DE_PARITE;
    int NbStop=STOP2;


    //...............................................SERPENT

    //Déclarations
    char Chaine[5];
    char carte[1],M1[1],M2[1];
    char SM[3]="SM";
    int i;

    */
    //................................................Serpent




    //................................................VIDE0
    //fonctions/classes

char key = '0';
char key2 = '0';
int cam = 0;
char *num;
num="0";
    while  (key != 'q')
        {
            //...............................................Init Webcam

        capture = cvCreateCameraCapture( cam );
        printf("valeur de num %s \n",num);
        printf("valeur de cam %d \n",cam);
        cvNamedWindow(num, CV_WINDOW_AUTOSIZE);
        //cvNamedWindow("cam", CV_WINDOW_AUTOSIZE);
        printf ("initialisation ok vue normale CAM%d\n",cam);

        // Tant qu'on n'a pas appuyé sur Q, on continue :
        while(key2 != 'o')
                {
                // On essaye de capturer la frame suivante
                if(!cvGrabFrame( capture ))
                    key2 = 'o';
                printf ("Affichage Camera %d\n",cam);
                src1= cvRetrieveFrame( capture );
                cvShowImage(num, src1 );
                // On attend 10 ms : IMPORTANT !
                key2 = cvWaitKey(10);
                key2='o';
                }
            printf ("fin tramme Camera %d\n",cam);

            //cvDestroyAllWindows();
            if (cam==0)
            cam = 1;
            else cam = 0;
            if (num=="0")
            num ="1";
            else num ="0";
            key2='0';
            // On détruit les fenêtres créées : nouvelle fonction ;)



            // On n'a pas besoin de détruire l'image.
            //src1= NULL;


            // On détruit la capture
            cvReleaseCapture( &capture );
        }

        return 0;

    //return 0;
}

J'essai de faire ouvrir 2 fenetres portant chacune le nom de la camera (0 ou 1) j'ai essayé en utilisant strcat dans les fonction   cvNamedWindow et   cvShowImage mais je devais passer par 2 conversions int>string puis string>char* et ca ne fonctionnait pas (enfin je n'y suis pas arrivé) d'ou ce test de charactere "impropre"...
Je me remet au C/C++ et je t'avoue que j'ai du mal a me dérouiller...
Merci pour ton aide.
Edit : bon ca y est j'arrive bien a voir les 2 caméra simultanément, en revanche j'ai un probleme de fluidité de l'image.

Dernière modification par pem1664 (Le 18/03/2011, à 14:51)


Pas de problème sans solutions, mettre [résolu] dans son premier post permet de rechercher plus facilement une solution... ;)

Hors ligne

#4 Le 17/10/2011, à 11:01

hounel

Re : opencv utilisation de 2 webcam simultanément

Bonjour Pem1664,
Dans ton dernier post, tu as ecrit que: "bon ca y est j'arrive bien a voir les 2 caméra simultanément, en revanche j'ai un probleme de fluidité de l'image."
Peux tu nous dire lesquels des parametres tu as finalement modifies et tu as oubtenu les deux flux videos?
Je travaille aussi  sur un projet similaire et j'ai du mal a obtenir le flux de  ma seconde webcam.
Merci

Hors ligne