Bonjour,
J'ai écrit un petit code qui me permet de lire une vidéo à partir d'un fichier et qui calcule la différence entre deux images qui se suivent. Mais ce programme présente un défaut énorme:il bouffe la mémoire. et donc, j'ai pensé à détruire les variables temporaires, mais j'obtiens un message d'erreur au moment de l'exécution(pas de problème au moment de la compilation): "Unknown error code -49(Deallocation error) ..."
Voci mon 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
 
 
#include <iostream>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <cmath>
using namespace std;
double calcul(IplImage* ImTemp1, IplImage* ImTemp2);
int main()
{
   	CvCapture* input_video=NULL;
	input_video = cvCaptureFromFile("video.avi");
	int FrameNumber = static_cast<int> (cvGetCaptureProperty (input_video, CV_CAP_PROP_FRAME_COUNT));
	printf("%d\n",FrameNumber);
 
	IplImage* ImTemp1=NULL;
	cvSetCaptureProperty(input_video, CV_CAP_PROP_POS_FRAMES,0);
    ImTemp1=cvQueryFrame(input_video);
 
 
	    for (int i=0;i<FrameNumber-1;i++)
        {
            double somme;
            IplImage* ImTemp2=NULL;
            cvSetCaptureProperty(input_video, CV_CAP_PROP_POS_FRAMES,i+1);
            ImTemp2=cvQueryFrame(input_video);
            cvNamedWindow("F1",1);
            cvShowImage("F1",ImTemp2);
            cvWaitKey(1);
            ImTemp1=cvCloneImage(ImTemp2);
            cvReleaseImage(&ImTemp2);
            somme=calcul(ImTemp1,ImTemp2);
        }
 
    cvReleaseCapture(&input_video);
    return 0;
}
double calcul(IplImage* ImTemp1, IplImage* ImTemp2)
{
    double res=(double)ImTemp1->width*(double)ImTemp1->height;
    CvScalar scalaire1;
    CvScalar scalaire2;
    double somme = 0;
    for (int x=0; x<ImTemp1->width; x++)
        {
            for (int y=0; y<ImTemp1->height; y++)
            {
                scalaire1=cvGet2D(ImTemp1,y,x);
                scalaire2=cvGet2D(ImTemp2,y,x);
                somme = somme + std::abs((double)scalaire1.val[0]- (double)scalaire2.val[0]);
            }
        }
        return somme/res;
}
Si je met la ligne " cvReleaseImage(&ImTemp2);" en commentaire le programme marche bien je retrouve le problème de mémoire.