salut
je m'explique j'ai un code de opencv qui fonctionne environ 30 secondes puis il s’arrête et affiche le message suivant :"Unhandled exception at 0x756a9673 in test1.exe: Microsoft C++ exception: cv::Exception at memory location 0x0028ef14.."
je crois que c'est un problème de réinitialisation de mémoire voici mon code
// test3.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <cv.h>
#include <math.h>
#include <highgui.h>
#include <ctime>
CvCapture *capture;
IplImage* skipNFrames(CvCapture* capture, int n)
{
for(int i = 0; i < n; ++i)
{
if(cvQueryFrame(capture) == NULL)
{
return NULL;
}
}
return cvQueryFrame(capture);
}
int height,width,step,channels;
int i,j,k;
int e,r,e0,r0,e1,r1,e2,r2,e3,r3;
int main(int argc, char *argv[])
{IplImage* im4;
IplImage* im7;
IplImage* im6;
IplImage* im5;
IplImage* im0;
IplImage* ref3;
IplImage* img;
IplImage* ref;
CvScalar scalaire,scalaire2;
using namespace std;
img = cvLoadImage("C:/refmasq.jpg", 1);
ref=cvLoadImage("C:/pip.jpg",1);
cvSetImageROI(ref, cvRect(416, 293, 43, 57));
IplImage *ref2 = cvCreateImage(cvSize(43,57),
ref->depth,
ref->nChannels);
cvCopy(ref, ref2, NULL);
cvResetImageROI(ref);
CvCapture* capture = cvCaptureFromFile("C:/original.mpg");
time_t tbegin,tend;
double texec=0.;
// Start timer
tbegin=time(NULL);
while(cvWaitKey(100)!=' ')
{im0 = skipNFrames(capture, 25);
double c3=1000000000,c0=1000000000,c1=1000000000,c2=1000000000;
for (int p=0; p<50 ; p++)
{for(int u=0; u<50; u++)
{cvSetImageROI(im0, cvRect(416+p, 293+u, 43, 57));
IplImage *ref3 = cvCreateImage(cvSize(43,57),im0->depth,im0->nChannels);
cvCopy(im0, ref3, NULL);
double c=cvNorm(ref3,ref2);
if (c<c0)
{c0=c;
e0=p;
r0=u;
}
cvResetImageROI(im0);
}
}
for (int p=0; p<50 ; p++)
{for(int u=0; u<50; u++)
{cvSetImageROI(im0, cvRect(416-p, 293+u, 43, 57));
IplImage *ref3 = cvCreateImage(cvSize(43,57),im0->depth,im0->nChannels);
cvCopy(im0, ref3, NULL);
double c=cvNorm(ref3,ref2);
if (c<c1)
{c1=c;
e1=p;
r1=u;
}
cvResetImageROI(im0);
}
}
for (int p=0; p<50 ; p++)
{for(int u=0; u<50; u++)
{cvSetImageROI(im0, cvRect(416+p, 293-u, 43, 57));
IplImage *ref3 = cvCreateImage(cvSize(43,57),im0->depth,im0->nChannels);
cvCopy(im0, ref3, NULL);
double c=cvNorm(ref3,ref2);
if (c<c2)
{c2=c;
int e2=u;
int r2=p;
}
cvResetImageROI(im0);
}
}
for (int p=0; p<50 ; p++)
{for(int u=0; u<50; u++)
{cvSetImageROI(im0, cvRect(416-p, 293-u, 43, 57));
IplImage *ref3 = cvCreateImage(cvSize(43,57),im0->depth,im0->nChannels);
cvCopy(im0, ref3, NULL);
double c=cvNorm(ref3,ref2);
if (c<c3)
{c3=c;
e3=p;
r3=u;
}
cvResetImageROI(im0);
}
}
double c10=min(min(min(c0,c1),c2),c3);
if (c10==c0)
{e=e0;
r=r0;
}
if (c10==c1)
{e=-e1;
r=r1;
}
if (c10==c2)
{ e=e2;
r=-r2;
}
if (c10==c3)
{
e=-e3;
r=-r3;
}
if (e<0 && r<0)
{for(int i=abs(r); i < im0->width; i++)
{
for(int j=abs(e); j < im0->height; j++)
{ scalaire=cvGet2D(im0, j, i);
//scalaire2=cvGet2D(imgg, j+r , i+e);
/*
for(int k=0; k < img->nChannels; k++)
{//scalaire.val[k]=scalaire2.val[k];
if((j>520)|(j<340)|((i<cvRound(-0.0037*j*j+0.3*j+847.33)))|((i>cvRound(-0.000272*j*j-1.72*j+1260))))
{scalaire.val[k] =0;}
}*/
cvSet2D(im0, j+e, i+r, scalaire);
}
}
}
if (e>0 && r<0)
{for(int i=abs(r); i < im0->width; i++)
{
for(int j=e; j < im0->height; j++)
{scalaire=cvGet2D(im0, j, i);
//scalaire2=cvGet2D(img, j , i);
/* for(int k=0; k < img->nChannels; k++)
{//scalaire.val[k]=scalaire2.val[k];
if((j>520)|(j<340)|((i<cvRound(-0.0037*j*j+0.3*j+847.33)))|((i>cvRound(-0.000272*j*j-1.72*j+1260))))
{scalaire.val[k] =0;}
}*/
cvSet2D(im0, j-e, i+r, scalaire);
}
}
}
if (e<0 && r>0)
{
for(int i=r; i < im0->width; i++)
{
for(int j=abs(e)+1; j < im0->height; j++)
{scalaire=cvGet2D(im0, j, i);
//scalaire2=cvGet2D(imgg, j+e , i+r);
/* for(int k=0; k < img->nChannels; k++)
{ //scalaire.val[k]=scalaire2.val[k];
if((j>520)|(j<340)|((i<cvRound(-0.0037*j*j+0.3*j+847.33)))|((i>cvRound(-0.000272*j*j-1.72*j+1260))))
{scalaire.val[k] =0;}
}*/
cvSet2D(im0, j+e, i-r, scalaire);
}
}
}
if (e>0 && r>0)
{for(int i=r; i < im0->width; i++)
{
for(int j=e; j < im0->height; j++)
{scalaire=cvGet2D(im0, j, i);
// scalaire2=cvGet2D(imgg, j+e, i+r);
//for(int k=0; k < img->nChannels; k++)
//{//scalaire.val[k]=scalaire2.val[k];
//if((j>520)|(j<340)|((i<cvRound(-0.0037*j*j+0.3*j+847.33)))|((i>cvRound(-0.000272*j*j-1.72*j+1260))))
//{scalaire.val[k] =0;}
//}
cvSet2D(im0, j-e, i-r, scalaire);
}
}
}
//imgg = cvCreateImage(cvGetSize(im0), im0->depth, 1);
for(int i=0; i < im0->width; i++)
{
for(int j=0; j < im0->height; j++)
{scalaire=cvGet2D(im0, j, i);
//scalaire2=cvGet2D(imgg, j, i);
for(int k=0; k < img->nChannels; k++)
{
if((j>520)|(j<340)|((i<cvRound(-0.0037*j*j+0.3*j+847.33)))|((i>cvRound(-0.000272*j*j-1.72*j+1260))))
{scalaire.val[k] =0;}
}
cvSet2D(im0, j, i, scalaire);
}
}
im4 = cvCreateImage(cvGetSize(img), img->depth,1);
im5 = cvCreateImage(cvGetSize(img), img->depth,1);
im6 = cvCreateImage(cvGetSize(img), img->depth, 1);
im7 = cvCreateImage(cvGetSize(img), img->depth, 1);
cvCvtColor(im0, im5, CV_BGR2GRAY);
cvCvtColor(img, im4, CV_BGR2GRAY);
cvAbsDiff(im4,im5,im6);
cvThreshold(im6,im7,30,255,CV_THRESH_BINARY);
cvNamedWindow("Ma fenetre", CV_WINDOW_AUTOSIZE);
cvShowImage("Ma fenetre", im7);
tend=time(NULL);
texec=difftime(tend,tbegin);
fprintf(stderr, "temps : %f\n", texec);
// fprintf(stderr, "finale : %d\n", c0);
// cvReleaseImage(& im0);
cvReleaseImage(& im5);
cvReleaseImage(& im6);
cvReleaseImage(& im7);
cvReleaseImage(& im4);
// cvReleaseImage(& ref3);
}
cvWaitKey(0);
}
Partager