📄 search.c
字号:
searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1;
#ifdef OPC
op.c++;
#endif
if(err0<(*err)){
*err=err0;
tmv.x=(dia[i].x>>1);
tmv.y=(dia[i].y>>1);
}
}
}
mv.x=mv.x+tmv.x;
mv.y=mv.y+tmv.y;
spt += count_searchedpt();
return mv;
}
MV scd_search(u_char *prev, u_char *cur, int x, int y, int *err)
{
int i,j,k,b,t,m,n,err0,c=9,ox=x,oy=y,step;
MV mv,tmv;
static MV dia[8]={{-2,0},{-1,-1},{0,-2},{1,-1},{2,0},{1,1},{0,2},{-1,1}};
static MV crx[8]={{-2,0},{-1,0},{0,-2},{0,-1},{2,0},{1,0},{0,2},{0,1}};
init_searchedpt();
*err=mean_abs_err(cur,prev,x,y,x,y,BLOCK_WIDTH,BLOCK_HEIGHT);
searchedpt[MAX_DISP][MAX_DISP]=1;
tmv.x=0;
tmv.y=0;
k=9;
step=1;
for(i=1;i<8;i+=2){
m=x+crx[i].x;
n=y+crx[i].y;
if(bound_chk(m,n,x,y)){
err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT);
searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1;
#ifdef OPC
op.c++;
#endif
if(err0<(*err)){
*err=err0;
tmv=crx[i];
k=i;
}
}
}
mv=tmv;
if(k==9) {
spt += count_searchedpt();
printf("c%d ", count_searchedpt());
return mv; //1st-step-stop
}
if(k!=9) {
step+=1;
c=k; k=9;
tmv.x=0; tmv.y=0;
t=3; //3 new point of SCSP.
b=-2; j=(c+b)<0?(8+c+b):(c+b);
for(i=0;i<t;i++){
m=x+mv.x+crx[j].x;
n=y+mv.y+crx[j].y;
if(bound_chk(m,n,x,y)){
err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT);
searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1;
#ifdef OPC
op.c++;
#endif
if(err0<(*err)){
*err=err0;
tmv=crx[j];
k=j;
mv=tmv;
}
}
j=(j+2)>7?1:(j+2);
}
mv.x=mv.x+tmv.x;
mv.y=mv.y+tmv.y;
}
if(k==9 && c%2==1) {
spt += count_searchedpt();
printf("s%d ", count_searchedpt());
return mv; //2nd-step-stop
}
k=k-1;
while(1){
if(k==9)
break;
else{
j=k;k=9;
tmv.x=0;tmv.y=0;
}
step+=1;
if(j%2==1){
t=3;b=-1;
} else{
t=5;b=-2;
}
j=(j+b)<0?(8+j+b):(j+b);
for(i=0;i<t;i++){
m=x+mv.x+dia[j].x;
n=y+mv.y+dia[j].y;
if(bound_chk(m,n,x,y)){
err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT);
searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1;
#ifdef OPC
op.c++;
#endif
if(err0<(*err)){
*err=err0;
tmv=dia[j];
k=j;
}
}
j=(j+1)>7?0:(j+1);
}
mv.x=mv.x+tmv.x;
mv.y=mv.y+tmv.y;
}
tmv.x=0;tmv.y=0;
for(i=0;i<8;i+=2){
m=x+mv.x+(dia[i].x>>1);
n=y+mv.y+(dia[i].y>>1);
if(bound_chk(m,n,x,y)){
err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT);
searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1;
#ifdef OPC
op.c++;
#endif
if(err0<(*err)){
*err=err0;
tmv.x=(dia[i].x>>1);
tmv.y=(dia[i].y>>1);
}
}
}
mv.x=mv.x+tmv.x;
mv.y=mv.y+tmv.y;
spt += count_searchedpt();
return mv;
}
MV ncd_search(u_char *prev, u_char *cur, int x, int y, int *err)
{
int i,j,k,b,t,m,n,err0,c=9,ox=x,oy=y,step;
MV mv,tmv;
static MV dia[8]={{-2,0},{-1,-1},{0,-2},{1,-1},{2,0},{1,1},{0,2},{-1,1}};
static MV crx[8]={{-2,0},{-1,0},{0,-2},{0,-1},{2,0},{1,0},{0,2},{0,1}};
static MV lcrx[8]={{-2,0},{0,-2},{2,0},{0,2}};
static MV scrx[4]={{-1,0},{0,-1},{1,0},{0,1}};
init_searchedpt();
*err=mean_abs_err(cur,prev,x,y,x,y,BLOCK_WIDTH,BLOCK_HEIGHT);
searchedpt[MAX_DISP][MAX_DISP]=1;
tmv.x=0;
tmv.y=0;
k=5;
step=1;
for(i=0;i<4;i++){
m=x+scrx[i].x;
n=y+scrx[i].y;
if(bound_chk(m,n,x,y)){
err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT);
searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1;
if(err0<(*err)){
*err=err0;
tmv=scrx[i];
k=i;
}
}
}
mv=tmv;
if(k==5) {
spt += count_searchedpt();
return mv;
}
if(k!=5) {
step+=1;
k=5;
tmv.x=0; tmv.y=0;
for(i=0;i<4;i++){
m=x+mv.x+scrx[i].x;
n=y+mv.y+scrx[i].y;
if(bound_chk(m,n,x,y)){
err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT);
searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1;
if(err0<(*err)){
*err=err0;
tmv=scrx[i];
k=i;
}
}
}
mv.x=mv.x+tmv.x;
mv.y=mv.y+tmv.y;
}
if(k==5) {
spt += count_searchedpt();
return mv; //2nd-step-stop
}
k=5;
tmv.x=0; tmv.y=0;
for(i=0;i<4;i++){
m=x+lcrx[i].x;
n=y+lcrx[i].y;
if(bound_chk(m,n,x,y)){
err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT);
searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1;
if(err0<(*err)){
*err=err0;
tmv=lcrx[i];
k=i;
}
}
}
if(k!=5) {
mv = tmv ;
}
k = 0;
while(1){
if(k==9)
break;
else{
k=9;
tmv.x=0;tmv.y=0;
}
step+=1;
for(i=0;i<8;i++){
m=x+mv.x+dia[i].x;
n=y+mv.y+dia[i].y;
if(bound_chk(m,n,x,y)){
err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT);
searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1;
if(err0<(*err)){
*err=err0;
tmv=dia[i];
k=i;
}
}
}
mv.x=mv.x+tmv.x;
mv.y=mv.y+tmv.y;
}
tmv.x=0;tmv.y=0;
for(i=0;i<8;i+=2){
m=x+mv.x+(dia[i].x>>1);
n=y+mv.y+(dia[i].y>>1);
if(bound_chk(m,n,x,y)){
err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT);
searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1;
if(err0<(*err)){
*err=err0;
tmv.x=(dia[i].x>>1);
tmv.y=(dia[i].y>>1);
}
}
}
mv.x=mv.x+tmv.x;
mv.y=mv.y+tmv.y;
spt += count_searchedpt();
return mv;
}
MV kcd_search(u_char *prev, u_char *cur, int x, int y, int *err)
{
int i, k, m,n,err0, ox=x,oy=y,step=1,side,ops_pt_x,ops_pt_y;
MV mv,tmv,ttmv;
static MV dia[8]={{-2,0},{-1,1},{0,2},{1,1},{2,0},{1,-1},{0,-2},{-1,-1}};
static MV scrx[8]={{-2,0},{-1,0},{0,-2},{0,-1},{2,0},{1,0},{0,2},{0,1}};
//static MV scrx[4]={{-1,0},{0,-1},{1,0},{0,1}};//
static MV sdia[4]={{-1,0},{0,-1},{1,0},{0,1}};
static MV lcrx[4]={{-2,0},{0,-2},{2,0},{0,2}};
static MV sacrx_d[5]={{-1,0},{0,-1},{1,0},{0,1},{0,-2}};
static MV sacrx_t[5]={{-1,0},{0,-1},{1,0},{0,1},{0,2}};
static MV sacrx_l[5]={{-1,0},{0,-1},{1,0},{0,1},{-2,0}};
static MV sacrx_r[5]={{-1,0},{0,-1},{1,0},{0,1},{2,0}};
static MV sacrx_search[5]={{0,0},{0,0},{0,0},{0,0},{0,0}};
static MV ssqr[4]={{-1,1},{-1,-1},{1,-1},{1,1}};
init_searchedpt();
*err=mean_abs_err(cur,prev,x,y,x,y,BLOCK_WIDTH,BLOCK_HEIGHT);
searchedpt[MAX_DISP][MAX_DISP]=1;
tmv.x=0;
tmv.y=0;
k=9;
step=1;
// SC Step 1
for(i=0;i<4;i++){
m=x+scrx[i].x;
n=y+scrx[i].y;
if(bound_chk(m,n,x,y)){
err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT);
searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1;
if(err0<(*err)){
*err=err0;
tmv=scrx[i];
k=i;
}
}
}
mv=tmv;
if(k==9) {
spt += count_searchedpt();
return mv; //1st-step-stop
}
// Asym.Cross Search : Step 2
else if ((mv.x == 0)&&(mv.y == 1)){
for(i=0;i<5;i++){
sacrx_search[i] = sacrx_t[i];
}
side = 1;
}
else if ((mv.x == 1)&&(mv.y == 0)){
for(i=0;i<5;i++){
sacrx_search[i] = sacrx_r[i];
}
side = 2;
}
else if ((mv.x == 0)&&(mv.y == -1)){
for(i=0;i<5;i++){
sacrx_search[i] = sacrx_d[i];
}
side = 1;
}
else if ((mv.x == -1)&&(mv.y == 0)){
for(i=0;i<5;i++){
sacrx_search[i] = sacrx_l[i];
}
side = 2;
}
if (step !=3){
k = 6;
ttmv= tmv;
for(i=0;i<5;i++){
m=x+mv.x+sacrx_search[i].x;
n=y+mv.y+sacrx_search[i].y;
if(bound_chk(m,n,x,y)){
err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT);
searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1;
if(err0<(*err)){
*err=err0;
tmv=sacrx_search[i];
k=i;
}
}
}
mv.x=mv.x+tmv.x;
mv.y=mv.y+tmv.y;
if(k==6) { // unchanged Step 3
tmv.x=0;
tmv.y=0;
k=5;
for(i=0;i<4;i++){
m=x+mv.x+(sdia[i].x);
n=y+mv.y+(sdia[i].y);
if(bound_chk(m,n,x,y)){
err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT);
searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1;
if(err0<(*err)){
*err=err0;
tmv=sdia[i];
k = i;
}
}
}
mv.x=mv.x+(tmv.x);
mv.y=mv.y+(tmv.y);
if(k==5) { // Unchanged
spt += count_searchedpt();
mv.x=mv.x-ttmv.x;
mv.y=mv.y-ttmv.y;
return mv; //2nd-step-stop
}
}
}
// Step 4 : Large Diamond
k = 0;
while(1){
if(k==9)
break;
else{
// j=k;
k=9;
tmv.x=0;tmv.y=0;
}
step+=1;
for(i=0;i<8;i++){
m=x+mv.x+dia[i].x;
n=y+mv.y+dia[i].y;
if(bound_chk(m,n,x,y)){
err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT);
searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1;
if(err0<(*err)){
*err=err0;
tmv=dia[i];
k=i;
}
}
// j=(j+1)>7?0:(j+1);
}
mv.x=mv.x+tmv.x;
mv.y=mv.y+tmv.y;
}
tmv.x=0;tmv.y=0;
for(i=0;i<4;i++){
m=x+mv.x+(sdia[i].x);
n=y+mv.y+(sdia[i].y);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -