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 :

Mes problèmes


Sujet :

OpenCV

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 35
    Par défaut Mes problèmes
    Bonjour,

    Je voudrais utilisé OpenCV pour capturer le flux video d'une webcam, et soustraire les images deux a deux.

    Seulement pour commencer, quand je capture une frame et que je l'affiche, ça me donne une image noire avec une bande en haut faite de plein de petits traits de couleurs.
    J'ai vu quelqu'un qui avait le meme probleme sur un autre forum mais il a pas eu de reponses >< .

    Et ensuite, j'ai voulu utilisé cvsub pour faire la soustraction des images, ça compile bien, mais quand je lance le programme ça me dis ça :

    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
    OpenCV ERROR: Null pointer (NULL array pointer is passed)
            in function cvGetMat, cxarray.cpp(2780)
    Terminating the application...
            called from cvUnregisterType, cxpersistence.cpp(4933)
    Terminating the application...
            called from cvUnregisterType, cxpersistence.cpp(4933)
    Terminating the application...
            called from cvUnregisterType, cxpersistence.cpp(4933)
    Terminating the application...
            called from cvUnregisterType, cxpersistence.cpp(4933)
    Terminating the application...
            called from cvUnregisterType, cxpersistence.cpp(4933)
    Terminating the application...
            called from cvUnregisterType, cxpersistence.cpp(4933)
    Terminating the application...
            called from cvUnregisterType, cxpersistence.cpp(4933)
    Terminating the application...
            called from cvUnregisterType, cxpersistence.cpp(4933)
    Terminating the application...
            called from cvUnregisterType, cxpersistence.cpp(4933)
    Terminating the application...
    Ah, et quand meme, voila mon code actuel ^^ :

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    #include <cv.h>
    #include <highgui.h>
     
     
    int main(int argc, char *argv[])
    {
      IplImage *img = 0, *img2 = 0, *img3 = 0; 
      int height,width,step,channels;
      uchar *data;
      int i,j,k;
      //char buf[32];
      //CvFont font;
      //double hScale=1.0;
    	//double vScale=1.0;
    	//int    lineWidth=1;
     
      // Initialise la capture  
      CvCapture* capture = cvCaptureFromCAM(-1);
      if(capture)
      {
    	if(!cvGrabFrame(capture))
    	{              // capture a frame 
      		printf("Could not grab a frame\n\7");
      		exit(0);
    	}
      }
      else
      {
      	printf("Could not open video device\n");
      	exit(0);
      }
    	img=cvRetrieveFrame(capture);           // retrieve the captured frame
    	cvGrabFrame(capture);
    	img2=cvRetrieveFrame(capture);
     
    	cvSub( img, img2, img3);
      // get the image data
      height    = img->height;
      width     = img->width;
      step      = img->widthStep;
      channels  = img->nChannels;
      data      = (uchar *)img->imageData;
      printf("Processing a %dx%d image with %d channels\n",height,width,channels); 
     
      // create a window
      cvNamedWindow("Fenetre_test", CV_WINDOW_AUTOSIZE); 
      cvMoveWindow("Fenetre_test", 100, 100);
     
      // invert the image
      /*for(i=0;i<height;i++) for(j=0;j<width;j++) for(k=0;k<channels;k++)
        data[i*step+j*channels+k]=255-data[i*step+j*channels+k];*/
     
      // show the image
      //sprintf(buf, "%d", i);
      //cvPutText (img,buf,cvPoint(200,400), &font, cvScalar(255,255,0));
      cvShowImage("Fenetre_test", img3 );
     
      // wait for a key
      cvWaitKey(0);
     
      // release the image
      cvReleaseImage(&img );
      cvReleaseCapture(&capture);
      return 0;
    }
    Je revien demain, merci d'avance !

    EDIT : inutile de dire que ma cam marche tres bien avec les autres programmes ^^

  2. #2
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2008
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 29
    Par défaut
    Pour l'image noir je pense que le problème vien du fait que tu ne laisse pas le temps à la caméra d'envoyer les images. J'avais le même problème et je l'ai resolu en fesant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int i = 0; 
           /* on charge l'image de la webcam */      
           while(i<300) {
                        /* capture l'image de la webcam */
                         frame = cvQueryFrame(capture);
                         if( !frame ) { 
                             return FALSE;
                         }  
                         cvWaitKey(10);
                         i++;
           }
    frame est une IplImage. une fois que l'image est bien, la metre dans img et ainsi de suite ^^.

    J'espere ne pas avoir mal compris ton problème =)

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 35
    Par défaut
    Merci, mais en fait j'ai trouver le probleme y a quelque minutes.

    C'est pas moi qui ai installer cette webcam sur ce PC, et le type qui l'a fait a ecrit le driver lui meme pour un de ces programmes.

    Donc en fait j'ai telecharger les sources de ov51x-jpeg sur rastageek et maintenant ça marche .

    Par contre, toujours le probleme de pointeur sur un array null ...

  4. #4
    Membre expérimenté Avatar de Vinsss84
    Profil pro
    Inscrit en
    Février 2008
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2008
    Messages : 175
    Par défaut
    j'aurai tendance a dire que le NULL pointer doit venir de la non initialisation de img3 :
    img3 = cvCreateImage(cvGetsize(img2),img->depth,img->nChannels;
    )

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 35
    Par défaut
    C'etait effectivement ça !

    On m'a aider sur un autre forum en meme temps, et j'en suis arrivé a ce code :

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    #include <cv.h>
    #include <highgui.h>
     
     
    int main(int argc, char *argv[])
    {
      IplImage *img = 0, *img2 = 0, *img3 = 0; 
      int height,width,step,channels;
      uchar *data;
      int i,j,k;
      CvScalar scalaire, scalaire2, scalaire3;
     
     
      cvNamedWindow("Fenetre_test", CV_WINDOW_AUTOSIZE); 
      cvMoveWindow("Fenetre_test", 100, 100);
     
      // Initialise la capture  
      CvCapture* capture = cvCaptureFromCAM(0);
      	  img2 = cvQueryFrame(capture);
        while(cvWaitKey(20)!=' ')
        {
          img = img2;
    	  img2 = cvQueryFrame(capture);
    	  img3 = cvCreateImage(cvGetSize(img2), img2->depth, img2->nChannels);
     
     
     
      // show the image
        scalaire3 = cvScalar(0, 0, 0);
     
      for(int i=0; i < img->width; i++)
      {
        for(int j=0; j < img->height; j++)
        {
     
            //Attention une image est une matrice, on donne "l'ordonnée"
            //avant "l'abscisse"...
            scalaire=cvGet2D(img, j, i);
            scalaire2=cvGet2D(img2, j, i);
     
            //On fait la soustraction, mais on fait attention aux valeurs
            //négatives : en gros, on calcule la valeur absolue 
            //de la différence.
     
            for(int k=0; k < img->nChannels; k++)
            {
                 scalaire3.val[k] = abs(cvRound(scalaire.val[k] - scalaire2.val[k]));
            }
     
            //On place le résultat dans l'img3
            cvSet2D(img3, j, i, scalaire3);
        }
      }
     
      cvShowImage("Fenetre_test", img2 );
     
        }
     
      // release the image
      cvReleaseImage(&img );
      cvReleaseCapture(&capture);
      return 0;
    }
    Mais l'image reste desesperement noire ...
    Celui qui m'aide veut me laisser reflechir et ma juste conseiller un etirement d'histogramme, j'ai trouver ce que c'est, et maintenant, je cherche quelle fonction permet d'arriver a ce resultat ^^ .

    Mais opencv est mal documenté par contre

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 35
    Par défaut
    j'ai trouver ! img = img2 c'est faux !

    Faut faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    img = cvCloneImage(img2);
    Et la, ça marche niquel !

    On voit bien les mouvements, y a plus aucun parasites, ça convient presque parfaitement a ce que je cherche !

    je dis presque parceque c'est pas asser lumineux encore a mon gout, et voir ce qu'il y a sous le mouvement m'interesse pas.
    Va faloir que je code un petit truc qui cherchera tout les pixels au dessus d'un certaint seuil de luminositer (en gros tout ceux qui sont a disons, au dessus de 50 ou 100 d'au moin une des composantes rgb par exemple) et les remplaces par un pixel blanc.

    Je sais pas si ça va etre dur mais je m'y met =D


    EDIT : ah bah deja je trouve pas de fonction qui renvoie le RVB d'un pixel, je commence bien xD


    Bon, avec un hsv, je sais meme pas ce que c'est en plus, et ça marche pas. ça donne une sorte de teinte verte au mouvement, c'est bizare.

    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
      cvCvtColor( img3, hsvFrame, CV_BGR2HSV );
     
              //Pour chaque pixelâ&#128;¦
     
            for(int y = 0; y < (cvGetSize(hsvFrame).height); y++) 
     
            {
     
                  for(int x = 0; x < (cvGetSize(hsvFrame).width); x++) 
     
                  {
     
                  //â&#128;¦si HSV entre les seuils max et minâ&#128;¦ 
     
                  if((((hsvFrame->imageData + hsvFrame->widthStep*y))[x*3] > 50))
                  {
                  	(hsvFrame->imageData + hsvFrame->widthStep*y)[x*3] = 255;
                  }
     
                  }
            }
            cvCvtColor( hsvFrame, img3, CV_HSV2BGR );
      cvShowImage("Fenetre_test", img3 );

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 18
    Par défaut
    Tu arrives à ce genre de choses ?

    http://www.developpez.net/forums/d28...n/#post4397971

  8. #8
    Membre confirmé Avatar de xtra.creativity
    Développeur informatique
    Inscrit en
    Mars 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2007
    Messages : 108
    Par défaut
    Je dis ca comme ca mais opencv integre des methode d' optical flow .... enfin moi je dis ca, je dis rien ^^

Discussions similaires

  1. [CakePHP] Mes problémes avec cakephp
    Par ryodo dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 16/06/2011, 03h40
  2. [Jeu python] Solutions à mes problémes
    Par moithibault dans le forum Général Python
    Réponses: 1
    Dernier message: 12/06/2010, 12h09
  3. Mes problèmes avec l'hébergeur 1and1
    Par crazyden dans le forum 1&1
    Réponses: 1
    Dernier message: 25/03/2009, 21h28
  4. Je n'arrive pas à résoudre mes problèmes
    Par ablessedbg dans le forum Débuter
    Réponses: 5
    Dernier message: 30/01/2008, 22h21
  5. [MySQL] libMysql.dll est-il la source de tous mes problèmes ?
    Par berceker united dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 15/01/2008, 12h07

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