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 :

Afficher IplImage dans un contrôle Windows


Sujet :

OpenCV

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2003
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 103
    Par défaut Afficher IplImage dans un contrôle Windows
    Désolé, le sujet à déjà été posé plusieur fois, mais je ne trouve pas de solution qui me convienne.


    Je travail avec du C++ managé.

    J'aimerais afficher une IplImage obtenue avec openCV dans un control Window.
    Pour le moment j'utilise une PictureBox, mais suis pret a utilisé autre chose.



    Sur les différente réponse des autres sujets, je bloque toujours a un moment donnée.

    Solution 1: Utiliser cvShowImage

    La il faut que je récupere le HWND de mon control, que je récupere le nom de la fenetre et cvShowImage devrait marcher.
    Mon probleme a mon avis est de récupérer le HWND de mon control.
    J'ai testé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    IntPtr handle = pictureBoxG->Handle;
    void* phandle = handle .ToPointer();
    HWND hwd = static_cast<HWND>(phandle );
    char *winName = (char *) cvGetWindowName(hwd );
    cvShowImage(winName, imgAp3G);
     
     
    où:
    pictureBoxG est mon control : System::Windows::Forms::PictureBox
    imgAp3G est mon IplImage
    Là le nom de ma fenetre est toujours une chiane de caractere vide.




    Solution 2: créer un HBITMAP à partir de mon IplImage puis utliser la méthode FromHBitmap

    Et la le souci c'est de créer le HBitmap.
    J'ai essayé plusieurs solution mais rien n'y fait.
    Et en plus je suis sur que quelqu'un a le bout de code qui va bien, lol.

    J'ai testé
    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
     
     
    HBITMAP bmp = Convertion_BUFFER_HBITMAP ( imgAp3G->imageData, imgAp3G->width, imgAp3G->height);
    pictureBoxG->Image->FromHbitmap(bmp);
     
    HBITMAP Convertion_BUFFER_HBITMAP ( char * Buffer, long lx, long ly )
        {
            HBITMAP         hBmp, hBmpOld;
            HDC             hDC, hDC_Bmp;
            BITMAPINFO      BitmapInfo;   
     
            if (Buffer==NULL) return NULL;
     
            //Initialisation des données DI Bits
           memset ( &BitmapInfo, 0, sizeof(BITMAPINFO) );
           BitmapInfo.bmiHeader.biBitCount     = 32;
           BitmapInfo.bmiHeader.biClrImportant = 0;
           BitmapInfo.bmiHeader.biClrUsed      = 0;
           BitmapInfo.bmiHeader.biCompression  = BI_RGB;
           BitmapInfo.bmiHeader.biHeight       = ly;
           BitmapInfo.bmiHeader.biWidth        = lx;
           BitmapInfo.bmiHeader.biPlanes       = 1;
           BitmapInfo.bmiHeader.biSize         = sizeof(BITMAPINFOHEADER);
           BitmapInfo.bmiHeader.biSizeImage    = 0;
           BitmapInfo.bmiHeader.biXPelsPerMeter = 0;
           BitmapInfo.bmiHeader.biYPelsPerMeter = 0;
           BitmapInfo.bmiColors[0].rgbRed      = 0xFF;
           BitmapInfo.bmiColors[0].rgbGreen    = 0xFF;
           BitmapInfo.bmiColors[0].rgbBlue     = 0xFF;
           BitmapInfo.bmiColors[0].rgbReserved = 0;
     
           hDC = GetDC ( NULL );
           hDC_Bmp = CreateCompatibleDC ( hDC );
           hBmp = CreateCompatibleBitmap ( hDC, lx, abs(ly) );
           hBmpOld = (HBITMAP)SelectObject ( hDC_Bmp, hBmp );
           ReleaseDC ( NULL, hDC );
     
           SetDIBits ( hDC_Bmp, hBmp, 0, abs(ly), Buffer, &BitmapInfo, DIB_RGB_COLORS );
     
           //Libération des ressources
           SelectObject ( hDC_Bmp, hBmpOld );
           DeleteDC ( hDC_Bmp );
       //    free ( Buffer );
     
           return hBmp;
       }
    mais rien y fait.


    J'ai aussi testé ca, mais là non plus pas grand chose

    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
     
    HBITMAP bmp = CreateBitmap(imgAp3G->width,imgAp3G->height,24,imgAp3G->depth);
    SetBitmapBits(bmp, imgAp3G->imageSize, imgAp3G->imageData);
    pictureBoxG->BackgroundImage->FromHbitmap(bmp);
     
    	HBITMAP CreateBitmap(int w,int h,WORD bpp,int Size)
    	{
    		HDC         hDC = CreateCompatibleDC(0);
    		BYTE        tmp[sizeof(BITMAPINFO)+255*4];
    		BITMAPINFO *bmi = (BITMAPINFO*)tmp;
    		HBITMAP     hBmp;
    		int i;
    		memset(bmi,0,sizeof(BITMAPINFO));
    		bmi->bmiHeader.biSize     = sizeof(BITMAPINFOHEADER);
    		bmi->bmiHeader.biWidth    = w;
    		bmi->bmiHeader.biHeight   = h;
    		bmi->bmiHeader.biPlanes   = Size;
    		bmi->bmiHeader.biBitCount = bpp;
    		bmi->bmiHeader.biCompression = BI_RGB;
    		bmi->bmiHeader.biSizeImage  = w*h*1;
    		bmi->bmiHeader.biClrImportant  =0 ;
    		switch(bpp)
    		{
    			case 8 :
    			for(i=0 ; i < 256 ; i++)
    			{
    					bmi->bmiColors[i].rgbBlue = i;
    					bmi->bmiColors[i].rgbGreen= i;
    					bmi->bmiColors[i].rgbRed= i;
    			}
    			break;
    		case 32:
    		case 24:
    		((DWORD*) bmi->bmiColors)[0] = 0x00FF0000; /* red mask  */
    		((DWORD*) bmi->bmiColors)[1] = 0x0000FF00; /* green mask */
    		((DWORD*) bmi->bmiColors)[2] = 0x000000FF; /* blue mask  */
    		break;
    		}
    		hBmp = ::CreateDIBSection(hDC,bmi,DIB_RGB_COLORS,NULL,0,0);
     
    		::DeleteDC(hDC);
    		return hBmp;
    	}


    En fait je n'ai jamais rien eu d'afficher de mon control, mais pas de gresillement.
    J'ai toujours l'impression que mon Bitmap est invalide du coup le pictureBox n'affiche rien.





    Je me suis suis aussi inspiré de ce que faisait cvShowImage, toujours rien.

    Je dois etre fatigué en ce moment car je n'arrive à rien du tout.
    Please Help

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Salut,

    Alors déjà, pour la première solution, je ne pense pas que ça marche. J'avais réussi à le faire avec une fenêtre Qt, mais le résultat était décevant, car même si l'image était affichée dans le fenêtre voulue, il restait la fenêtre openCV qui apparaissait vide. Et quand on la femrais, ça coupait la lecture vidéo.

    Pour la deuxième solution, j'ai su faire la conversion avec un format Qt d'image, mais je connais pas .Net. Ca devrait faire un truc du genre je pense :
    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
    private:
     
    Bitmap convertIPLtoBitmap(IplImage * newImage)
    {
       Bitmap image1;
       if(image)
       {
          image1 = Bitmap(newImage->width, newImage->height,Format32bppRgb);
          int x;
          int y;
          char* data = newImage->imageData;
     
     
          for ( y = 0; y< newImage->height; y++, data +=newImage->widthStep )
          {
             for ( x = 0; x < newImage->width; x++ )
             {
                Color newColor = Color::FromArgb( 0, data[x * newImage->nChannels+2,data[x * newImage->nChannels+1],data[x * newImage->nChannels]);
                image1.SetPixel( x, y, newColor );
             }
          }
       }
     
    return image1;
    }
    Bon je suis pas sûr de l'appel des fonctions, du format et de ce genre de chose. Mais le principe est là. On crée une image de la même taille, on récupère la couleur de chaque pixel de l'IplImage, et on l'attribue au pixel correspondant du Bitmap.

    Il se peut que ton image soit à l'envers, car il me semble que l'origine des IplImage est en bas à gauche, et non pas en haut à gauche.

    Bonne chance, et tiens nous au courant,

    G.

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2003
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 103
    Par défaut
    Et ba bien merci.

    Je pense bien que j'étais fatigué et je ne sais pas pourquoi je voulais a tout pris passer par un HBITMAP.

    Un Bitmap suffit.

    Encore quelque petit souci sur le setPixel pour des raison de couleur, et orientation.
    Mais ca ce n'est pas un probleme, je l'ai déjà codé dans un autre log.


    La du moment que j'ai quelque chose qui s'affiche c'est que je suis pas loin.



    On devrait pas programmer trop fatigué, &&.
    Encore merci pour ce coup de pouce.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    De rien !

    Sinon, pour l'orientation, comme je l'ai dit, l'origine des IplImage est en bas a gauche, au lieu d'être en haut à gauche. Ca devrait pouvoir se régler avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setPixel(x,newImage->height-1-y, newColor)
    Pour les couleurs, je crois que les IplImage sont aussi en bgr, et non en rgb. Inverse donc peut être les channels.

    Bonne chance,

    G.

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2003
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 103
    Par défaut
    Yes merci,

    c'est bien ce que je pensai, mais hier pas trop la tete a ca, j'ai juste testé l'affichage.

    Pour l'orientation le setPixel c'est ce que je pensai faire.

    Pour les couleurs c'est un probleme de conversion [0,1] [0,255] donc la non plus pas de souci.


    En tout cas un grand merci.

    On voit que quand on a trop la tete dans le guidon on a du mal a prendre du reculs.
    sacré HBITMAP, j'en rigole encore. lol

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/05/2008, 23h12
  2. Afficher une IplImage dans un picture control
    Par didulle dans le forum OpenCV
    Réponses: 3
    Dernier message: 04/01/2008, 14h22
  3. Réponses: 4
    Dernier message: 03/10/2007, 12h59
  4. Afficher une IplImage dans une picturebox
    Par Sixdeux dans le forum C#
    Réponses: 14
    Dernier message: 15/05/2007, 16h43
  5. afficher une image dans une fenêtre windows
    Par yashiro dans le forum Bibliothèques
    Réponses: 3
    Dernier message: 02/05/2006, 16h30

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