opencv配置正确。debug没有问题。release下提示在倒数5,6行使用了未初始化的b1,b2(是注释掉的两行,b1,b2在main函数下第三行声明),代码生成失败。想问问是什么原因。我把这两行注释掉了,程序可以运行,但是不delete好么,会不会有什么弊端。以下是代码。
#include<cv.h>
#include<highgui.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<cxcore.h>
//#define N 500
#define E 3.3554//本文用基于T分布的变化监测
int main()
{ int i,j,k,dif[3][9],n=1,m,c[8][2]={{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1},{1,0},{1,1}},e[8]={1,0,1,0,1,0,1,0};
char *a1,*a2,*a3,**b1,**b2,**b3;
float s[3],f[3],t[3],sum[240][960];
IplImage*fram,*pimg1,*pimg2,*pimg3;
//读视频
printf("稍微等一会儿\n");
CvCapture *capture;
capture=cvCreateFileCapture("C:\\Users\\luxu\\Documents\\Visual Studio 2013\\Projects\\Project4\\Debug\\video1.avi");//为了方便将测试视频重命名为test.avi
fram=cvQueryFrame(capture);
cvSaveImage("test1.bmp",fram);
pimg1=cvLoadImage("test1.bmp",1);
//创建一个同规格的图像用来存储背景图像
CvSize size=cvSize(pimg1->width,pimg1->height);
pimg3=cvCreateImage(size,pimg1->depth,3);
a3=pimg3->imageData;
b3=new char*[pimg3->height];
for(i=0;i<pimg3->height;i++)
b3[i]=&a3[i*pimg3->widthStep];
int **count;
count=new int*[240];
for(i=0;i<240;i++)
count[i]=new int[320];
//初始化
//printf("1");
for(i=0;i<240;i++)
for(j=0;j<320;j++)
count[i][j]=0;
//printf("1\n");
for(i=0;i<240;i++)
for(j=0;j<960;j++)
sum[i][j]=0;
//printf("1\n");
while(n<200)//取前100帧图像用于重建背景
{//一维数组变二维
b1=new char*[pimg1->height];
a1=pimg1->imageData;
for(i=0;i<pimg1->height;i++)
b1[i]=&a1[i*pimg1->widthStep];
fram=cvQueryFrame(capture);
if(!fram)
break;
cvSaveImage("test2.bmp",fram);
pimg2=cvLoadImage("test2.bmp",1);
b2=new char*[pimg2->height];
a2=pimg2->imageData;
for(i=0;i<pimg2->height;i++)
b2[i]=&a2[i*pimg2->widthStep];
for(i=0;i<3;i++)
{
s[i]=0;
f[i]=0;
}
//printf("正常1\n");
for(i=1;i<pimg1->height-1;i++)
{
for(j=1;j<pimg1->width-1;j++)
{ for(k=0;k<8;k++)
{ //选取领域的窗口为3*3对每一个像素点进行T分布变换监测
dif[0][k]=unsigned char(b2[i+c[k][0]][3*(j+c[k][1])])-unsigned char(b1[i+c[k][0]][3*(j+c[k][1])]);
dif[1][k]=unsigned char(b2[i+c[k][0]][3*(j+c[k][1])+1])-unsigned char(b1[i+c[k][0]][3*(j+c[k][1])+1]);
dif[2][k]=unsigned char(b2[i+c[k][0]][3*(j+c[k][1])+2])-unsigned char(b1[i+c[k][0]][3*(j+c[k][1])+2]);
f[0]+=dif[0][k];
f[1]+=dif[1][k];
f[2]+=dif[2][k];
}
dif[0][8]=unsigned char(b2[i][3*j])-unsigned char(b1[i][3*j]);
dif[1][8]=unsigned char(b2[i][3*j+1])-unsigned char(b1[i][3*j+1]);
dif[2][8]=unsigned char(b2[i][3*j+2])-unsigned char(b1[i][3*j+2]);
f[0]+=dif[0][8];
f[1]+=dif[1][8];
f[2]+=dif[2][8];
f[0]/=9;
f[1]/=9;
f[2]/=9;
for(k=0;k<9;k++)
{
s[0]+=(dif[0][k]-f[0])*(dif[0][k]-f[0]);
s[1]+=(dif[1][k]-f[1])*(dif[1][k]-f[1]);
s[2]+=(dif[2][k]-f[2])*(dif[2][k]-f[2]);
}
s[0]/=8;
s[1]/=8;
s[2]/=8;
s[0]=sqrt(s[0]);s[1]=sqrt(s[1]);s[2]=sqrt(s[2]);
//计算t
t[0]=(3*f[0]/s[0]);
t[1]=(3*f[1]/s[1]);
t[2]=(3*f[2]/s[2]);
if(fabs(t[0])<E&&fabs(t[1])<E&&fabs(t[2])<E)//这里的E是当α=0.001自由度为8时差T分布表所得的置信区间
{
sum[i][3*j]+=(unsigned char)b2[i][3*j];
sum[i][3*j+1]+=(unsigned char)b2[i][3*j+1];
sum[i][3*j+2]+=(unsigned char)b2[i][3*j+2];
count[i][j]+=1;
}
}
}
cvReleaseImage(&pimg1);
pimg1=cvLoadImage("test2.bmp",1);
cvReleaseImage(&pimg2);
n++;
//printf("%d\n",n);
}
//printf("%d\n",b1[8][22]);
for(i=1;i<pimg1->height-1;i++)
{
for(j=1;j<pimg1->width-1;j++)
{ m=count[i][j];
//printf("%d %d\n",m,j);
//m=100;
//计算背景图像的像素值
if(m!=0)
{ b3[i][3*j]=sum[i][3*j]/m;
b3[i][3*j+1]=sum[i][3*j+1]/m;
b3[i][3*j+2]=sum[i][3*j+2]/m;
//if(i==2)
//printf("%f %f %f\n",sum[i][3*j],sum[i][3*j+1],sum[i][3*j+2]);
//printf("%d %d %d %d\n",b3[i][3*j],b3[i][3*j+1],b3[i][3*j+2],j);
}
}
//printf("%d\n",i);
}
cvSaveImage("backgroud1.bmp",pimg3);
//cvSaveImage("test1.bmp",pimg1);
cvReleaseImage(&pimg1);
cvReleaseImage(&pimg3);
//delete []b1;
//delete []b2;
for(i=0;i<240;i++)
delete []count[i];
delete []count;
return 0;
}