Problème avec openCV


13 posts
by FaAabioOo » Mon Feb 04, 2013 10:23 pm
Bonsoir,

Mon but est de détecter un mouvement à l'aide des librairies proposées par OpenCV. Voici mon algorithme:

- capture PHOTO1
- PHOTO1 convertie en PHOTO_NB1 (NB -> N&B)
- capture PHOTO2
- PHOTO2 convertie en PHOTO_NB2
- soustraction de PHOTONB1 et PHOTONB2 = PHOTOS_SOUST
- binaisation de PHOTO_SOUST = BIT_PHOTO
- comptage du nombre de pixel blanc
- si nombre pixel blancs > SEUIL, alors mouvement

C'est mon algorithme qui est présenté assez succintivement.

Mon problème vient du fait que j'ai des erreur de mémoire (RAM surchargée?), je fait mes ReleaseImage à la fin mais rien a faire, et encore, c'est pire car mon programme ne fait q'un tour dans ma bloucle WHILE(1).. Quelqu'un pourrait-il m'aiguiller?

Voici mon code:

Code: Select all
#include "opencv2/video/tracking.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <time.h>
#include <stdio.h>
#include <ctype.h>

//int PixelsCount(IplImage *bitimage)   {

//int i,j,k=0;

//int height=bitimage->height;
//int width=bitimage->width;
//int step=bitimage->widthStep;
//int

//}

int main() {

   CvCapture *capture;
   
   int x=0,y=0;
   float WhitePixelCounter = 0;
   float PixelRatio = 0;
   CvScalar pixel;
   

   while(1){
      CvCapture *pCapturedImage = cvCreateCameraCapture(0);
      
      IplImage *pSavedImage1 = cvQueryFrame(pCapturedImage);
      if(!pCapturedImage){
         printf("BREAK1");
         break;
      }   

      IplImage *GreyImage1 = cvCreateImage(cvGetSize(pSavedImage1),8,1);
      //cvCvtColor(pSavedImage1,GreyImage1,CV_RGB2GRAY);
      
      //cvReleaseCapture( &pCapturedImage);
      //cvErode(GreyImage1,GreyImage1,NULL,1);
      //cvSaveImage("Test1.jpg",GreyImage1,0);


      //CvCapture *pCapturedImage = cvCreateCameraCapture(0);
      IplImage *pSavedImage2 = cvQueryFrame(pCapturedImage);
      if(!pCapturedImage){
         printf("BREAK2");
         break;
      }
      
      IplImage *GreyImage2 = cvCreateImage(cvGetSize(pSavedImage2),8,1);
      cvCvtColor(pSavedImage2,GreyImage2,CV_RGB2GRAY);
      cvReleaseCapture( &pCapturedImage);

      //cvErode(GreyImage2,GreyImage2,NULL,1);
      //cvSaveImage("Test2.jpg",GreyImage2,0);
      
      IplImage *ImageDiff = cvCreateImage(cvGetSize(pSavedImage1),8,1);
      cvAbsDiff(GreyImage1,GreyImage2,ImageDiff);

      //cvSaveImage("ImageDiff.jpg",ImageDiff,0);
      
      
// seuillage
      IplImage *BitImage = cvCreateImage(cvGetSize(pSavedImage1),8,1);
      cvThreshold(ImageDiff,BitImage,50,255,CV_THRESH_BINARY);
      //cvSaveImage("BitImage.jpg",BitImage,0);
      PixelRatio = 0;
      for(x=0 ; x < BitImage->height ; x++)
      {
         for( y=0 ;y < BitImage->width ; y++)
          {
            pixel = cvGet2D(BitImage,x,y);

            if(pixel.val[0] == 255)
            {
               WhitePixelCounter = WhitePixelCounter + 1;
               //printf("PixelCount = %f \n", WhitePixelCounter);
            }

           } //FOR width
      
      } //FOR heigth
      
      PixelRatio = (WhitePixelCounter/307200)*100;
      printf("Il y a %f /100 de pixel blancs \n", PixelRatio);
      
   cvReleaseImage(&pSavedImage1);
   cvReleaseImage(&pSavedImage2);
   cvReleaseImage(&GreyImage1);
   cvReleaseImage(&GreyImage2);
   cvReleaseImage(&ImageDiff);
   cvReleaseImage(&BitImage);

} //WHILE

   return 0;

} // MAIN



En vous remerciant par avance

Bonne soirée à tous ! :)
Posts: 8
Joined: Wed Oct 24, 2012 7:30 pm
by nikotinux » Tue Feb 05, 2013 2:08 am
peut etre un peu 'lourd' comme librairie pour le raspberry ?
une autre voie ...
http://www.imagemagick.org/Usage/compare/
?
Posts: 182
Joined: Sat Feb 02, 2013 2:11 am
by FaAabioOo » Tue Feb 05, 2013 7:34 am
Lourd je ne sais pas car OpenCV a déjà été porter sur Raspberry PI. Mais le problème est identique sous un Linux PC(j'ai testé sur Debian sur mon PC, et l'OS sur Raspberry est Raspbian)
Posts: 8
Joined: Wed Oct 24, 2012 7:30 pm
by FaAabioOo » Tue Feb 05, 2013 8:13 am
Voici l'erreur:

"Bad argument (unrecognized or unsupported array type) in cvReleaseData"
Posts: 8
Joined: Wed Oct 24, 2012 7:30 pm
by nikotinux » Tue Feb 05, 2013 6:21 pm
je ne connais pas OpenCV mais je vais surement me pencher dessus.

j'ai essayé de brancher une webcam sur le raspberry (via un hub usb) en espérant faire tourner motion (cd http://www.lavrsen.dk/foswiki/bin/view/Motion/WebHome )
j'ai voulu bien sur tester la cam avec guvcview et j'ai eu un freeze après 2 ou 3 trames. dmesg m'a retourné des flopées d'erreurs sur le bus usb et je n'ai pas eu le temps d'aller plus loin ...

un truc m'interpelle avec ton programme :
CvCapture *pCapturedImage = cvCreateCameraCapture(0);
ça doit a priori initialiser la connexion a la camera ...
donc cette ligne ne devrait pas être dans la boucle while mais avant !
Posts: 182
Joined: Sat Feb 02, 2013 2:11 am
by nikotinux » Tue Feb 05, 2013 9:13 pm
de plus ta boucle ne me semble pas optimisée, j'aurais fait un truc du genre:

capture PHOTO_REF
traitement PHOTO_REF

