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 :

Convertion YUYV en rgb


Sujet :

OpenCV

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 560
    Points : 71
    Points
    71
    Par défaut Convertion YUYV en rgb
    Bonjour,

    Je souhaite acquérir des images de ma webcam. J'utilise pour cela la librairie unicap car sinon avec opencv je ne peux pas avoir les images en pleine résolution.

    La librairie me dit ca pour ma caméra:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	Formats[1]:
    		YUV 4:2:2 (YUYV) ( YUYV )
    			FOURCC: YUYV
    			size: 1280x1024x16
    			size_count: 7
    				640x480
    				352x288
    				320x240
    				176x144
    				160x120
    				1280x800
    				1280x1024
    Je voudrais savoir si il existe une fonction sous Opencv pour transformer le format YUV 4:2:2 en RGB ou une astuce? Ou bien je suis obliger de refaire du code pour transformer ca?


    D'avance merci.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 560
    Points : 71
    Points
    71
    Par défaut
    Bon j'ai fait quelques testes.

    Voila le programme que j'ai créé pour transformée de yuv422 en rgb:
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
     
    typedef struct
    {
        uchar R,G,B;
    }Pixel;
     
    Pixel convertYUVtoRGB(int y, int u, int v) {
        int r,g,b;
        int value;
        Pixel   P;
     
        //printf("y   %d  u   %d v    %d  avant\n",y,u,v);
        y=y*255.0/65535-16;
        u=u*255.0/65535-128;
        v=v*255.0/65535-128;
     
        //printf("y   %d  u   %d v    %d  apres\n",y,u,v);
        r = y + (int)(1.402f*u);
        g = y - (int)(0.344f*v + 0.714f*u);
        b = y + (int)(1.772f*v);
        r = r>255? 255: r<0 ? 0 : r;
        g = g>255? 255 : g<0 ? 0 : g;
        b = b>255? 255 : b<0 ? 0 : b;
     
        P.R =   r;
        P.G =   g;
        P.B =   b;
     
        //printf("r   %d  g   %d b    %d\n",r,g,b);
     
        return P;
    }
     
     
        int i,j,pos_1,frame_size;
        uint16_t *src;
        uchar  * dst;
     
         IplImage *Frame=cvCreateImage( cvSize( 640, 480 ), IPL_DEPTH_8U, 3 );
     
         dst = (uchar *)Frame->imageData;
         src = (uint16_t *)buffer->data;
     
      for(i=0,j=0; i<frame_size; i=i+4)
            {
     
                Y1  =   src[i];
                U   =   src[i+1];
                Y2  =   src[i+2];
                V   =   src[i+3];
     
                P       =   convertYUVtoRGB(Y1,U,V);
                dst[j]  =   P.R;
                j++;
                dst[j]  =   P.G;
                j++;
                dst[j]  =   P.B;
                j++;
     
                P   =   convertYUVtoRGB(Y2,U,V);
     
                dst[j]  =   P.R;
                j++;
                dst[j]  =   P.G;
                j++;
                dst[j]  =   P.B;
                j++;
     
            }
     
            cvShowImage( "COULEUR",Frame );
            cvWaitKey( 10 );

    Voici le genre d'image que j'obtiens:

    Pas tres concluant...

    En fait j'ai plutot l'impression que c'est que BAYER donc j'ai refait un programme:

    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
     
     
        int i,j,pos_1,frame_size;
        uint16_t *src;
        uchar  * dst;
     
     
     
        unicap_property_t property, property_spec;
     
     
     
            frame_size= camerasC.CameraBUFFER.TFrame[camerasC.CameraBUFFER.head].Frame->width*camerasC.CameraBUFFER.TFrame[camerasC.CameraBUFFER.head].Frame->height;
     
            IplImage *Frame=cvCreateImage( cvSize( 640, 480 ), IPL_DEPTH_8U, 1 );
     
            dst = (uchar *)Frame->imageData;
            src = (uchar *)buffer->data;//camera->image->imageData;
     
            for(i=0,j=0; i<frame_size; i++)
            {
               dst[i]  =  src[i];
            }
     
     
            cvCvtColor( Frame,camerasC.CameraBUFFER.TFrame[camerasC.CameraBUFFER.head].Frame, CV_BayerGB2RGB );
     
            cvShowImage( "COULEUR",camerasC.CameraBUFFER.TFrame[camerasC.CameraBUFFER.head].Frame );
            cvWaitKey( 10 );
    La j'obtiens une image de la bonne taille mais en noir et blanc (enfin on dirais ..)


    J'ai essayé plein de possibilité mais la je suis bloqué ...
    Si quelqu'un pouvait m'aider ..
    Images attachées Images attachées   

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Février 2011
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2011
    Messages : 147
    Points : 180
    Points
    180
    Par défaut
    Bonjour,

    Pour commencer, tu devrais utiliser des Mat et pas des IplImage qui sont deprecated dans opencv (ou ne voix de l'etre)

    Sinon regarde la fonction cvtColor. Il me semble qu'elle fait la conversion pour toi
    CvtColor pour opencv

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 560
    Points : 71
    Points
    71
    Par défaut
    En fait j'utilise la librairie unicap qui est disponible seulement en C. Je dois utiliser cette librairie parce que sous Opencv on ne peut pas gérer les périphérique pour changer le format des images.

    Donc je vais être obligé d'utiliser un IplImage ...
    Ensuite OpenCV fait effectivement les conversions de YUV vers RGB mais seulement de YUV au format 444 et pas au format 422 donc la aussi je suis obligé de faire du code pour gérer ce format.

Discussions similaires

  1. Convertion RGB/HEXA et HEXA/RBG
    Par Electroniktor dans le forum Traitement d'images
    Réponses: 1
    Dernier message: 18/05/2008, 01h48
  2. Changer les couleurs de la palette avec du RGB
    Par le mage tophinus dans le forum x86 16-bits
    Réponses: 11
    Dernier message: 13/01/2003, 08h55
  3. [Kylix] RGB d'un pixel
    Par Kusanagi dans le forum EDI
    Réponses: 1
    Dernier message: 13/11/2002, 20h33
  4. Convertion de type VARIANT à type CString
    Par j_grue dans le forum MFC
    Réponses: 2
    Dernier message: 07/11/2002, 14h18
  5. TObject->Color et composantes RGB
    Par Flo. dans le forum C++Builder
    Réponses: 10
    Dernier message: 14/06/2002, 17h07

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