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 !