📄 objectrecognition-final.c
字号:
imgAvgCr=imgAvgCr/(COLS*ROWS>>1);//average Cr of frame
threshold_motion=(imgAvgY*0.2+imgAvgCb*0.4+imgAvgCr*0.4)*0.25;//binary threshold
memset(Fmax,0,ROWS*COLS);
for(i =0; i< COLS*ROWS; i++)
{
if(*(tframeY+i)>threshold_motion) *(Fmax+i)=255;
else *(Fmax+i)=0;
}
DATA_COPY_2D_TO_1D(BImageY,PBImageY,720,576,720,*handle);//set previous background image
ACPY3_wait(*handle);
DATA_COPY_2D_TO_1D(BImageCb,PBImageCb,360,576,360,*handle);
ACPY3_wait(*handle);
DATA_COPY_2D_TO_1D(BImageCr,PBImageCr,360,576,360,*handle);
ACPY3_wait(*handle);
shadow=0;
for ( j=0; j<ROWS; j++ )//remove shadow pixels
{
for ( i=0; i<COLS; i++ )
{
k=i+j*COLS;
if(*(Fmax+k)==255)
{
Y=*(frameY+k);
Cb=*(frameCb+k/2);
Cr=*(frameCr+k/2);
R= Y + 1.402 *(Cr-128);
G=Y - 0.34414 *(Cb-128) - 0.71414 *(Cr-128);
B=Y + 1.772 *(Cb-128);
maxRGB=R>G?R:G;
maxRGB=maxRGB>B?maxRGB:B;
minRGB=R<G?R:G;
minRGB=minRGB<B?minRGB:B;
if( R== maxRGB)
H = (G-B)/(maxRGB-minRGB);
else if( G== maxRGB)
H =2+(B-R)/(maxRGB-minRGB);
else
H =4+(R-G)/(maxRGB-minRGB) ;
H=H*60;
if ( H < 0) H = H + 360 ;
V=(float)maxRGB;
S=(float)(maxRGB-minRGB)/(float)maxRGB;
BY=*(BImageY+k);
BCb=*(BImageCb+k/2);
BCr=*(BImageCr+k/2);
BR=BY + 1.402* (BCr-128);;
BG=BY - 0.34414 *(BCb-128) - 0.71414 *(BCr-128);;
BB=BY + 1.772 *(BCb-128);
maxRGB=BR>BG?BR:BG;
maxRGB=maxRGB>BB?maxRGB:BB;
minRGB=BR<BG?BR:BG;
minRGB=minRGB<BB?minRGB:BB;
if( BR== maxRGB)
BH = (BG-BB)/(maxRGB-minRGB);
else if( BG== maxRGB)
BH =2+(BB-BR)/(maxRGB-minRGB);
else
BH =4+(BR-BG)/(maxRGB-minRGB);
BH = BH * 60;
if ( BH < 0) BH = BH + 360 ;
BV=(float)maxRGB;
BS=(float)(maxRGB-minRGB)/(float)maxRGB;
DH1 = (H-BH)>0?(H-BH):(BH-H);
DH2= 360 - DH1;
DH1 = DH1<DH2?DH1:DH2 ;
//if( ((float)V/BV>0.7) && ((float)V/BV<1.3) && ((S-BS)<0.13) && ((S-BS)>-0.13) && (DH1<25) )
if( ((float)V/BV<1) && ((S-BS)<0.8) && ((S-BS)>-0.8) && (DH1<60) )
{
*(Fmax+k)=0;
shadow++;
}
}
}
}
//shadow remove
if(1)//show
{
fmaxp=&Fmax[0];
for ( i = 576-1; i>=0; i--) {
for ( j = 0; j<720; j++) {
if ((j%2)==0)
{
*outbuf=128;
outbuf++;
}
else
{
*outbuf=128;
outbuf++;
}
*outbuf=*fmaxp;
fmaxp++;
outbuf++;
}
}
outbuf-=720*576*2;
fmaxp-=720*576;
}
memset(vt,0,COLS);
memset(ht,0,ROWS);
memset(vto,0,COLS);
memset(hto,0,ROWS);
for( i = 0; i <COLS; i++ )//vertical projection
{
for(j=0;j<ROWS;j++)
{*(vt+i)+=*(Fmax+i+j*COLS)/255;}
if(*(vt+i)<16)*(vt+i)=0;//remove noise disturb
}
for( i = 0; i <ROWS; i++ )//horizontal projection
{
for(j=0;j<COLS;j++)
{*(ht+i)+=*(Fmax+i*COLS+j)/255;}
if(*(ht+i)<20)*(ht+i)=0;//remove noise disturb
}
for( i = 0; i <COLS; i++ )//fill holes in projection
{
if(*(vt+i)==0)
{
s=0;
b=0;
for(k=1;k<15;k++)
{
if((i+k)<COLS)
s=s+(*(vt+i+k)>0?1:0);
if((i-k)>-1)
b=b+(*(vt+i-k)>0?1:0);
}
}
if(s>0&&b>0)
*(vt+i)+=5;
}
for( i = 0; i <ROWS; i++ )//fill holes in projection
{
if(*(ht+i)==0)
{
s=0;
b=0;
for(k=1;k<11;k++)
{
if((i+k)<ROWS)
s=s+(*(ht+i+k)>0?1:0);
if((i-k)>-1)
b=b+(*(ht+i-k)>0?1:0);
}
}
if(s>0&&b>0)
*(ht+i)+=5;
}
memcpy(vto,vt,COLS);
s=0;
b=0;
for(i=0;i<COLS;i++)
{
if(*(vt+i)>0&&b==0)
{
b+=1;s+=1;*(vt+i)=s;
}
if(*(vt+i)>0&&b>0)*(vt+i)=s;
if(b>0&&*(vt+i)==0)b=0;
}
memset(st,0,50);
memset(st1,0,50);
mt=0;
for(i=0;i<s;i++)
{
*(st+i)=0;
*(st1+i)=0;
for(j=0;j<COLS;j++)
{
if(*(vt+j)==(i+1))
{
*(st+i)+=1;
*(st1+i)+=*(vto+j);
}
}
if(*(st+i)>26)mt=(*(st1+i)/(*(st+i)))>mt?(*(st1+i)/(*(st+i))):mt;
}
for(i=0;i<s;i++)
{
if((*(st1+i)/(*(st+i)))<mt||*(st+i)<=26)
{
for(j=0;j<COLS;j++)
{
if(*(vt+j)==(i+1))*(vt+j)=0;
}
}
}//remove short intervals
memcpy(hto,ht,ROWS);
s=0;
b=0;
for(i=0;i<ROWS;i++)
{
if(*(ht+i)>0&&b==0)
{
b+=1;s+=1;*(ht+i)=s;
}
if(*(ht+i)>0&&b>0)*(ht+i)=s;
if(b>0&&*(ht+i)==0)b=0;
}
memset(st,0,50);
memset(st1,0,50);
mt=0;
for(i=0;i<s;i++)
{
*(st+i)=0;
*(st1+i)=0;
for(j=0;j<ROWS;j++)
{
if(*(ht+j)==(i+1))
{
*(st+i)+=1;//
*(st1+i)+=*(hto+j);
}
}
if(*(st+i)>20)mt=(*(st1+i)/(*(st+i)))>mt?(*(st1+i)/(*(st+i))):mt;
}
for(i=0;i<s;i++)
{
if((*(st1+i)/(*(st+i)))<mt||*(st+i)<=20)
{
for(j=0;j<ROWS;j++)
{
if(*(ht+j)==(i+1))*(ht+j)=0;
}
}
}//remove short intervals
yl=0;
yr=0;
xt=0;
xb=0;
for( i = 0; i <COLS; i++ )
{
if(*(vt+i)>0)
{yl=i;break;}
}
for( i = COLS-1; i>-1; i-- )
{
if(*(vt+i)>0)
{yr=i;break;}
}
for( i = 0; i <ROWS; i++ )
{
if(*(ht+i)>0)
{xt=i;break;}
}
for( i = ROWS-1; i>-1; i-- )
{
if(*(ht+i)>0)
{xb=i;break;}
}
if(xb>xt)dx=(xb-xt)+1;
else dx=-(xb-xt)+1;
if(yr>yl)dy=(yr-yl)+1;
else dy=-(yr-yl)+1;
//get width and height
f=0;
memset(Fmax2,0,ROWS*COLS);
memset(SubIY,0,ROWS*COLS);
memset(SubICb,0,(ROWS*COLS>>1));
memset(SubICr,0,(ROWS*COLS>>1));
for(i=0;i<256;i++)
{ *(Yzft+i)=0; *(Cbzft+i)=0; *(Crzft+i)=0; }
skin=0;
imgAvgY=0;
imgAvgCb=0;
imgAvgCr=0;
SumY=0;
SumCb=0;
SumCr=0;
for(i=xt;i<xb+1;i++)//count histogram,get object image and its Y Cb Cr
{
for(j=yl;j<yr+1;j++)
{
k=i*COLS+j;
if(*(tframeY+k)>(threshold_motion))
{
*(SubIY+f)=*(frameY+k);
imgAvgY+=*(frameY+k);
*(Yzft+*(frameY+k))=*(Yzft+*(frameY+k))+1;
SumY++;
if((f==0)||(f%2==0))
{
*(SubICb+(f/2))=*(frameCb+((k>>1)));
imgAvgCb+=*(frameCb+((k>>1)));
*(Cbzft+*(frameCb+((k>>1))))=*(Cbzft+*(frameCb+((k>>1))))+1;
SumCb++;
*(SubICr+(f/2))=*(frameCr+((k>>1)));
imgAvgCr+=*(frameCr+((k>>1)));
*(Crzft+*(frameCr+((k>>1))))=*(Crzft+*(frameCr+((k>>1))))+1;
SumCr++;
}
*(Fmax2+k)=*(frameY+k);
}
f++;
}
}
imgAvgY=imgAvgY/(SumY);
imgAvgCb=imgAvgCb/(SumCb);
imgAvgCr=imgAvgCr/(SumCr);//compute average Y Cb Cr
for(i=0;i<dx*(dy>>1);i++)//count skin pixels
{
if((*(SubICb+i)>109)&&(*(SubICb+i)<140)&&(*(SubICr+i)>135)&&(*(SubICr+i)<158))
{
skin++;
}
}
inIM[18]=(float)skin;
if(inIM[18]>3200)//human
{
Obj=5;
*kind=Obj;
inIM[13]=dy;
inIM[6]=dx;
return;
}
else //not human
{
if(dy>700||dx>320)//0.07 view change
{
temp1=0;
temp2=0;
temp4=0;
temp5=0;
temp3+=1;
inIM[7]=temp3;
inIM[13]=dy;
inIM[6]=dx;
if( temp3==40)//background update
{
temp3=0;
for(i =0; i< COLS*ROWS; i++)
*(BImageY+i)=1* (*(frameY+i))+ 0* (*(PBImageY+i));
for(i =0; i< (COLS*ROWS>>1); i++)
{
*(BImageCb+i)=1* (*(frameCb+i))+0 * (*(PBImageCb+i));
*(BImageCr+i)=1* (*(frameCr+i))+ 0 * (*(PBImageCr+i));
}
}
return;
}
else if(dx<40||dy<30)// noise disturb
{
temp2=0;
temp3=0;
temp4=0;
temp5=0;
temp1+=1;
inIM[0]=temp1;
if( temp1==40)//background update
{
temp1=0;
for(i =0; i< COLS*ROWS; i++)
*(BImageY+i)=1* (*(frameY+i))+ 0* (*(PBImageY+i));
for(i =0; i< (COLS*ROWS>>1); i++)
{
*(BImageCb+i)=1* (*(frameCb+i))+0 * (*(PBImageCb+i));
*(BImageCr+i)=1* (*(frameCr+i))+ 0 * (*(PBImageCr+i));
}
}
inIM[13]=dy;
inIM[6]=dx;
return;
}
else
{
temp3=0;
if(xt<20||xb>556||yl<20||yr>700)//not complete object
{
inIM[21]=(float)xt;
inIM[22]=(float)xb;
inIM[23]=(float)yl;
inIM[24]=(float)yr;
temp1=0;
temp2=0;
temp3=0;
temp4=0;
temp5+=1;
if( temp5==40)//background update
{
temp5=0;
for(i =0; i< COLS*ROWS; i++)
*(BImageY+i)=1* (*(frameY+i))+ 0* (*(PBImageY+i));
for(i =0; i< (COLS*ROWS>>1); i++)
{
*(BImageCb+i)=1* (*(frameCb+i))+0 * (*(PBImageCb+i));
*(BImageCr+i)=1* (*(frameCr+i))+ 0 * (*(PBImageCr+i));
}
}
return;
}
else//detect complete object
{
inIM[13]=dy;
inIM[6]=dx;
memset(Fmax2,0,ROWS*COLS);
for(i=0;i<256;i++)//norm gram
{
*(Yzft+i)=(*(Yzft+i)*100)/(float)SumY;
*(Cbzft+i)=(*(Cbzft+i)*100)/(float)SumCb;
*(Crzft+i)=(*(Crzft+i)*100)/(float)SumCr;
}
//computer histogram similarity
tempDot = 0, tempSrc = 0, tempObj = 0;
for( i=0; i<256; i++ )
{
tempDot += (*(Yzft+i))* (*(Yzftt1+i));
tempSrc += (*(Yzft+i))* (*(Yzft+i));
tempObj += (*(Yzftt1+i))* (*(Yzftt1+i));
}
Yzftsim1= tempDot / ( pow(tempSrc,0.5) * pow(tempObj,0.5) );
tempDot = 0, tempSrc = 0, tempObj = 0;
for( i=0; i<256; i++ )
{
tempDot += (*(Yzft+i))* (*(Yzftt2+i));
tempSrc += (*(Yzft+i))* (*(Yzft+i));
tempObj += (*(Yzftt2+i))* (*(Yzftt2+i));
}
Yzftsim2= tempDot / ( pow(tempSrc,0.5) * pow(tempObj,0.5) );
tempDot = 0, tempSrc = 0, tempObj = 0;
for( i=0; i<256; i++ )
{
tempDot += (*(Yzft+i))* (*(Yzftt3+i));
tempSrc += (*(Yzft+i))* (*(Yzft+i));
tempObj += (*(Yzftt3+i))* (*(Yzftt3+i));
}
Yzftsim3= tempDot / ( pow(tempSrc,0.5) * pow(tempObj,0.5) );
tempDot = 0, tempSrc = 0, tempObj = 0;
for( i=0; i<256; i++ )
{
tempDot += (*(Yzft+i))* (*(Yzftt4+i));
tempSrc += (*(Yzft+i))* (*(Yzft+i));
tempObj += (*(Yzftt4+i))* (*(Yzftt4+i));
}
Yzftsim4= tempDot / ( pow(tempSrc,0.5) * pow(tempObj,0.5) );
tempDot = 0, tempSrc = 0, tempObj = 0;
for( i=0; i<256; i++ )
{
tempDot += (*(Cbzft+i))* (*(Cbzftt1+i));
tempSrc += (*(Cbzft+i))* (*(Cbzft+i));
tempObj += (*(Cbzftt1+i))* (*(Cbzftt1+i));
}
Cbzftsim1= tempDot / ( pow(tempSrc,0.5) * pow(tempObj,0.5) );
tempDot = 0, tempSrc = 0, tempObj = 0;
for( i=0; i<256; i++ )
{
tempDot += (*(Cbzft+i))* (*(Cbzftt2+i));
tempSrc += (*(Cbzft+i))* (*(Cbzft+i));
tempObj += (*(Cbzftt2+i))* (*(Cbzftt2+i));
}
Cbzftsim2= tempDot / ( pow(tempSrc,0.5) * pow(tempObj,0.5) );
tempDot = 0, tempSrc = 0, tempObj = 0;
for( i=0; i<256; i++ )
{
tempDot += (*(Cbzft+i))* (*(Cbzftt3+i));
tempSrc += (*(Cbzft+i))* (*(Cbzft+i));
tempObj += (*(Cbzftt3+i))* (*(Cbzftt3+i));
}
Cbzftsim3= tempDot / ( pow(tempSrc,0.5) * pow(tempObj,0.5) );
tempDot = 0, tempSrc = 0, tempObj = 0;
for( i=0; i<256; i++ )
{
tempDot += (*(Cbzft+i))* (*(Cbzftt4+i));
tempSrc += (*(Cbzft+i))* (*(Cbzft+i));
tempObj += (*(Cbzftt4+i))* (*(Cbzftt4+i));
}
Cbzftsim4= tempDot / ( pow(tempSrc,0.5) * pow(tempObj,0.5) );
tempDot = 0, tempSrc = 0, tempObj = 0;
for( i=0; i<256; i++ )
{
tempDot += (*(Crzft+i))* (*(Crzftt1+i));
tempSrc += (*(Crzft+i))* (*(Crzft+i));
tempObj += (*(Crzftt1+i))* (*(Crzftt1+i));
}
Crzftsim1= tempDot / ( pow(tempSrc,0.5) * pow(tempObj,0.5) );
tempDot = 0, tempSrc = 0, tempObj = 0;
for( i=0; i<256; i++ )
{
tempDot += (*(Crzft+i))* (*(Crzftt2+i));
tempSrc += (*(Crzft+i))* (*(Crzft+i));
tempObj += (*(Crzftt2+i))* (*(Crzftt2+i));
}
Crzftsim2= tempDot / ( pow(tempSrc,0.5) * pow(tempObj,0.5) );
tempDot = 0, tempSrc = 0, tempObj = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -