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 :

Probleme avec les IplImage


Sujet :

OpenCV

  1. #1
    Membre expert
    Avatar de Jim_Nastiq
    Homme Profil pro
    Architecte, Expert Flex
    Inscrit en
    Avril 2006
    Messages
    2 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte, Expert Flex
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 335
    Points : 3 189
    Points
    3 189
    Par défaut Probleme avec les IplImage
    Salut,

    j'utilise openCv pour capturer le flux video(cf mon autre post) et lors du callback pour le traitement de chaque image je souhaite moyenné sur 3 images puis soustraire l'image traité et moyenné a l'image precedement traité(c'est clair? ) mais lorsque je lance le programme j'ai le droit a une OpenCV GUI error handler:

    NULL Pointer (NULL array pointer is passed) in function cvGetMat

    Abort, Retry, Continue?
    j'ai du mal a comprendre le probleme, j'ai lu pas mal de post(sur le newsgroup d'opencv) a ce sujet et aucune solution n'est clairement expliquée! le probleme vient de la declaration et/ou de l'initialisation des IplImage semble t'il mais j'ai beau tester pleins de truc pas moyen...

    si par hasard un habitué d'openCV passe par la...

    Je laisse mon code au cas ou:

    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    #include "cvcam.h"
    #include "highgui.h"
    #include <iostream>
     
     
    static int index;
     
    static IplImage* backImage =0;
    static IplImage* previousImage =0;   //buffer for the previous image
    static IplImage* previousImage2 =0;  //buffer for the previous image of previousImage
    /**************************************************************************\
                How to set video resolution programatically
    \**************************************************************************/ 
    void callback(IplImage* image)
    {
       IplImage* image1 = image;
       IplImage* averageImage = 0;   //Resulting image of the average 
       IplImage* sumImage = 0;       //Resulting image of the addition
       IplImage* subImage = 0;       //Resulting image of the substraction
       int i,j;
       int iheight,iwidth;
       assert (image);
     
       iheight = image1->height;
       iwidth = image1->width;
     
       /* Print the original image in the window */   
       cvShowImage("Original window",image1);
     
     
       /* Initialize image */
       averageImage = cvCreateImage(cvSize(iwidth,iheight),IPL_DEPTH_8U,image1->nChannels);
       subImage = cvCreateImage(cvSize(iwidth,iheight),IPL_DEPTH_8U,image1->nChannels);
       subImage = cvCreateImage(cvSize(iwidth,iheight),IPL_DEPTH_8U,image1->nChannels);
     
       index++;               //count the number of frame
     
       /*the two first Frame need to be saved in the buffer */
       if (index < 3)
       {
           if(index == 1)
           {
              backImage = cvCreateImage(cvSize(iwidth,iheight),IPL_DEPTH_8U,image1->nChannels);
              previousImage = cvCreateImage(cvSize(iwidth,iheight),IPL_DEPTH_8U,image1->nChannels);
              previousImage2 = cvCreateImage(cvSize(iwidth,iheight),IPL_DEPTH_8U,image1->nChannels);
              backImage = image1;
           }   
           previousImage = image1;
           previousImage2 = image1;
       }
     
       /*************************************/
       /************* Treatment *************/
       /*************************************/
     
       /* AVERAGE */
       cvAdd(previousImage, image1, sumImage , NULL);
       cvAdd(sumImage, previousImage, sumImage , NULL);
       for( i=0 ; i<sumImage->widthStep ; i++ )
       {
          averageImage->imageData[i] = sumImage->imageData[i]/3;
       }
     
       /* SUB */
       cvSub (backImage, averageImage, subImage, NULL);
     
       //save the treated frames in the previous frame for the average
       previousImage2 = previousImage;
       previousImage = image1;  
    }
     
     
     
    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,(void*)callback);
        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 )
    {
        index = 0;
        cvNamedWindow("Original window", CV_WINDOW_AUTOSIZE);
     
        cvNamedWindow("Treated window", CV_WINDOW_AUTOSIZE);
     
        if( ShowCamVideo((HWND)cvGetWindowHandle("Treated window"), 640, 480) )
        {
            cvWaitKey(0);
            cvcamStop();
        }
        cvcamExit();
    }

    Pensez vraiment à effectuer une recherche avant de poster, ici et sur un moteur de recherche! c'est la moindre des choses
    Pensez au tag

    Mon Blog sur la techno Flex
    Ma page sur Developpez.com

    Jim_Nastiq

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    Salut

    L'erreur signifie que tu passes un argument NULL à l'une de tes fonctions, ce qui signifie en clair que l'une des images n'est pas (ou mal) initialisée.

    En regardant de plus près le code d'initialisation de tes images, j'ai remarqué une erreur de typo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /* Initialize image */
       averageImage = cvCreateImage(cvSize(iwidth,iheight),IPL_DEPTH_8U,image1->nChannels);
       subImage = cvCreateImage(cvSize(iwidth,iheight),IPL_DEPTH_8U,image1->nChannels);
       subImage = cvCreateImage(cvSize(iwidth,iheight),IPL_DEPTH_8U,image1->nChannels);

    Tu initialises 2 fois de suite subimage. sumImage quant à lui n'est jamais initialisé. C'est lui qui fait planter ton programme au niveau de cette ligne de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cvAdd(previousImage, image1, sumImage , NULL);
    Essaie donc de remplacer subImage par sumImage dans la 3ème ligne d'initilaisation de tes images
    Voilà en espérant que ca résoud ton problème

  3. #3
    Membre expert
    Avatar de Jim_Nastiq
    Homme Profil pro
    Architecte, Expert Flex
    Inscrit en
    Avril 2006
    Messages
    2 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte, Expert Flex
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 335
    Points : 3 189
    Points
    3 189
    Par défaut
    ok merci en effet une erreur de typo mais aussi d'init au lieu d'une simple egalité il fallait utiliser cvCloneImage !
    en tout cas merci pour ta reponse

    Pensez vraiment à effectuer une recherche avant de poster, ici et sur un moteur de recherche! c'est la moindre des choses
    Pensez au tag

    Mon Blog sur la techno Flex
    Ma page sur Developpez.com

    Jim_Nastiq

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Mars 2007
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    salut ... est-ce que tu puex m'aider??? pour mo programme je dois aussi trouver le "average" de plusieurs images voici mon code... j'ai comme tu as fais mais ca ne marche pas... mon average est tous gris!!!

    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
     
        IplImage* ST[numtrain];	
        CString filename[numtrain];
     
        filename[0]=GDBpath + "\\subject01.jpg";
        filename[1]=GDBpath + "\\subject02.jpg";
        filename[2]=GDBpath + "\\subject03.jpg";
        filename[3]=GDBpath + "\\subject04.jpg";
        filename[4]=GDBpath + "\\subject05.jpg";
        filename[5]=GDBpath + "\\subject06.jpg";
        filename[6]=GDBpath + "\\subject07.jpg";
        filename[7]=GDBpath + "\\subject08.jpg";
        filename[8]=GDBpath + "\\subject09.jpg";
        filename[9]=GDBpath + "\\subject10.jpg";
     
        for (int i=0;i<numtrain;i++)
            ST[i]=cvLoadImage(filename[i],0);
     
    //find average face
        IplImage *sumface=cvCreateImage(cvSize(imgsize,imgsize),IPL_DEPTH_8U,1);
        IplImage *avgface=cvCreateImage(cvSize(imgsize,imgsize),IPL_DEPTH_8U,1);
     
        sumface=cvCloneImage(ST[0]);
        for(i=1;i<numtrain;i++)
            cvAdd(ST[i],sumface,sumface,NULL);
     
        for( i=0 ; i<sumface->widthStep ; i++ )
          //avgface->imageData[i] = sumface->imageData[i]/numtrain;
     
        cvNamedWindow( "Average Face", 1);                
        cvShowImage( "Average Face",avgface);
        cvWaitKey(0);
    aidez stp j'ai poster ca sur le yahoogroups de opencv mais personne ne me reponds!!! j'ai besoin de trouver une solution pour ce probleme pour pouvoir continuer mon projet et je suis tres en retard

  5. #5
    Membre expert
    Avatar de Jim_Nastiq
    Homme Profil pro
    Architecte, Expert Flex
    Inscrit en
    Avril 2006
    Messages
    2 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte, Expert Flex
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 335
    Points : 3 189
    Points
    3 189
    Par défaut
    je pense que si tes 10 images sont completement differentes c'est normal d'obtenir du gris en moyennant ces 10 images...

    Pensez vraiment à effectuer une recherche avant de poster, ici et sur un moteur de recherche! c'est la moindre des choses
    Pensez au tag

    Mon Blog sur la techno Flex
    Ma page sur Developpez.com

    Jim_Nastiq

  6. #6
    Membre régulier Avatar de bustaja
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2007
    Messages : 109
    Points : 112
    Points
    112
    Par défaut Problème similaire
    Bonjour, je viens de commencer d'utiliser OpenCV (qui est un outil formidable cela dit en passant) et comme Jim_Nastiq je me retrouve avec un magnifique:

    NULL Pointer (NULL array pointer is passed) in function cvGetMat,
    D:\User\VP\opencv\cxcore\src\cxarray.cpp(2763)

    Abort, Retry, Continue?
    Enfin bref, ça fait quelques temps que je suis dessus et pas moyen de trouver...

    Voici le code de ma fonction :

    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
    int fen_contour(char* nomfichier, int temps)
    {
        /* Variables */  
         IplImage *im, *imcp;
         IplImage *tmp;
         CvCapture *avi;
     
         /* Ouverture de la video */  
         avi = cvCaptureFromAVI(nomfichier); 
         cvNamedWindow("Originale", CV_WINDOW_AUTOSIZE); 
         cvNamedWindow("Contour", CV_WINDOW_AUTOSIZE);
     
         while(cvGrabFrame(avi)) 
           { 
           IplImage* im = cvRetrieveFrame(avi);
           IplImage* gray = cvCreateImage(cvGetSize(im), 8, 1);
           IplImage* contours = cvCreateImage(cvGetSize(im), 8, 1);
           contours->origin = im->origin;
     
           /* Traitement de l’image */  
              while(cvWaitKey(temps)==-1)
              {
                cvShowImage("Originale", im); 
                im = cvQueryFrame(avi);
                cvCvtColor(im, gray, CV_BGR2GRAY);
                cvCanny(gray, contours, 50, 50, 3);
                cvShowImage("Contour", contours);
              }
           }    
           return 1; 
    }
    Je pense que mes images sont bien initialisées (enfin peut-être que j'vois pas, j'arrive moins à debugger mes programmes que ceux des autres...).

    J'appelle ma fonction comme cela dans mon main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char* nomfich = "drop.avi";
    int temps = 6;
    int erosion = 1;
    fen_contour(nomfich, temps);
    Au fait, mon programme tourne parfaitement mais plante sur la fin...

    J'utilise Dev C++ configuré avec les bonnes lib et tout

    Merci de votre aide... j'vois vraiment pas pourquoi ça me plante dans les pattes comme ça...

  7. #7
    Membre régulier Avatar de bustaja
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2007
    Messages : 109
    Points : 112
    Points
    112
    Par défaut
    Bon bah c'est bon j'ai revu ma fonction, j'ai changé quelques points et ça marche

    Pour ceux que ça interesse, voici une fonction qui récupère le nom d'un fichier et le temps d'affichage de chaque frame.

    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
    int fen_contour2(char* nomfichier, int temps)
    {   
        /* Variables */  
         IplImage *im;
         IplImage *gray;
         IplImage *contours;
     
         CvCapture *avi; 
         /* Ouverture de la video */  
         avi = cvCaptureFromAVI(nomfichier); 
         cvNamedWindow("Originale", CV_WINDOW_AUTOSIZE); 
         cvNamedWindow("Contour", CV_WINDOW_AUTOSIZE);
     
         while(cvGrabFrame(avi)) 
           { 
           im = cvRetrieveFrame(avi);
           gray = cvCreateImage(cvGetSize(im), 8, 1);
           contours = cvCreateImage(cvGetSize(im), 8, 1);
           contours->origin = im->origin;
     
           /* Traitement de l’image */  
           cvShowImage("Originale", im); 
           cvCvtColor(im, gray, CV_BGR2GRAY);
           cvCanny(gray, contours, 50, 50, 3);
           cvShowImage("Contour", contours);
     
           cvWaitKey(temps);
           }  
           return 1;
    }
    J'ai lachement abandonné l'autre fonction, devenue intuile (beurk les bugs).

    Bon sur ce, bonne journée

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

Discussions similaires

  1. Help!! Probleme avec les dates sur SQL SERVER
    Par Nadaa dans le forum MS SQL Server
    Réponses: 16
    Dernier message: 03/08/2006, 16h55
  2. PROBLEME AVEC LES REQUETES IS NULL / NOT EXISTS
    Par sylvaine dans le forum Langage SQL
    Réponses: 5
    Dernier message: 04/06/2004, 13h26
  3. [langage] probleme avec les listes dans des listes
    Par pqmoltonel dans le forum Langage
    Réponses: 7
    Dernier message: 27/04/2004, 12h32
  4. Problem avec les *.AVI sur les panels
    Par NaDiA_SoFt dans le forum C++Builder
    Réponses: 3
    Dernier message: 31/08/2003, 22h50
  5. probleme avec les processus
    Par saidi dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 05/02/2003, 00h18

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