资源简介
块匹配运动算法 菱形算法
块匹配运动算法 菱形算法
块匹配运动算法 菱形算法
代码片段和文件信息
#include “stdio.h“
#include “stdlib.h“
#include “malloc.h“
#include “string.h“
#include “sys/timeb.h“
#include “math.h“
#include “inf.h“
#define MIN(ab) ((a)<(b))?(a):(b);
#define MAX(ab) ((a)>(b))?(a):(b);
int SAD(const int oxconst int oyconst int dxconst int dyconst int heightconst int widthuint32 &best_sad)
{
const int rx=ox+dxry=oy+dy;
if( abs(dx)>MAX_MOTION || abs(dy)>MAX_MOTION || flag_search[dx][dy]>0 )
return 0;
if( rx<0 || ry<0 || rx+height>XX || ry+width>YY )
return 0;
uint32 sad=0;
frame_info.frame_pot++;
const uint8 *p1=¤t_frame[ox][oy]*p2=&ref_frame[rx][ry];
for(int i=0;i {
for(int j=0;j {
sad+=abs(*(p1++)-*(p2++));
}
p1+=(YY-width);p2+=(YY-width);
}
flag_search[dx][dy]=1+sad;
if(sad>=best_sad)
return 0;
best_sad=sad;
return 1;
}
void rebuilt(const int xconst int yconst int heightconst int width)
{
const int dx=frame_info.mv[x][y].dxdy=frame_info.mv[x][y].dy;
const int ox=x*BLOCK_HEIGTHoy=y*BLOCK_WIDTH;
const int rx=ox+dxry=oy+dy;
int tmp;
const uint8 *p1=¤t_frame[ox][oy]*p2=&ref_frame[rx][ry];
if( abs(dx)>MAX_MOTION || abs(dy)>MAX_MOTION )
exit(0);
if( rx<0 || ry<0 || rx+height>XX || ry+width>YY )
exit(0);
for(int i=0;i {
for(int j=0;j {
tmp=*(p1++)-*(p2++);
frame_info.frame_sse+=tmp*tmp;
}
p1+=(YY-width);p2+=(YY-width);
}
}
void search_FS(const int xconst int yconst int heigthconst int width)
{
const int ox=x*BLOCK_HEIGTHoy=y*BLOCK_WIDTH;
uint32 sad=0xffffff;
MV mv;
for(int i=-MAX_MOTION;i<=MAX_MOTION;i++)
{
for(int j=-MAX_MOTION;j<=MAX_MOTION;j++)
{
if(SAD(oxoyijheigthwidthsad)==1)
{
mv.dx=i;mv.dy=j;
}
}
}
frame_info.mv[x][y]=mv;
frame_info.sad[x][y]=sad;
frame_info.frame_sad+=sad;
}
void main()
{
int num;
if((fp = fopen(SOURCE_FILE“rb“))==NULL) return;
frame_info.sum_pot=frame_info.sum_sad=frame_info.sum_sse=0;
frame_info.mv=_mv_buffer[0];frame_info.prev_mv=_mv_buffer[1];
printf(“frame\tcost\tpsnr\n“);
for(num=0;num<100;num++)
{
int ij;
fseek(fpXX*YY*3/2*(num+1)SEEK_SET);
if(fread(current_frame[0]XX*YY1fp)==0) break;
fseek(fpXX*YY*3/2*(num+0)SEEK_SET);
if(fread(ref_frame[0]XX*YY1fp)==0) break;
frame_info.frame_pot=frame_info.frame_sad=frame_info.frame_sse=0;
for( i=0;i {
for( j=0;j {
memset(_flag_search0SEARCH_RANGE*SEARCH_RANGE);
search_FS(ijBLOCK_HEIGTHBLOCK_WIDTH);
rebuilt(ijBLOCK_HEIGTHBLOCK_WIDTH);
}
}
frame_info.sum_pot+=frame_info.frame_pot;
frame_info.sum_sad+=frame_info.frame_sad;
frame_info.sum_sse+=frame_info.frame_sse;
MV (*mv_tmp)[Y]=frame_info.mv;frame_info.mv=frame_info.prev_mv;frame_info.prev_mv=mv_tmp;
memcpy(frame_info.prev_sadframe_info.sadX*Y*sizeof(uint32));
printf(“%d\t%.2f\t%.2f\n“num(float)frame_info.frame_pot/X/Y10*log10(XX
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 152064 2009-11-18 09:42 02.yuv
文件 152064 2009-11-18 09:42 FSME\01.yuv
文件 152064 2009-11-18 09:42 FSME\02.yuv
文件 4322 2009-08-05 08:41 FSME\FSME.dsp
文件 533 2009-08-05 08:36 FSME\FSME.dsw
文件 66560 2009-11-28 22:57 FSME\FSME.ncb
文件 53760 2009-11-28 22:57 FSME\FSME.opt
文件 1450 2009-11-28 22:43 FSME\FSME.plg
文件 982 2009-11-27 18:47 FSME\inf.h
文件 3175 2009-11-28 22:43 FSME\main.cpp
文件 3377 2009-11-27 11:13 FSME\main.dsp
文件 533 2009-11-27 11:16 FSME\main.dsw
文件 41984 2009-11-27 11:24 FSME\main.ncb
文件 48640 2009-11-27 11:24 FSME\main.opt
文件 242 2009-11-27 11:24 FSME\main.plg
文件 152064 2009-11-18 09:42 01.yuv
目录 0 2010-03-19 23:18 FSME
----------- --------- ---------- ----- ----
833814 17
- 上一篇:ccnbie.doc
- 下一篇:湍流程序仿真
评论
共有 条评论