问题描述
#include<cv.h>#include<highgui.h>#include<stdio.h>#include<stdlib.h>#include<math.h>#include<cxcore.h>//#defineN500#defineE3.3554//本文用基于T分布的变化监测intmain(){intk,n=1,dif[3][9],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};inti,j;char*a1,*a2,*a3,**b1,**b2,**b3;floats[3],f[3],t[3],sum[240][960];IplImage*fram,*pimg1,*pimg2,*pimg3;//读视频printf("稍微等一会儿n");CvCapture*capture;capture=cvCreateFileCapture("E:\cheliutest.avi");//为了方便将测试视频重命名为test.avifram=cvQueryFrame(capture);cvSaveImage("test1.bmp",fram);/*cvNamedWindow("backgroud1");cvShowImage("backgroud1",fram);cvWaitKey(0);*/pimg1=cvLoadImage("test1.bmp",1);//创建一个同规格的图像用来存储背景图像CvSizesize=cvSize(pimg1->width,pimg1->height);pimg3=cvCreateImage(size,pimg1->depth,3);a3=pimg3->imageData;b3=newchar*[pimg3->height];for(i=0;i<pimg3->height;i++)b3[i]=&a3[i*pimg3->widthStep];int**count;count=newint*[240];for(i=0;i<240;i++)count[i]=newint[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=newchar*[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=newchar*[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]=unsignedchar(b2[i+c[k][0]][3*(j+c[k][1])])-unsignedchar(b1[i+c[k][0]][3*(j+c[k][1])]);dif[1][k]=unsignedchar(b2[i+c[k][0]][3*(j+c[k][1])+1])-unsignedchar(b1[i+c[k][0]][3*(j+c[k][1])+1]);dif[2][k]=unsignedchar(b2[i+c[k][0]][3*(j+c[k][1])+2])-unsignedchar(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]=unsignedchar(b2[i][3*j])-unsignedchar(b1[i][3*j]);dif[1][8]=unsignedchar(b2[i][3*j+1])-unsignedchar(b1[i][3*j+1]);dif[2][8]=unsignedchar(b2[i][3*j+2])-unsignedchar(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]);//计算tt[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]+=(unsignedchar)b2[i][3*j];sum[i][3*j+1]+=(unsignedchar)b2[i][3*j+1];sum[i][3*j+2]+=(unsignedchar)b2[i][3*j+2];count[i][j]+=1;}//printf("%d",count[i][j]);//printf("%d,%d,%dn",sum[i][3*j],sum[i][3*j+1],sum[i][3*j+2]);}printf("%d,%d,%dn",f[0],f[1],f[2]);//printf("正常0n");}//printf("正常2n");cvReleaseImage(&pimg1);printf("正常2n");pimg1=cvLoadImage("test2.bmp",1);cvReleaseImage(&pimg2);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("%dzhengvhang%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);*/}}}cvSaveImage("backgroud1.bmp",pimg3);/*cvNamedWindow("backgroud1");cvShowImage("backgroud1",pimg2);cvWaitKey(0);*///cvSaveImage("test1.bmp",pimg1);cvReleaseImage(&pimg1);cvReleaseImage(&pimg3);delete[]b1;delete[]b2;for(i=0;i<240;i++)delete[]count[i];delete[]count;return0;}
解决方案
解决方案二:
编译没错,但是调试会有unhandledexceptionin。楼主小白,刚接触OPENCV,不要嫌我笨啊
解决方案三:
查了一下说是下标超了,但检查半天没发现哪里超了啊。。。
解决方案四:
调试。如果不好调试。写记事本。先在几个地方加。运行。看看出现在那块区域。再加。