IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenCV Discussion :

Vidéo couleur transformée en niveaux de gris


Sujet :

OpenCV

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 421
    Par défaut Vidéo couleur transformée en niveaux de gris
    Bonjour à tous,

    J'ai écrit un programme qui prend en entré une vidéo couleur et qui en sortie fournit une vidéo en niveau de gris. Mon souci c'est que la transformation en niveau de gris fonctionne mais la vidéo résultante est divisé en 3.
    Je ne comprends pourquoi j'ai ce problème pouvez-vous m'aidez svp ?

    voici mon code source :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    31
    32
    33
    34
    35
    36
     
     
     
    #include<opencv/cv.h>
     #include<opencv/highgui.h>
     
     int main( int argc, char* argv[])
    {
             CvCapture* capture = 0;
             capture = cvCreateFileCapture( argv[1] );
     
            if(!capture)
                    return(-1);
           IplImage* bgr_frame = cvQueryFrame(capture); // initialisation du lecteur                                                                   
            double fps = cvGetCaptureProperty( capture, CV_CAP_PROP_FPS) ; // fps donne la vitesse de deroulement des frames                            
     
            CvSize size = cvSize( (int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH),
                                  (int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT));
     
            CvVideoWriter *writer = cvCreateVideoWriter( argv[2], CV_FOURCC('P','I','M','1'), fps, size,0);
            IplImage* gray_frame = cvCreateImage( size, IPL_DEPTH_8U,1);
     
            // chaque frame est transformee en image gris                                                                                               
           while((bgr_frame = cvQueryFrame(capture)) != NULL)
                    {
                            cvCvtColor(bgr_frame, gray_frame, CV_RGB2GRAY);;
     
     
                            cvWriteFrame( writer, gray_frame );
                    }
            // liberation de la memoire                                                                                                                 
            cvReleaseVideoWriter(&writer);
            cvReleaseImage( &gray_frame );
            cvReleaseCapture( &capture );
            return(0);
    }
    le message d'erreur qui s'affiche est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Output #0, mpeg, to 'tata.mpeg':
        Stream #0.0: Video: mpeg1video (hq), yuv420p, 480x360, q=2-31, 11059 kb/s, 90k tbn, 29.97 tbc
    [mpeg @ 0xd12520] VBV buffer size not set, muxing may fail

  2. #2
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Bonjour,

    Tu es passé d'un codage 32 (ou 24 (si tes données sont réellement 3 fois plus petites)) bits (couleurs) à un codage 8 bits (niveaux de gris), d'où ton soucis à mon avis. A toi de tenir compte de ce changement lorsque tu veux afficher ou manipuler cette nouvelle image.

    Bon courage

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 421
    Par défaut
    Hi,

    J'y ai pensé mais en fait le problème était tout autre. Il semblerait que la fonction cvCreateVideoWriter ne supporte pas les images à un seul canal (ce qui est bizarre).
    J'ai modifié en conséquence mon code qui fonctionne maintenant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
     #include<stdio.h>
     #include<stdlib.h>
     #include<string.h>
     #include<opencv/cv.h>
     #include<opencv/highgui.h>
     
     
     int main( int argc, char* argv[])
    {
     
            CvCapture* capture = 0;
            capture = cvCreateFileCapture( argv[1] );
     
            if(!capture)
                    return(-1);
     
            IplImage* bgr_frame = cvQueryFrame(capture); // initialisation du lecteur                                                                   
            double fps = cvGetCaptureProperty( capture, CV_CAP_PROP_FPS) ; // fps donne la vitesse de deroulement des frames                            
     
            CvSize size = cvSize( (int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH),
                                  (int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT));
     
            CvVideoWriter *writer = cvCreateVideoWriter( argv[2], CV_FOURCC('P','I','M','1'), fps, size,1);
            IplImage* gray_frame = cvCreateImage( size,bgr_frame->depth,1);
            IplImage* out_frame =  cvCreateImage( size,bgr_frame->depth,3);
     
     
            // chaque frame est transformee en image gris                                                                                               
            while((bgr_frame = cvQueryFrame(capture)) != NULL)
                    {
                            cvCvtColor(bgr_frame, gray_frame, CV_RGB2GRAY);
                            cvCvtColor(gray_frame, out_frame, CV_GRAY2RGB);
                            cvWriteFrame( writer, out_frame );
                    }
            // liberation de la memoire                                                                                                                 
            cvReleaseVideoWriter(&writer);
            cvReleaseImage( &gray_frame );
             cvReleaseImage( &out_frame );
           cvReleaseCapture( &capture );
            return(0);
    }

Discussions similaires

  1. Réponses: 18
    Dernier message: 20/10/2009, 16h39
  2. Réponses: 3
    Dernier message: 26/01/2009, 11h13
  3. transformation de niveaux de gris
    Par said sliman dans le forum Images
    Réponses: 2
    Dernier message: 13/01/2009, 16h43
  4. Savoir si une image est en couleur ou en niveaux de gris
    Par abir2007gallas dans le forum Images
    Réponses: 3
    Dernier message: 24/04/2008, 13h02
  5. transformer les niveaux De gris de l'image
    Par inès83 dans le forum Traitement d'images
    Réponses: 5
    Dernier message: 21/02/2008, 18h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo