问题描述
- opencv debug可以 release报错
-
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("1n"); for(i=0;i<240;i++) for(j=0;j<960;j++) sum[i][j]=0; //printf("1n"); 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("正常1n"); 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("%dn",n); } //printf("%dn",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 %dn",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 %fn",sum[i][3*j],sum[i][3*j+1],sum[i][3*j+2]); //printf("%d %d %d %dn",b3[i][3*j],b3[i][3*j+1],b3[i][3*j+2],j); } } //printf("%dn",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; }
解决方案
你b1,b2是二级指针,需要从最里面一层层释放
解决方案二:
看看你程序写的有问题没,完后看看的库的加载是否正确
时间: 2024-10-02 18:57:24