while {
(petit delai d'attente ...)
capture PHOTO_COURANTE
traitement PHOTO_COURANTE

comparaison PHOTO_COURANTE, PHOTO_REF
si != gerer le mouvement

PHOTO_REF = PHOTO_COURANTE
}
Posts: 182
Joined: Sat Feb 02, 2013 2:11 am
by FaAabioOo » Wed Feb 06, 2013 8:11 am
D'accord, je vais tester ta solution :)
Posts: 8
Joined: Wed Oct 24, 2012 7:30 pm
by totoharibo » Wed Feb 06, 2013 10:46 am
motion ne ferait pas tout ça?
(pas testé sur Rpi)
Posts: 948
Joined: Thu Jan 24, 2013 8:43 am
by nikotinux » Wed Feb 06, 2013 5:15 pm
motion devrait le faire mais je suis resté a mon problème de blocage de ma webcam ...
une solution alternative est toujours bonne a prendre !
Posts: 182
Joined: Sat Feb 02, 2013 2:11 am
by FaAabioOo » Wed Feb 06, 2013 8:35 pm
Voici mon code avec l'algorithme proposé ci-dessus:

Code: Select all
#include "opencv2/video/tracking.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/core/core.hpp"
#include <time.h>
#include <stdio.h>
#include <ctype.h>


int main() {

   CvCapture *capture;
   
   int x=0,y=0;
   float WhitePixelCounter = 0;
   float PixelRatio = 0;
   CvScalar pixel;
   IplImage *pSavedImage1 =;
   IplImage *GreyImage1;
   IplImage *pSavedImage2;
   IplImage *GreyImage2;
   IplImage *ImageDiff;
   IplImage *BitImage;

   CvCapture *pCapturedImage = cvCreateCameraCapture(0);
      
      pSavedImage1 = cvQueryFrame(pCapturedImage);
      if(!pCapturedImage){
         printf("BREAK1");
         //break;
      }   

      GreyImage1 = cvCreateImage(cvGetSize(pSavedImage1),8,1);
      cvCvtColor(pSavedImage1,GreyImage1,CV_RGB2GRAY);
      cvReleaseCapture( &pCapturedImage);
      //cvErode(GreyImage1,GreyImage1,NULL,1);
      //cvSaveImage("Test1.jpg",GreyImage1,0);

   while(1){
      

      CvCapture *pCapturedImage = cvCreateCameraCapture(0);
      pSavedImage2 = cvQueryFrame(pCapturedImage);
      if(!pCapturedImage){
         printf("BREAK2");
         break;
      }
      
      GreyImage2 = cvCreateImage(cvGetSize(pSavedImage2),8,1);
      cvCvtColor(pSavedImage2,GreyImage2,CV_RGB2GRAY);
      cvReleaseCapture( &pCapturedImage);

      //cvErode(GreyImage2,GreyImage2,NULL,1);
      //cvSaveImage("Test2.jpg",GreyImage2,0);
      
      ImageDiff = cvCreateImage(cvGetSize(pSavedImage1),8,1);
      cvAbsDiff(GreyImage1,GreyImage2,ImageDiff);

      //cvSaveImage("ImageDiff.jpg",ImageDiff,0);
      
      
// seuillage
      BitImage = cvCreateImage(cvGetSize(pSavedImage1),8,1);
      cvThreshold(ImageDiff,BitImage,50,255,CV_THRESH_BINARY);
      //cvSaveImage("BitImage.jpg",BitImage,0);
      PixelRatio = 0;
      for(x=0 ; x < BitImage->height ; x++)
      {
         for( y=0 ;y < BitImage->width ; y++)
          {
            pixel = cvGet2D(BitImage,x,y);

            if(pixel.val[0] == 255)
            {
               WhitePixelCounter = WhitePixelCounter + 1;
               //printf("PixelCount = %f \n", WhitePixelCounter);
            }

           } //FOR width
      
      } //FOR heigth
      
      PixelRatio = (WhitePixelCounter/307200)*100;
      printf("Il y a %f /100 de pixel blancs \n", PixelRatio);
      WhitePixelCounter = 0;

   pSavedImage1 = cvCloneImage(pSavedImage2);
      
   //cvReleaseImage(&pSavedImage1);
   //cvReleaseImage(&pSavedImage2);
   //cvReleaseImage(&GreyImage1);
   //cvReleaseImage(&GreyImage2);
   //cvReleaseImage(&ImageDiff);
   //cvReleaseImage(&BitImage);

} //WHILE

   return 0;

} // MAIN




Mais voici l'erreur retournée:

OpenCV Error: Bad argument (Array should be CvMat or IplImage) in cvGetSize, file /home/morbiducci/OpenCV-2.3.1/modules/core/src/array.cpp, line 1238
terminate called after throwing an instance of 'cv::Exception'
what(): /home/morbiducci/OpenCV-2.3.1/modules/core/src/array.cpp:1238: error: (-5) Array should be CvMat or IplImage in function cvGetSize


Je ne comprends pas et sur internet pu de réponses à ce problème :s. Je n'ai pourtant rien ajouter de plus.

=> AU SECOUR !! :s :s
Posts: 8
Joined: Wed Oct 24, 2012 7:30 pm
by FaAabioOo » Wed Feb 06, 2013 8:37 pm
Concernant motion, c'est un outils semblable à OpenCV ? (avec des fonctions deja toutes faites etc...)
Posts: 8
Joined: Wed Oct 24, 2012 7:30 pm
by FaAabioOo » Wed Feb 06, 2013 9:03 pm
J'ai tester motion, mais je n comprends pas, on l'execute et il ne fait que prendre des cliché avec la webcam :s
Posts: 8
Joined: Wed Oct 24, 2012 7:30 pm
by nikotinux » Wed Feb 06, 2013 10:42 pm
l'erreur a lieu quand ?
erreur de compilation sur ton raspberry ?
ou tu as essayé de compiler sur un desktop ?
ou est-ce une erreur d'execution sur le raspberry ou sur un desktop ?

je ne sais pas trop comment t'aider vu que je ne connais pas cette librairie ...
j'ai essayé de regarder la doc sur ce qui me semble le site officiel de cette lib ( http://opencv.org ) mais je ne trouve pas les mêmes API ...

concernant motion ce programme permet certes de visualiser et controler a distance une ou plusieurs cam mais aussi de détecter des mouvements et de réagir. tout ce définit dans un fichier de configuration avec de nombreuses options très complètes.
j'attends la disponibilité du module de camera annoncé par la fondation pour me relancer dans mes tests sur ce programme.
Posts: 182
Joined: Sat Feb 02, 2013 2:11 am