📄 video_ntsc_pal.c
字号:
DAT_copy(frame2 + i* (capLinePitch ),
disFrameBuf->frame.iFrm.y1 + (2*i+1) * (disLinePitch),
numPixels);
DAT_copy(capFrameBuf->frame.iFrm.cb1 + (i+287) * (capLinePitch >> 1),
disFrameBuf->frame.iFrm.cb1 + (2*i+1) * (disLinePitch >> 1),
numPixels>>1);
DAT_copy(capFrameBuf->frame.iFrm.cr1 + (i+287) * (capLinePitch >> 1),
disFrameBuf->frame.iFrm.cr1 + (2*i+1) * (disLinePitch >> 1),
numPixels>>1);
}
DAT_wait(DAT_XFRID_WAITALL);
// //=============================works now ===========================================================
if(0x00==(CPLD_REG[8]&0x80)) //自动搜索
{
if(1==NEEDIMG_FIND)
{
// Tr=mia(frame2);
// IMG_thr_le2min(frame2,BIN, WIDTH, HEIGHT,Tr);
findrlt=find_object(frame2,100,&leftx,&lefty,&rightx,&righty);
if(1==findrlt)
{
PRED=160;
NEEDIMG_FIND=0;
TEMWIDTH=(rightx-leftx+1);
TEMHEIGHT=(righty-lefty+1);
portdoor1.x=(leftx>10)?(leftx-10):0;
portdoor1.y=(lefty>6)?(lefty-6):0;
portdoor2.x=(rightx>502)?512:(rightx+10);
portdoor2.y=(righty>281)?287:(righty+6);
prd_leftx[0]=prd_leftx[1];
prd_lefty[0]=prd_lefty[1];
prd_leftx[1]=prd_leftx[2];
prd_lefty[1]=prd_lefty[2];
prd_leftx[2]=leftx;
prd_lefty[2]=lefty;
// if((TEMWIDTH*TEMWIDTH)>10000)
//portmode=1;
// if((templa_change==1)&&((TEMWIDTH*TEMWIDTH)<10000))//更新模板
if((TEMWIDTH*TEMHEIGHT)<10000)//更新模板
{
PORTMODE=0;
for(i=0;i<TEMHEIGHT;i++)
{
for(j=0;j<TEMWIDTH;j++)
{
TEMPLATE[TEMWIDTH*i+j]=frame2[((lefty+i)<<9)+leftx+j];
}
}
//templa_change=0;
}
else
{
PORTMODE=1;//目标太大,转为形心跟踪
matr_cent((frame2+((portdoor1.y*WIDTH)+portdoor1.x)),(portdoor2.x-portdoor1.x+1),(portdoor2.y-portdoor1.y+1), &x0,&y0);
}
}
}//全场搜索完毕
else //波门内搜索开始
{
if(0==PORTMODE)//模板匹配模式
{
findrlt=wnd_find(TEMPLATE, (frame2+((portdoor1.y*WIDTH)+portdoor1.x)),TEMWIDTH,TEMHEIGHT,&offx,&offy);
if(1==findrlt)
{
leftx=portdoor1.x+offx;
lefty=portdoor1.y+offy;
rightx=leftx+TEMWIDTH-1;
righty=lefty+TEMHEIGHT-1;
portdoor1.x=(leftx>10)?(leftx-10):0;
portdoor1.y=(lefty>6)?(lefty-6):0;
portdoor2.x=(rightx>502)?512:(rightx+10);
portdoor2.y=(righty>281)?287:(righty+6);
prd_leftx[0]=prd_leftx[1];
prd_lefty[0]=prd_lefty[1];
prd_leftx[1]=prd_leftx[2];
prd_lefty[1]=prd_lefty[2];
prd_leftx[2]=leftx;
prd_lefty[2]=lefty;
PRED=160;
NEEDIMG_FIND=0;
}
else
{
//预测预测值
prd_leftx[2]=(prd_leftx[1]<<1)-prd_leftx[0];
prd_lefty[2]=(prd_lefty[1]<<1)-prd_lefty[0];
prd_leftx[0]=prd_leftx[1];
prd_lefty[0]=prd_lefty[1];
prd_leftx[1]=prd_leftx[2];
prd_lefty[1]=prd_lefty[2];
portdoor1.x=(prd_leftx[2]>10)?(prd_leftx[2]-10):0;
portdoor1.y=(prd_lefty[2]>6)?(prd_lefty[2]-6):0;
portdoor2.x=((TEMWIDTH+prd_leftx[2])>502)?512:(TEMWIDTH+prd_leftx[2]+10);
portdoor2.y=((TEMHEIGHT+prd_lefty[2])>281)?287:(TEMHEIGHT+prd_lefty[2]+6);
PRED--;
if(0==PRED)
NEEDIMG_FIND=1;
}
}//匹配结束
else
{
matr_cent((frame2+((portdoor1.y*WIDTH)+portdoor1.x)),(portdoor2.x-portdoor1.x+1),(portdoor2.y-portdoor1.y+1), &x1,&y1);
leftx=leftx+x1-x0;
lefty=lefty+y1-y0;
rightx=rightx+x1-x0;
righty=righty+y1-y0;
x0=x1;y0=y1;
portdoor1.x=(leftx>10)?(leftx-10):0;
portdoor1.y=(lefty>6)?(lefty-6):0;
portdoor2.x=(rightx>502)?512:(rightx+10);
portdoor2.y=(righty>281)?287:(righty+6);
}
}
} //end auto search
else //手工指定搜索
{
//extra code here
Tr=mia(frame2);
IMG_thr_le2min(frame2,BIN, WIDTH, HEIGHT,Tr);
x=(((int32)CPLD_REG[9])<<8)+(int32)CPLD_REG[10];
y=(((int32)CPLD_REG[11])<<8)+(int32)CPLD_REG[12];
findrlt=manual_find(BIN, Tr,x, y,&leftx,&lefty,&rightx,&righty);
if(1==findrlt)
{
PRED=160;
NEEDIMG_FIND=0;
TEMWIDTH=rightx-leftx+1;
TEMHEIGHT=righty-lefty+1;
portdoor1.x=(leftx>10)?(leftx-10):0;
portdoor1.y=(lefty>6)?(lefty-6):0;
portdoor2.x=(rightx>502)?512:(rightx+10);
portdoor2.y=(righty>281)?287:(righty+6);
prd_leftx[0]=prd_leftx[1];
prd_lefty[0]=prd_lefty[1];
prd_leftx[1]=prd_leftx[2];
prd_lefty[1]=prd_lefty[2];
prd_leftx[2]=leftx;
prd_lefty[2]=lefty;
}
if((TEMWIDTH*TEMHEIGHT)<10000)//更新模板
{
PORTMODE=0;
for(i=0;i<TEMHEIGHT;i++)
{
for(j=0;j<TEMWIDTH;j++)
{
TEMPLATE[TEMWIDTH*i+j]=frame2[((lefty+i)<<9)+leftx+j];
}
}
//templa_change=0;
}
else
{
PORTMODE=1;//目标太大,转为形心跟踪
matr_cent((frame2+((portdoor1.y*WIDTH)+portdoor1.x)),(portdoor2.x-portdoor1.x+1),(portdoor2.y-portdoor1.y+1), &x0,&y0);
// matr_cent((frame2+((portdoor1.y*WIDTH)+portdoor1.x)),TEMWIDTH,TEMHEIGHT,&x0,&y0);
}
} //manual search end
//D3=((((leftx+rightx)>>1)-256)>0)?1:0;
//D4=((((leftx+rightx)>>1)-256)>0)?1:0;
tempx=((leftx+rightx)>>1)-256;
tempy=((lefty+righty)>>1)-144;
reg1=(tempx<0)?reg1:(reg1&0xf7);
reg1=(tempy>0)?reg1:(reg1&0xfb);
tempx=abs(tempx);
tempy=abs(tempy);
reg1=reg1|((uint8)((tempx&0x0001)<<1));
reg1=reg1|((uint8)(tempy&0x0001));
reg1=reg1|(uint8)(findrlt<<6);
//c_mx,c_lx,c_my,c_ly;
c_mx=(tempx>>4);
c_lx=tempx&0x000f;
c_my=(tempy>>4);
c_ly=tempy&0x000f;
GPIO_pinWrite(mygpiohandle,GPIO_PIN4,1);
/* tempq1=rightx-leftx;
tempq2=righty-lefty;
q1=(tempq1>0xFF)?0xFF:tempq1;
q2=(tempq2>0xFF)?0xFF:tempq2;
reg6=q1;
reg7=q2;*/
RAM2=(tempx>>1);
RAM3=(tempy>>1);
RAM1=reg1;
//caculate L
if(CPLD_REG[15]==0xFF&&CPLD_REG[14]==0xFF)
{
LH5=16;
LH4=16;
LH3=16;
LH2=16;
LH1=16;
}
else
{
L=CPLD_REG[15]*256+CPLD_REG[14];
LH5=L/10000; tempLH5=L%10000;
LH4=tempLH5/1000; tempLH4=tempLH5%1000;
LH3=tempLH4/100; tempLH3=tempLH4%100;
LH2=tempLH3/10; tempLH2=tempLH3%10;
LH1=tempLH2;
}
//caculate beit,gama
if(CPLD_REG[19]==0xFF&&CPLD_REG[18]==0xFF)
{
gamaH4=16;
gamaH3=16;
gamaH2=16;
gamaH1=16;
gamapoint=16;
gamaL1=16;
gamaL2=16;
}
else
{
tempgama=(CPLD_REG[19]&0x7F)*256+CPLD_REG[18];
gama=tempgama/4;
gamaH4=gama/1000; tempgamaH4=gama%1000;
gamaH3=tempgamaH4/100; tempgamaH3=tempgamaH4%100;
gamaH2=tempgamaH3/10; tempgamaH2=tempgamaH3%10;
gamaH1=tempgamaH2;
gamapoint=17;
i=CPLD_REG[18]&0x03;
switch(i)
{
case 0:gamaL1=0; gamaL2=0; break;
case 1:gamaL1=2; gamaL2=5; break;
case 2:gamaL1=5; gamaL2=0; break;
case 3:gamaL1=7; gamaL2=5; break;
default: break;
}
}
if(CPLD_REG[17]==0xFF&&CPLD_REG[16]==0xFF)
{
beitH4=16;
beitH3=16;
beitH2=16;
beitH1=16;
beitpoint=16;
beitL1=16;
beitL2=16;
}
else
{
tempbeit=(CPLD_REG[17]&0x7F)*256+CPLD_REG[16];
beit=tempbeit/4;
beitH4=beit/1000; tempbeitH4=beit%1000;
beitH3=tempbeitH4/100; tempbeitH3=tempbeitH4%100;
beitH2=tempbeitH3/10; tempbeitH2=tempbeitH3%10;
beitH1=tempbeitH2;
beitpoint=17;
i=CPLD_REG[16]&0x03;
switch(i)
{
case 0:beitL1=0; beitL2=0; break;
case 1:beitL1=2; beitL2=5; break;
case 2:beitL1=5; beitL2=0; break;
case 3:beitL1=7; beitL2=5; break;
default: break;
}
}
GPIO_pinWrite(mygpiohandle,GPIO_PIN4,0);
//#######################################################################
//draw cross
//m=(lefty+righty)<<9;
m=((leftx+rightx)>>1)+((lefty+righty)<<9);
memset(disFrameBuf->frame.iFrm.y1+m-20,0xff,40);
for(i=0;i<40;i++)
{*(disFrameBuf->frame.iFrm.y1+m+(i<<9)-10240)=0xff;}
// DAT_copy(sour,disFrameBuf->frame.iFrm.y1+m-20,40);
// DAT_copy2d(DAT_1D2D,sour,disFrameBuf->frame.iFrm.y1+m-512*20,1,40,512);
// draw x,y
for(i=0;i<15;i++)
{
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(20+i)+112] )=_amemd8_const(&numx[i<<3]);
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(20+i)+128] )=_amemd8_const(&numptr[c_mx][i<<3]);
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(20+i)+144] )=_amemd8_const(&numptr[c_lx][i<<3]);
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(20+i)+176] )=_amemd8_const(&numy[i<<3]);
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(20+i)+192] )=_amemd8_const(&numptr[c_my][i<<3]);
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(20+i)+208] )=_amemd8_const(&numptr[c_ly][i<<3]);
}
// draw L
for(i=0;i<15;i++)
{
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(20+i)+300] )=_amemd8_const(&numl[i<<3]);
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(20+i)+316] )=_amemd8_const(&numequ[i<<3]);
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(20+i)+332] )=_amemd8_const(&numptr[LH5][i<<3]);
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(20+i)+348] )=_amemd8_const(&numptr[LH4][i<<3]);
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(20+i)+364] )=_amemd8_const(&numptr[LH3][i<<3]);
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(20+i)+380] )=_amemd8_const(&numptr[LH2][i<<3]);
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(20+i)+396] )=_amemd8_const(&numptr[LH1][i<<3]);
}
// draw gama,beit
for(i=0;i<15;i++)
{
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+172] ) =_amemd8_const(&numbeit[i<<3]);
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+188] ) =_amemd8_const(&numequ[i<<3]);
if(CPLD_REG[17]==0xFF&&CPLD_REG[16]==0xFF)
{
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+204] ) =_amemd8_const(&numptr[16][i<<3]);
}
else if(CPLD_REG[17]>127)
{
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+204] ) =_amemd8_const(&numminus[i<<3]);
}
else
{
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+204] ) =_amemd8_const(&numadd[i<<3]);
}
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+220] ) =_amemd8_const(&numptr[beitH4][i<<3]);
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+236] ) =_amemd8_const(&numptr[beitH3][i<<3]);
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+252] ) =_amemd8_const(&numptr[beitH2][i<<3]);
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+268] ) =_amemd8_const(&numptr[beitH1][i<<3]);
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+284] ) =_amemd8_const(&numptr[beitpoint][i<<3]);
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+300] ) =_amemd8_const(&numptr[beitL1][i<<3]);
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+316] ) =_amemd8_const(&numptr[beitL2][i<<3]);
// beta over;next gama
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+348] ) =_amemd8_const(&numgama[i<<3]);
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+364] ) =_amemd8_const(&numequ[i<<3]);
if(CPLD_REG[19]==0xFF&&CPLD_REG[18]==0xFF)
{
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+380] ) =_amemd8_const(&numptr[16][i<<3]);
}
else if (CPLD_REG[19]>127)
{
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+380] ) =_amemd8_const(&numminus[i<<3]);
}
else
{
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+380] ) =_amemd8_const(&numadd[i<<3]);
}
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+396] ) =_amemd8_const(&numptr[gamaH4][i<<3]);
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+412] ) =_amemd8_const(&numptr[gamaH3][i<<3]);
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+428] ) =_amemd8_const(&numptr[gamaH2][i<<3]);
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+444] ) =_amemd8_const(&numptr[gamaH1][i<<3]);
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+460] ) =_amemd8_const(&numptr[gamapoint][i<<3]);
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+476] ) =_amemd8_const(&numptr[gamaL1][i<<3]);
_amemd8(&disFrameBuf->frame.iFrm.y1[512*(500+i)+492] ) =_amemd8_const(&numptr[gamaL2][i<<3]);
}
// draw portdoor
p1=1024*portdoor1.y+portdoor1.x;
p2=1024*portdoor2.y+portdoor2.x;
memset(disFrameBuf->frame.iFrm.y1+p1,0xff,8);
for(i=0;i<8;i++)
{*(disFrameBuf->frame.iFrm.y1+p1+(i<<9))=0xff;}
memset(disFrameBuf->frame.iFrm.y1+p2-7,0xff,8);
for(i=0;i<8;i++)
{*(disFrameBuf->frame.iFrm.y1+p2-4096+(i<<9))=0xff;}
CACHE_wbInvAllL2(CACHE_WAIT);
DAT_wait(DAT_XFRID_WAITALL);
FVID_exchange(capChan, &capFrameBuf);
//-----------------------------------------------------------------------------------------------
FVID_exchange(disChan, &disFrameBuf);
frames ++;
}
}
void readdata()
{
uint8 a=0;
a=ADDR_ADDR;
CPLD_REG[a]=DAT_DAT;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -