麻烦请教一下,我的代码编译没出错,但是就是运行出错
运行需要很长时间,并且最后出错,运行不出来:An unhandled win 32 exception occurred. 最后不能显示图像出来。
代码如下,
头文件:ioptiflowbm.h
# define unchar unsigned char
int d=4;
int temp[9];//temp数组存放每次搜索的九个块的MAD值
int n1=0;//每第1次搜索的九个块中MAD值最小的一个块的编号
int n2=0;//每第2次搜索的九个块中MAD值最小的一个块的编号
int n3=0;//每第3次搜索的九个块中MAD值最小的一个块的编号
int x2=0;
int y2=0;//x2,y2为第二次搜索的起始位置
int x3=0;
int y3=0;//x3,y3为第三次搜索的起始位置
int x4=0;
int y4=0;//最终位置
int px2,py2;
int px1,py1;
int getx2[88];
int gety2[58];
int getx1[88];
int gety1[58];
int m;
int n;
int prev_block[8][8]; //前一帧的对应块的像素值
int curr_block[8][8]; //
int iMAD(int prev_block[8][8],int curr_block[8][8])
{
int temp=0;
int value=0;
int sum=0;
int mad_value=0;
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
temp=curr_block[i][j]-prev_block[i][j];
sum+=abs(temp);
}
}
mad_value=sum/256;
return mad_value;
}//两块的平均绝对帧差MAD
void icvCalcOpticalFlowBM(const IplImage* prev, const IplImage* curr,
CvSize block_size=cvSize(1, 1),
CvSize shift_size=cvSize(1, 1),
CvSize max_range=cvSize(1, 1),
int use_previous=0)
{
int prev_frame[480][720];
int curr_frame[480][720];
for(int y=0;y<480;y++)
{
unchar*ptr1=(unchar*)(prev->imageData+y*prev->widthStep);
unchar*ptr2=(unchar*)(curr->imageData+y*curr->widthStep);
for(int x=0;x<720;x++)
{
prev_frame[x][y]=*(ptr1+x);
curr_frame[x][y]=*(ptr2+x);//grid1,grid2存入图像数据
}
}
//unchar new_block[8][8]; //后一帧的对应块的像素值
for( n=1;n<59;n++)
{
for ( m=1;m<89;m++)
{
for(int i=0;i<8;i++)//重点看看这儿
for(int j=0;j<8;j++)
prev_block[i][j]=prev_frame[i+8*n][j+8*m];//取出帧中的一个像素块放到cur_block[8][8]中去
// first_search()
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
{
curr_block[i][j]=curr_frame[8*n-d+i][8*m-d+j];
}
temp[0]=iMAD(prev_block,curr_block);
for(int i_1=0;i_1<8;i_1++)
for(int j_1=0;j_1<8;j_1++)
{
curr_block[i_1][j_1]=curr_frame[8*n-d+i_1][8*m+j_1];
}
temp[1]=iMAD(prev_block,curr_block);
for(int i_2=0;i_2<8;i_2++)
for(int j_2=0;j_2<8;j_2++)
{
curr_block[i_2][j_2]=curr_frame[8*n-d+i_2][8*m+d+j_2];
}
temp[2]=iMAD(prev_block,curr_block);
for(int i_3=0;i_3<8;i_3++)
for(int j_3=0;j_3<8;j_3++)
{
curr_block[i_3][j_3]=curr_frame[8*n+i_3][8*m-d+j_3];
}
temp[3]=iMAD(prev_block,curr_block);
for(int i_4=0;i_4<8;i_4++)
for(int j_4=0;j_4<8;j_4++)
{
curr_block[i_4][j_4]=curr_frame[8*n+i_4][8*m+j_4];
}
temp[4]=iMAD(prev_block,curr_block);
for(int i_5=0;i_5<8;i_5++)
for(int j_5=0;j_5<8;j_5++)
{
curr_block[i_5][j_5]=curr_frame[8*n+i_5][8*m+d+j_5];
}
temp[5]=iMAD(prev_block,curr_block);
for(int i_6=0;i_6<8;i_6++)
for(int j_6=0;j_6<8;j_6++)
{
curr_block[i_6][j_6]=curr_frame[8*n+d+i_6][8*m-d+j_6];
}
temp[6]=iMAD(prev_block,curr_block);
for(int i_7=0;i_7<8;i_7++)
for(int j_7=0;j_7<8;j_7++)
{
curr_block[i_7][j_7]=curr_frame[8*n+d+i_7][8*m+j_7];
}
temp[7]=iMAD(prev_block,curr_block);
for(int i_8=0;i_8<8;i_8++)
for(int j_8=0;j_8<8;j_8++)
{
curr_block[i_8][j_8]=curr_frame[8*n+d+i_8][8*m+d+j_8];
}
temp[8]=iMAD(prev_block,curr_block);
int temp1[9];
for(int i=0;i<9;i++)
{ temp1[i]=temp[i];}
int temp_1=0;
for(int i2=0;i2<9;i2++)
{ for(int j2=i2+1;j2<9;j2++)
{ if(temp1[i2]>temp1[j2])
{ temp_1=temp1[i2];
temp1[i2]=temp1[j2];
temp1[j2]=temp_1;
}
}
}//从小到大排序
for(int i3=0;i3<9;i3++)
{ if(temp1[0]==temp[i3])
{ n1=i3;}
}
//second_search()
switch(n1)
{
case 0:x2=8*m-d;y2=8*n-d;break;
case 1:x2=8*m-d;y2=8*n;break;
case 2:x2=8*m-d;y2=8*n+d;break;
case 3:x2=8*m;y2=8*n-d;break;
case 4:x2=8*m;y2=8*n;break;
case 5:x2=8*m;y2=8*n+d;break;
case 6:x2=8*m+d;y2=8*n-d;break;
case 7:x2=8*m+d;y2=8*n;break;
case 8:x2=8*m+d;y2=8*n+d;break;
}
for(int ii_0=0;ii_0<8;ii_0++)
for(int jj_0=0;jj_0<8;jj_0++)
{
curr_block[ii_0][jj_0]=curr_frame[x2-d/2+ii_0][y2-d/2+jj_0];
}
temp[0]=iMAD(prev_block,curr_block);
for(int ii_1=0;ii_1<8;ii_1++)
for(int jj_1=0;jj_1<8;jj_1++)
{
curr_block[ii_1][jj_1]=curr_frame[x2-d/2+ii_1][y2+jj_1];
}
temp[1]=iMAD(prev_block,curr_block);
for(int ii_2=0;ii_2<8;ii_2++)
for(int jj_2=0;jj_2<8;jj_2++)
{
curr_block[ii_2][jj_2]=curr_frame[x2-d/2+ii_2][y2+d/2+jj_2];
}
temp[2]=iMAD(prev_block,curr_block);
for(int ii_3=0;ii_3<8;ii_3++)
for(int jj_3=0;jj_3<8;jj_3++)
{
curr_block[ii_3][jj_3]=curr_frame[x2+ii_3][y2-d/2+jj_3];
}
temp[3]=iMAD(prev_block,curr_block);
for(int ii_4=0;ii_4<8;ii_4++)
for(int jj_4=0;jj_4<8;jj_4++)
{
curr_block[ii_4][jj_4]=curr_frame[x2+ii_4][y2+jj_4];
}
temp[4]=iMAD(prev_block,curr_block);
for(int ii_5=0;ii_5<8;ii_5++)
for(int jj_5=0;jj_5<8;jj_5++)
{
curr_block[ii_5][jj_5]=curr_frame[x2+ii_5][y2+d/2+jj_5];
}
temp[5]=iMAD(prev_block,curr_block);
for(int ii_6=0;ii_6<8;ii_6++)
for(int jj_6=0;jj_6<8;jj_6++)
{
curr_block[ii_6][jj_6]=curr_frame[x2+d/2+ii_6][y2-d/2+jj_6];
}
temp[6]=iMAD(prev_block,curr_block);
for(int ii_7=0;ii_7<8;ii_7++)
for(int jj_7=0;jj_7<8;jj_7++)
{
curr_block[ii_7][jj_7]=curr_frame[x2+d/2+ii_7][y2+jj_7];
}
temp[7]=iMAD(prev_block,curr_block);
for(int ii_8=0;ii_8<8;ii_8++)
for(int jj_8=0;jj_8<8;jj_8++)
{
curr_block[ii_8][jj_8]=curr_frame[x2+d/2+ii_8][y2+d/2+jj_8];
}
temp[8]=iMAD(prev_block,curr_block);
int temp2[9];
for(int i=0;i<9;i++)
{ temp2[i]=temp[i];}
int temp_2=0;
for(int i1=0;i1<9;i1++)
{ for(int j1=i1+1;j1<9;j1++)
{ if(temp2[i1]>temp2[j1])
{ temp_2=temp2[i1];
temp2[i1]=temp2[j1];
temp2[j1]=temp_2;
}
}
}//从小到大排序
for(int i2=0;i2<9;i2++)
{ if(temp2[0]==temp[i2])
{ n2=i2;}
}
// third_search()
switch(n2)
{case 0:x3=x2-d/2;y3=y2-d/2;break;
case 1:x3=x2-d/2;y3=y2;break;
case 2:x3=x2-d/2;y3=y2+d/2;break;
case 3:x3=x2;y3=y2-d/2;break;
case 4:x3=x2;y3=y2;break;
case 5:x3=x2;y3=y2+d/2;break;
case 6:x3=x2+d/2;y3=y2-d/2;break;
case 7:x3=x2+d/2;y3=y2;break;
case 8:x3=x2+d/2;y3=y2+d/2;break;
}
for(int iii_0=0;iii_0<8;iii_0++)
for(int jjj_0=0;jjj_0<8;jjj_0++)
{
curr_block[iii_0][jjj_0]=curr_frame[x3-d/4+iii_0][y3-d/4+jjj_0];
}
temp[0]=iMAD(prev_block,curr_block);
for(int iii_1=0;iii_1<8;iii_1++)
for(int jjj_1=0;jjj_1<8;jjj_1++)
{
curr_block[iii_1][jjj_1]=curr_frame[x3-d/4+iii_1][y3+jjj_1];
}
temp[1]=iMAD(prev_block,curr_block);
for(int iii_2=0;iii_2<8;iii_2++)
for(int jjj_2=0;jjj_2<8;jjj_2++)
{
curr_block[iii_2][jjj_2]=curr_frame[x3-d/4+iii_2][y3+d/4+jjj_2];
}
temp[2]=iMAD(prev_block,curr_block);
for(int iii_3=0;iii_3<8;iii_3++)
for(int jjj_3=0;jjj_3<8;jjj_3++)
{
curr_block[iii_3][jjj_3]=curr_frame[x3+iii_3][y3-d/4+jjj_3];
}
temp[3]=iMAD(prev_block,curr_block);
for(int iii_4=0;iii_4<8;iii_4++)
for(int jjj_4=0;jjj_4<8;jjj_4++)
{
curr_block[iii_4][jjj_4]=curr_frame[x3+iii_4][y3+jjj_4];
}
temp[4]=iMAD(prev_block,curr_block);
for(int iii_5=0;iii_5<8;iii_5++)
for(int jjj_5=0;jjj_5<8;jjj_5++)
{
curr_block[iii_5][jjj_5]=curr_frame[x3+iii_5][y3+d/4+jjj_5];
}
temp[5]=iMAD(prev_block,curr_block);
for(int iii_6=0;iii_6<8;iii_6++)
for(int jjj_6=0;jjj_6<8;jjj_6++)
{
curr_block[iii_6][jjj_6]=curr_frame[x3+d/4+iii_6][y3-d/4+jjj_6];
}
temp[6]=iMAD(prev_block,curr_block);
for(int iii_7=0;iii_7<8;iii_7++)
for(int jjj_7=0;jjj_7<8;jjj_7++)
{
curr_block[iii_7][jjj_7]=curr_frame[x3+d/4+iii_7][y3+jjj_7];
}
temp[7]=iMAD(prev_block,curr_block);
for(int iii_8=0;iii_8<8;iii_8++)
for(int jjj_8=0;jjj_8<8;jjj_8++)
{
curr_block[iii_8][jjj_8]=curr_frame[x3+d/4+iii_8][y3+d/4+jjj_8];
}
temp[8]=iMAD(prev_block,curr_block);
int temp3[9];
for(int i=0;i<9;i++)
{ temp3[i]=temp[i];}
int temp_3=0;
for(int i1=0;i1<9;i1++)
{ for(int j1=i1+1;j1<9;j1++)
{ if(temp3[i1]>temp3[j1])
{ temp_3=temp3[i1];
temp3[i1]=temp3[j1];
temp3[j1]=temp_3;
}
}
}//从小到大排序
for(int i2=0;i2<9;i2++)
{ if(temp3[0]==temp[i2])
{ n3=i2;}
}
switch(n3)
{
case 0:x4=x3-d/4;y4=y3-d/4;break;
case 1:x4=x3-d/4;y4=y3;break;
case 2:x4=x3-d/4;y4=y3+d/4;break;
case 3:x4=x3;y4=y3-d/4;break;
case 4:x4=x3;y4=y3;break;
case 5:x4=x3;y4=y3+d/4;break;
case 6:x4=x3+d/4;y4=y3-d/4;break;
case 7:x4=x3+d/4;y4=y3;break;
case 8:x4=x3+d/4;y4=y3+d/4;break;
}
// cvLine(result, cvPoint((j-1)*8+4, (i-1)*8+4), cvPoint((j+dx-1)*8+4,
//(i+dy-1)*8+4),
//CV_RGB(0,0,0), 1, 8, 0);
for ( px2=0,py2=0;px2<88,py2<58;px2++,py2++)
{
getx2[px2]=x4;
gety2[py2]=y4;
}
for ( px1=0,py1=0;px1<88,py1<58;px1++,py1++)
{
getx1[px1]=m;
gety1[py1]=n;
}
}
}
}
[解决办法]
这个肯定是你自己逻辑错误了,用单步调试一下就知道原因了。
还是要靠自己
[解决办法]
图像块匹配吗?估计是内存那访问越界还是怎么回事了,这个需要你跟踪进去了。
[解决办法]
单步调试吧。眼多花了。
[解决办法]