#include<stdio.h>
#include<math.h>
class Block
{
public:
int x,y;
char Array[16][16];
};
int SAD(Block Block1,Block Block2)
{
int i=0,j=0,sad=0;
for(i=0;i<16;i++)
for(j=0;j<16;j++)
sad+=abs(Block2.Array[i][j]-Block1.Array[i][j]);
return sad;
}
Block GetBlock(int x,int y,char tmp[256][256])
{
int i,j;
Block Blocktmp;
Blocktmp.x=x;
Blocktmp.y=y;
for(i=0;i<16;i++)
for(j=0;j<16;j++)
Blocktmp.Array[i][j]=tmp[i+x][j+y];
return Blocktmp;
}
void FSA(char A[256][256],char B[256][256])
{
int flag=0;
int sad,temp;
int i,j,exi=1;
Block Block1,Block2;
Block2=GetBlock(32,16,B);
for(i=0;i<241;i++)
{
for(j=0;j<241;j++)
{
Block1=GetBlock(i,j,A);
temp=SAD(Block1,Block2);
if(temp==0) //sad为0就找到最合适的块
{exi=0;break;}
if(sad>temp) //temp比sad小就交换
sad=temp;
flag++;
}
if(!exi) break;
}
printf("运动矢量:(%d,%d),共搜索了%d次\n",Block2.x-Block1.x,Block2.y-Block1.y,flag);
}
int main()
{
char A[256][256],B[256][256];
int j;
FILE * fa, * fb;
for(int i=0;i<256;i++)
{
for(j=0;j<256;j++)
{
if((i<41&&i>=25)&&(j<36&&j>=20))
A[i][j]=i-20;
else
A[i][j]=i*256+j;
if((i<48&&i>=32)&&(j>=16&&j<32))
B[i][j]=i-27;
else
B[i][j]=i*256+j;
}
}
if(!(fa=fopen("A.raw","wb")))
printf("error to open A.raw\n");
if(!(fb=fopen("B.raw","wb")))
printf("error to open A.raw\n");
fwrite(A,sizeof(A),1,fa);
fwrite(B,sizeof(B),1,fb);
fclose(fa);
fclose(fb);
FSA(A,B);
return 0;
}