📄 objectrecognition-final.c
字号:
for( i=0; i<256; i++ )
{
tempDot += (*(Crzft+i))* (*(Crzftt3+i));
tempSrc += (*(Crzft+i))* (*(Crzft+i));
tempObj += (*(Crzftt3+i))* (*(Crzftt3+i));
}
Crzftsim3= tempDot / ( pow(tempSrc,0.5) * pow(tempObj,0.5) );
tempDot = 0, tempSrc = 0, tempObj = 0;
for( i=0; i<256; i++ )
{
tempDot += (*(Crzft+i))* (*(Crzftt4+i));
tempSrc += (*(Crzft+i))* (*(Crzft+i));
tempObj += (*(Crzftt4+i))* (*(Crzftt4+i));
}
Crzftsim4= tempDot / ( pow(tempSrc,0.5) * pow(tempObj,0.5) );
*ckb=(float)dx/dy>1?(float)dx/dy:(float)dy/dx;//compute length/width ratio
memset(imY,0,7*sizeof(float));
IM(SubIY,dx,dy,imY); //compute IM of object
for(i=0;i<7;i++)inIM[i]=*(imY+i);
//compute lenth/width ratio distances
ckbdis1=(*ckb-*ckbt1)>0?((*ckb-*ckbt1)/(*ckb)):((*ckbt1-*ckb)/(*ckbt1));
ckbdis2=(*ckb-*ckbt2)>0?((*ckb-*ckbt2)/(*ckb)):((*ckbt2-*ckb)/(*ckbt2));
ckbdis3=(*ckb-*ckbt3)>0?((*ckb-*ckbt3)/(*ckb)):((*ckbt3-*ckb)/(*ckbt3));
ckbdis4=(*ckb-*ckbt4)>0?((*ckb-*ckbt4)/(*ckb)):((*ckbt4-*ckb)/(*ckbt4));
ckbdis[0]=ckbdis1;
ckbdis[1]=ckbdis2;
ckbdis[2]=ckbdis3;
ckbdis[3]=ckbdis4;
//sort ckbdis, first is smallest
for(i=0;i<4;i++)
{
for(j=i+1;j<4;j++)
{
if(ckbdis[i]>ckbdis[j])
{
ckbtemp=ckbdis[i];
ckbdis[i]=ckbdis[j];
ckbdis[j]=ckbtemp;
}
}
}
//compute IM distances
Dis1=Distance(imY,imt1);
Dis2=Distance(imY,imt2);
Dis3=Distance(imY,imt3);
Dis4=Distance(imY,imt4);
if((ckbdis[0]==ckbdis1&&ckbdis[1]==ckbdis2)||(ckbdis[0]==ckbdis2&&ckbdis[1]==ckbdis1))//l/w is close to 1 and 2
{
inIM[6]=1;
inIM[7]=2;
inIM[14]=(float)Crzftsim1;//YCCmostdis1;
inIM[15]=(float)Crzftsim2;//YCCmostdis2;
inIM[16]=(float)Cbzftsim1;//YCCmostdis1;
inIM[17]=(float)Cbzftsim2;//YCCmostdis2;
inIM[19]=ckbdis1;
inIM[20]=ckbdis2;
inIM[21]=Dis1;//inIM[23]=avgdis1;
inIM[22]=Dis2;//inIM[24]=avgdis2;
inIM[23]=(float)Yzftsim1;//YCCmostdis1;
inIM[24]=(float)Yzftsim2;//YCCmostdis2;
if(fabs(Cbzftsim1-Cbzftsim2)>0.12&&fabs(Crzftsim1-Crzftsim2)>0.12&&fabs(Yzftsim1-Yzftsim2)>0.12&&fabs(Dis1-Dis2)>0.2)
{
if(Yzftsim1>0.15&&Cbzftsim1>0.15&&Crzftsim1>0.15&&Yzftsim1>Yzftsim2&&Cbzftsim1>Cbzftsim2&&Crzftsim1>Crzftsim2&&Dis1<Dis2&&Dis1<0.86)
Obj=1;
else if(Yzftsim2>0.15&&Cbzftsim2>0.15&&Crzftsim2>0.15&&Yzftsim1<Yzftsim2&&Cbzftsim1<Cbzftsim2&&Crzftsim1<Crzftsim2&&Dis2<Dis1&&Dis2<0.86)
Obj=2;
}
}
else if((ckbdis[0]==ckbdis1&&ckbdis[1]==ckbdis3)||(ckbdis[0]==ckbdis3&&ckbdis[1]==ckbdis1))//l/w is close to 1 and 3
{
inIM[6]=1;
inIM[7]=3;
inIM[14]=(float)Crzftsim1;//YCCmostdis1;
inIM[15]=(float)Crzftsim3;//YCCmostdis2;
inIM[16]=(float)Cbzftsim1;//YCCmostdis1;
inIM[17]=(float)Cbzftsim3;//YCCmostdis2;
inIM[18]=fabs(ckbdis1-ckbdis3)/(ckbdis1+ckbdis3);
inIM[19]=ckbdis1;
inIM[20]=ckbdis3;
inIM[21]=Dis1;//inIM[23]=avgdis1;
inIM[22]=Dis3;//inIM[24]=avgdis2;
inIM[23]=(float)Yzftsim1;//YCCmostdis1;
inIM[24]=(float)Yzftsim3;//YCCmostdis2;
if(fabs(Cbzftsim1-Cbzftsim3)>0.12&&fabs(Crzftsim1-Crzftsim3)>0.12&&fabs(Yzftsim1-Yzftsim3)>0.12&&fabs(Dis1-Dis3)>0.2)
{
if(Yzftsim1>0.15&&Cbzftsim1>0.15&&Crzftsim1>0.15&&Yzftsim1>Yzftsim3&&Cbzftsim1>Cbzftsim3&&Crzftsim1>Crzftsim3&&Dis1<Dis3&&Dis1<0.86)
Obj=1;
else if(Yzftsim3>0.15&&Cbzftsim3>0.15&&Crzftsim3>0.15&&Yzftsim1<Yzftsim3&&Cbzftsim1<Cbzftsim3&&Crzftsim1<Crzftsim3&&Dis3<Dis1&&Dis3<0.86)
Obj=3;
}
}
else if((ckbdis[0]==ckbdis1&&ckbdis[1]==ckbdis4)||(ckbdis[0]==ckbdis4&&ckbdis[1]==ckbdis1))//l/w is close to 1 and 4
{
inIM[6]=1;
inIM[7]=4;
inIM[14]=(float)Crzftsim1;//YCCmostdis1;
inIM[15]=(float)Crzftsim4;//YCCmostdis2;
inIM[16]=(float)Cbzftsim1;//YCCmostdis1;
inIM[17]=(float)Cbzftsim4;//YCCmostdis2;
inIM[19]=ckbdis1;
inIM[20]=ckbdis4;
inIM[21]=Dis1;//inIM[23]=avgdis1;
inIM[22]=Dis4;//inIM[24]=avgdis2;
inIM[23]=(float)Yzftsim1;//YCCmostdis1;
inIM[24]=(float)Yzftsim4;//YCCmostdis2;
if(fabs(Cbzftsim1-Cbzftsim4)>0.12&&fabs(Crzftsim1-Crzftsim4)>0.12&&fabs(Yzftsim1-Yzftsim4)>0.12&&fabs(Dis1-Dis4)>0.2)
{
if(Yzftsim1>0.15&&Cbzftsim1>0.15&&Crzftsim1>0.15&&Yzftsim1>Yzftsim4&&Cbzftsim1>Cbzftsim4&&Crzftsim1>Crzftsim4&&Dis1<Dis4&&Dis1<0.86)
Obj=1;
else if(Yzftsim4>0.15&&Cbzftsim4>0.15&&Crzftsim4>0.15&&Yzftsim1<Yzftsim4&&Cbzftsim1<Cbzftsim4&&Crzftsim1<Crzftsim4&&Dis4<Dis1&&Dis4<0.86)
Obj=4;
}
}
else if((ckbdis[0]==ckbdis2&&ckbdis[1]==ckbdis3)||(ckbdis[0]==ckbdis3&&ckbdis[1]==ckbdis2))//l/w is close to 2 and 3
{
inIM[6]=2;
inIM[7]=3;
inIM[14]=(float)Crzftsim2;//YCCmostdis1;
inIM[15]=(float)Crzftsim3;//YCCmostdis2;
inIM[16]=(float)Cbzftsim2;//YCCmostdis1;
inIM[17]=(float)Cbzftsim3;//YCCmostdis2;
inIM[19]=ckbdis2;
inIM[20]=ckbdis3;
inIM[21]=Dis2;//inIM[23]=avgdis1;
inIM[22]=Dis3;//inIM[24]=avgdis2;
inIM[23]=(float)Yzftsim2;//YCCmostdis1;
inIM[24]=(float)Yzftsim3;//YCCmostdis2;
if(fabs(Cbzftsim2-Cbzftsim3)>0.12&&fabs(Crzftsim2-Crzftsim3)>0.12&&fabs(Yzftsim2-Yzftsim3)>0.12&&fabs(Dis2-Dis3)>0.2)
{
if(Yzftsim2>0.15&&Cbzftsim2>0.15&&Crzftsim2>0.15&&Yzftsim2>Yzftsim3&&Cbzftsim2>Cbzftsim3&&Crzftsim2>Crzftsim3&&Dis2<Dis3&&Dis2<0.86)
Obj=2;
else if(Yzftsim3>0.15&&Cbzftsim3>0.15&&Crzftsim3>0.15&&Yzftsim2<Yzftsim3&&Cbzftsim2<Cbzftsim3&&Crzftsim2<Crzftsim3&&Dis3<Dis2&&Dis3<0.86)
Obj=3;
}
}
else if((ckbdis[0]==ckbdis2&&ckbdis[1]==ckbdis4)||(ckbdis[0]==ckbdis4&&ckbdis[1]==ckbdis2))//l/w is close to 2 and 4
{
inIM[6]=2;
inIM[7]=4;
inIM[14]=(float)Crzftsim2;//YCCmostdis1;
inIM[15]=(float)Crzftsim4;//YCCmostdis2;
inIM[16]=(float)Cbzftsim2;//YCCmostdis1;
inIM[17]=(float)Cbzftsim4;//YCCmostdis2;
inIM[19]=ckbdis2;
inIM[20]=ckbdis4;
inIM[21]=Dis2;//inIM[23]=avgdis1;
inIM[22]=Dis4;//inIM[24]=avgdis2;
inIM[23]=(float)Yzftsim2;//YCCmostdis1;
inIM[24]=(float)Yzftsim4;//YCCmostdis2;
if(fabs(Cbzftsim2-Cbzftsim4)>0.12&&fabs(Crzftsim2-Crzftsim4)>0.12&&fabs(Yzftsim2-Yzftsim4)>0.12&&fabs(Dis2-Dis4)>0.2)
{
if(Yzftsim2>0.15&&Cbzftsim2>0.15&&Crzftsim2>0.15&&Yzftsim2>Yzftsim4&&Cbzftsim2>Cbzftsim4&&Crzftsim2>Crzftsim4&&Dis2<Dis4&&Dis2<0.86)
Obj=2;
else if(Yzftsim4>0.15&&Cbzftsim4>0.15&&Crzftsim4>0.15&&Yzftsim2<Yzftsim4&&Cbzftsim2<Cbzftsim4&&Crzftsim2<Crzftsim4&&Dis4<Dis2&&Dis4<0.86)
Obj=4;
}
}
else if((ckbdis[0]==ckbdis4&&ckbdis[1]==ckbdis3)||(ckbdis[0]==ckbdis3&&ckbdis[1]==ckbdis4))//l/w is close to 3 and 4
{
inIM[6]=3;
inIM[7]=4;
inIM[14]=(float)Crzftsim3;//YCCmostdis1;
inIM[15]=(float)Crzftsim4;//YCCmostdis2;
inIM[16]=(float)Cbzftsim3;//YCCmostdis1;
inIM[17]=(float)Cbzftsim4;//YCCmostdis2;
inIM[19]=ckbdis3;
inIM[20]=ckbdis4;
inIM[21]=Dis3;//inIM[23]=avgdis1;
inIM[22]=Dis4;//inIM[24]=avgdis2;
inIM[23]=(float)Yzftsim3;//YCCmostdis1;
inIM[24]=(float)Yzftsim4;//YCCmostdis2;
if(fabs(Cbzftsim3-Cbzftsim4)>0.12&&fabs(Crzftsim3-Crzftsim4)>0.12&&fabs(Yzftsim3-Yzftsim4)>0.12&&fabs(Dis3-Dis4)>0.2)
{
if(Yzftsim3>0.15&&Cbzftsim3>0.15&&Crzftsim3>0.15&&Yzftsim3>Yzftsim4&&Cbzftsim3>Cbzftsim4&&Crzftsim3>Crzftsim4&&Dis3<Dis4&&Dis3<0.86)
Obj=3;
else if(Yzftsim4>0.15&&Cbzftsim4>0.15&&Crzftsim4>0.15&&Yzftsim3<Yzftsim4&&Cbzftsim3<Cbzftsim4&&Crzftsim3<Crzftsim4&&Dis4<Dis3&&Dis4<0.86)
Obj=4;
}
}
inIM[2]=Objt;
if(Objt==Obj&&Obj>0)//update background when object doesn't move for longtime
{
temp1=0;
temp3=0;
temp4=0;
temp5=0;
temp2+=1;
inIM[1]=temp2;
if( temp2==60)
{
temp2=0;
temp4=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));
}
}
}
else//update background when unknown object doesn't move for longtime
{
temp1=0;
temp2=0;
temp3=0;
temp5=0;
temp4+=1;
if( temp4==60)
{
temp4=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));
}
}
}
temp1=0;
temp3=0;
temp5=0;
Objt=Obj;
*kind=Obj;
inIM[6]=temp4;
}
}
}
}
}
/********************************************************************
jpeg compress
jpegRGB:Ãô«ÃýøÃ´µÃ»º³åÃø£¬µÃÃê³ÃYUV->RGBê»»²¢ÃÃ
Ãê³Ã²åõºó£¬°ÃÃý¾Ã´æÃë¸Ã»º³åÃø
********************************************************************/
int jpegCompressDSP(unsigned char *jpegp,unsigned char *jpegRGB, int imagesize, int quality)
{
int width;
int height;
//YUV to RGB first
unsigned char yuv_y0, yuv_u0, yuv_v0; // yuv_v1; // {y0, u0, v0, v1};
unsigned char r, g, b;
//char *rgbjpeg;//Bilinear Interpolation buffer
unsigned char bufRGB[3]; // ÃÃñ±£´æ{R,G,B}
unsigned char bufYUV[3]; // ÃÃñ±£´æ{Y,U,V}
int i,j;
r=0;
g=0;
b=0;
memset(bufRGB,0, sizeof(unsigned char)*3);
memset(bufYUV,0, sizeof(unsigned char)*3);
memset(rgbbuf,0,sizeof(unsigned char)*D1_WIDTH*D1_HEIGHT*3);
width=D1_WIDTH;
height=D1_HEIGHT;
for ( i = height-1; i>=0; i--) {
for ( j = 0; j<width; j++) {
//if(!(i%2)==0)
{
// UYVY±êü [U0 Y0 V0 Y1] [U1 Y2 V1 Y3] [U2 Y4 V2 Y5]
// ÿÃñÃõãý¸öÃýã¬[ÃÃ]êÃøöÃýÃ
if ((j%2)==0)
{
yuv_u0 = *jpegp;
jpegp++;
}
else
{
yuv_v0 = *jpegp;
jpegp++;
}
yuv_y0 = *jpegp;
jpegp++;
bufYUV[0] = yuv_y0; //Y
bufYUV[1] = yuv_u0; // U
bufYUV[2] = yuv_v0; // V
// RGB껻êYUV
YUV2RGB(bufRGB,bufYUV);
r = bufRGB[0]; // y
g = bufRGB[1]; // u
b = bufRGB[2]; // v
if (r>255) r=(unsigned char)255;
if (r<0) r=0;
if (g>255) g=(unsigned char)255;
if (g<0) g=0;
if (b>255) b=(unsigned char)255;
if (b<0) b=0;
*(rgbbuf+(height-1-i)*width*3+j*3)=r;
*(rgbbuf+(height-1-i)*width*3+j*3+1)=g;
*(rgbbuf+(height-1-i)*width*3+j*3+2)=b;
}
}
}
switch(imagesize){
case D1:
width=720;
height=576;
Interpolation(rgbbuf,jpegRGB,D1,width,height,quality);
break;
case VGA:
width=640;
height=480;
Interpolation(rgbbuf,jpegRGB,VGA,width,height,quality);
break;
case CIF:
width=352;
height=288;
Interpolation(rgbbuf,jpegRGB,CIF,width,height,quality);
break;
}
return SUCCESS;
}
/********************************************************************
Bilinear Interpolation Algorithm
********************************************************************/
int Interpolation(unsigned char *pbufin, unsigned char *pbufout, int imagesize, int newwidth, int newheight,int quality)
{
float xFactor = (float) (D1_WIDTH) / newwidth;
float yFactor = (float) (D1_HEIGHT) / newheight;
int x;
int y;
int ox, oy;
unsigned char * p;
float fox, foy, dx1, dy1, dx2, dy2;
int ox1, oy1, ox2, oy2;
int ymax = D1_HEIGHT- 1;
int xmax = D1_WIDTH - 1;
unsigned char v1, v2;
unsigned char *tp1, *tp2;
unsigned char *p1, *p2, *p3, *p4;
float dx, dy, k1, k2;
float r, g, b;
int i,m,n;
switch(quality){
case LOWER:
// for each line
for ( y = 0; y < newheight; y++)
{
// Y coordinate of the nearest point
oy = (int) (y * yFactor);
// for each pixel
for ( x = 0; x < newwidth; x++)
{
// X coordinate of the nearest point
ox = (int) (x * xFactor);
p = pbufin + oy * D1_WIDTH*3 + ox*3;
*(pbufout+y * newwidth*3+x*3)=*p;
*(pbufout+y * newwidth*3+x*3+1)=*(p+1);
*(pbufout+y * newwidth*3+x*3+2)=*(p+2);
}
}
break;
case MIDDLE:
// for each line
for (y = 0; y < newheight; y++)
{
// Y coordinates
foy = (float) y * yFactor;
oy1 = (int) foy;
oy2 = (oy1 == ymax) ? oy1 : oy1 + 1;
dy1 = foy - (float) oy1;
dy2 = 1.0f - dy1;
// get temp pointers
tp1 = pbufin + oy1 * D1_WIDTH*3;
tp2 = pbufin + oy2 * D1_WIDTH*3;
// for each pixel
for ( x = 0; x < newwidth; x++)
{
// X coordinates
fox = (float) x * xFactor;
ox1 = (int) fox;
ox2 = (ox1 == xmax) ? ox1 : ox1 + 1;
dx1 = fox - (float) ox1;
dx2 = 1.0f - dx1;
// get four points
p1 = tp1 + ox1 * 3;
p2 = tp1 + ox2 * 3;
p3 = tp2 + ox1 * 3;
p4 = tp2 + ox2 * 3;
// interpolate using 4 points
for ( i = 0; i < 3; i++, pbufout++, p1++, p2++, p3++, p4++)
{
v1 = (char)(dx2 * (*p1) + dx1 * (*p2));
v2 = (char)(dx2 * (*p3) + dx1 * (*p4));
*pbufout = (char)(dy2 * v1 + dy1 * v2);
}
}
}
break;
case HIGH:
// RGB
for ( y = 0; y < newheight; y++)
{
// Y coordinates
foy = (float) y * yFactor - 0.5f;
oy1 = (int) foy;
dy = foy - (float) oy1;
for ( x = 0; x < newwidth; x++, pbufout += 3)
{
// X coordinates
fox = (float) x * xFactor - 0.5f;
ox1 = (int) fox;
dx = fox - (float) ox1;
r = g = b = 0;
for ( n = -1; n < 3; n++)
{
k1 = BiCubicKernel(dy - (float) n);
oy2 = oy1 + n;
if (oy2 < 0)
oy2 = 0;
if (oy2 > ymax)
oy2 = ymax;
for ( m = -1; m < 3; m++)
{
k2 = k1 * BiCubicKernel((float) m - dx);
ox2 = ox1 + m;
if (ox2 < 0)
ox2 = 0;
if (ox2 > xmax)
ox2 = xmax;
// get pixel of original image
p = pbufin + oy2 * D1_WIDTH*3+ ox2 * 3;
r += k2 * (*p);
g += k2 * (*(p+1));
b += k2 * (*(p+2));
}
}
*(pbufout)= (char) r;
*(pbufout+1) = (char) g;
*(pbufout+2)= (char) b;
}
}
break;
}
return SUCCESS;
}
/********************************************************************
BiCubicKernel
********************************************************************/
float BiCubicKernel(float x)
{
float a, b, c, d;
float xm1,xp1,xp2;
if (x > 2.0f)
return 0.0f;
xm1 = x - 1.0f;
xp1 = x + 1.0f;
xp2 = x + 2.0f;
a = (xp2 <= 0.0f) ? 0.0f : xp2 * xp2 * xp2;
b = (xp1 <= 0.0f) ? 0.0f : xp1 * xp1 * xp1;
c = (x <= 0.0f) ? 0.0f : x * x * x;
d = (xm1 <= 0.0f) ? 0.0f : xm1 * xm1 * xm1;
return (0.16666666666666666667f * (a - (4.0f * b) + (6.0f * c) - (4.0f * d)));
}
/********************************************************************
YUV to RGB
********************************************************************/
int YUV2RGB(unsigned char *pRGB, unsigned char *pYUV)
{
unsigned char y, u, v;
y = *pYUV; pYUV++;
u = *pYUV; pYUV++;
v = *pYUV;
*pRGB = (unsigned char)(1.0*y + 8 + 1.402*(v-128)); pRGB++; // r
*pRGB = (unsigned char)(1.0*y - 0.34413*(u-128) - 0.71414*(v-128)); pRGB++; // g
*pRGB = (unsigned char)(1.0*y + 1.772*(u-128) + 0); // b
return SUCCESS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -