📄 objectrecognition-final.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <xdc/std.h>
#include <string.h>
#include"imc.h"
#include "objectrecognition.h"
#define Uint32 unsigned int
#define Uint16 unsigned short
#define Uint8 unsigned char
#define Int32 int
#define Int16 short
#define Int8 char
#define D1_WIDTH 720 //width of image
#define D1_HEIGHT 576 //height of image
#define D1 1
#define VGA 2
#define CIF 3
#define HIGH 1
#define MIDDLE 2
#define LOWER 3
#define SUCCESS 0 //!< Success return code.
#define FAILURE -1 //!< Failure return code.
typedef struct _jpegcompress {
int w;
int h;
char *bufp;
} _jpegcompress;
#define INTERFRAME 3 //detection begins from the 3rd image frame
#define ROWS 576
#define COLS 720
Uint32 num_frame;//number of frame
//eye's features
float imt1[7];//IM
float ckbt1;//length/width ratio
float Yzftt1[256];//Y histogram
float Cbzftt1[256];//Cb histogram
float Crzftt1[256];//Cr histogram
//disk's features
float imt2[7];
float ckbt2;
float Yzftt2[256];
float Cbzftt2[256];float Crzftt2[256];
//car's features
float imt3[7];
float ckbt3;
float Yzftt3[256];
float Cbzftt3[256];float Crzftt3[256];
//truck's features
float imt4[7];
float ckbt4;
float Yzftt4[256];
float Cbzftt4[256];float Crzftt4[256];
Uint8 frameY[COLS*ROWS];//Y image of current image
Uint8 frameCb[COLS*ROWS>>1];//Cb image of current image
Uint8 frameCr[COLS*ROWS>>1];//Cr image of current image
Uint8 frameR[COLS*ROWS];//R image of current image
Uint8 frameG[COLS*ROWS];//G image of current image
Uint8 frameB[COLS*ROWS];//B image of current image
Uint8 Fmax[COLS*ROWS];//binary image: object pixel value is 255, background pixel value is 0.
Uint8 Fmax2[COLS*ROWS];//object image: background pixel value is 0.
Uint16 st[50];
Uint16 st1[50];
Uint8 vt[COLS];//vertical projection
Uint8 ht[ROWS];//horizontal projection
Uint8 vto[COLS];
Uint8 hto[ROWS];
Uint32 skin;//number of skin pixels
Uint32 shadow;//number of shadow pixels
Uint8 SubIY[ROWS*COLS];//Y image of object image
Uint8 SubICb[(ROWS*COLS>>1)];//Cb image of object image
Uint8 SubICr[(ROWS*COLS>>1)];//Cr image of object image
Uint8 BImageY[COLS*ROWS];//Y image of background image
Uint8 BImageCb[COLS*ROWS>>1];//Cb image of background image
Uint8 BImageCr[COLS*ROWS>>1];//Cr image of background image
Uint8 PBImageY[COLS*ROWS];//previous Y image of background image
Uint8 PBImageCb[COLS*ROWS>>1];//previous Cbimage of background image
Uint8 PBImageCr[COLS*ROWS>>1];//previous Cr image of background image
Uint8 tframeY[COLS*ROWS];//temp Y image
Uint8 tframeCb[COLS*ROWS>>1];//temp Y image
Uint8 tframeCr[COLS*ROWS>>1];//temp Y image
Uint8 temp1,temp2,temp3,temp4,temp5;//for background update
Uint8 Objt;//recognition result of last frame
//ÃÃÃö
unsigned char rgbbuf[D1_WIDTH*D1_HEIGHT*3];
/*********************************************************************************
kind: 0 stand for no interesting target
1, 2, 3:stand for interesting target
flag: 0:stand for capture data from ccd
3,2,1: stand for jpeg read from usb
*********************************************************************************/
void ObjectRecognition(IDMA3_Handle *handle,unsigned char* inbuf, int* flag,unsigned char* outbuf, int* kind, float *inIM,int *imagesize, int *quality)
{
float scale_a;//background update parameter
float Dis1,Dis2,Dis3,Dis4;//IM distances between standard objects
float ckbdis1,ckbdis2,ckbdis3,ckbdis4;//length/width ratio distances
float Yzftsim1,Yzftsim2,Yzftsim3,Yzftsim4;//Y histogram
float Cbzftsim1,Cbzftsim2,Cbzftsim3,Cbzftsim4;//Cb histogram
float Crzftsim1,Crzftsim2,Crzftsim3,Crzftsim4;//Cr histogram
Uint16 *inbufp;//input buffer pointer
Uint8 threshold_motion;//binary threshold
Uint8 Obj;//object type:0 no, 1 eye, 2 yellow, 3 car, 4 truck;
Uint8 s,b,mt;//used in projection
Uint8 *frameYp,*frameCbp,*frameCrp;//frame Y Cb Cr data pointers
Uint8 *fmaxp;//pointer used for show
Uint8 *frameRp,*frameGp,*frameBp;//frame R G B data pointers
Int32 H,BH;//Hue value, background Hue value
float S,BS;//Saturation
float V,BV;//V
Uint16 DH1,DH2;
Uint8 Y,Cb,Cr,BY,BCb,BCr;
Uint8 R,G,B,BR,BG,BB;
Uint8 maxRGB,minRGB;//used in format conversion
float imY[7];//IM
float ckb;//length/width ratio
float tempDot, tempSrc, tempObj;//used for histogram similar degree
float Yzft[256];
float Cbzft[256];
float Crzft[256];//histograms
Obj=0;
threshold_motion = 0;//10
scale_a = 0.3;
memset(imY,0,7*sizeof(float));
memset(ckb,0,2*sizeof(float));
for(i=0;i<25;i++)inIM[i]=1.0;
*kind=0;
if(*flag>0)//input is pictures
{
num_frame=0;
frameRp=&frameR[0];
frameGp=&frameG[0];
frameBp=&frameB[0];
inbufp=(Uint16 *)inbuf;//read 2 bytes one time;
for ( i =0; i< COLS*ROWS; i++) //extract R,G,B
{
*frameRp=255*((*inbufp&0xF800)>>11)/31;
*frameGp=255*((*inbufp&0x07E0)>>5)/63;
*frameBp=255*(*inbufp&0x001F)/31;
inbufp++;
frameRp++;
frameGp++;
frameBp++;
}
inbufp-=720*576;
frameRp-=720*576;
frameGp-=720*576;
frameBp-=720*576;
frameYp=&frameY[0];
frameCbp=&frameCb[0];
frameCrp=&frameCr[0];
for ( i = 0; i<ROWS*COLS; i++) //RGB to YCbCr
{
R=*frameRp;
G=*frameGp;
B=*frameBp;
Y=0.299*R+0.587*G+0.114*B;
Cr=0.5*R-0.4187*G-0.0813*B+128;
Cb=-0.1687*R-0.3313*G+0.5*B+128;
if ((i%2)==0)
{
*frameCbp=Cb;
frameCbp++;
*frameCrp=Cr;
frameCrp++;
}
*frameYp=Y;
frameYp++;
frameRp++;
frameGp++;
frameBp++;
}
frameYp-=720*576;
frameCbp-=(720*576)>>1;
frameCrp-=(720*576)>>1;
frameRp-=720*576;
frameGp-=720*576;
frameBp-=720*576;
memset(vt,0,COLS);
memset(ht,0,ROWS);
memset(vto,0,COLS);
memset(hto,0,ROWS);
memset(Fmax,0,ROWS*COLS);
for( i = 0; i <ROWS*COLS; i++ )//binary
{
if(*(frameYp+i)<255)
*(Fmax+i)=255;
}
for( i = 0; i <COLS; i++ )//vertical projection
{
for(j=0;j<ROWS;j++)
{*(vt+i)+=*(Fmax+i+j*COLS)/255;}
}
for( i = 0; i <ROWS; i++ )//horizontal projection
{
for(j=0;j<COLS;j++)
{*(ht+i)+=*(Fmax+i*COLS+j)/255;}
}
yl=0;
yr=0;
xt=0;
xb=0;
for( i = 0; i <COLS; i++ )//left boundary
{
if(*(vt+i)>0)
{yl=i;break;}
}
for( i = COLS-1; i>-1; i-- )//right boundary
{
if(*(vt+i)>0)
{yr=i;break;}
}
for( i = 0; i <ROWS; i++ )//top boundary
{
if(*(ht+i)>0)
{xt=i;break;}
}
for( i = ROWS-1; i>-1; i-- )//bottom boundary
{
if(*(ht+i)>0)
{xb=i;break;}
}
if(xb>xt)dx=(xb-xt)+1;
else dx=-(xb-xt)+1;//height
if(yr>yl)dy=(yr-yl)+1;
else dy=-(yr-yl)+1;//width
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; }
imgAvgY=0;
imgAvgCb=0;
imgAvgCr=0;
SumY=0;
SumCb=0;
SumCr=0;
for(i=xt;i<xb+1;i++)//in object region, count histograms
{
for(j=yl;j<yr+1;j++)
{
k=i*COLS+j;
//if((*(Fmax+k)>0)&&(*(frameYp+k)<220))
if((*(Fmax+k)==255)) {
*(SubIY+f)=*(frameYp+k);//<190?*(frameY+k):110;
imgAvgY+=*(frameY+k);
*(Yzft+*(frameY+k))=*(Yzft+*(frameY+k))+1;
SumY++;
if(f==0||f%2==0)
{
*(SubICb+(f>>1))=*(frameCbp+(k>>1));//<190?*(frameCb+(k>>1)):110;
imgAvgCb+=*(frameCb+((k>>1)));
*(Cbzft+*(frameCb+((k>>1))))=*(Cbzft+*(frameCb+((k>>1))))+1;
SumCb++;
*(SubICr+(f>>1))=*(frameCrp+(k>>1));//<190?*(frameCr+(k>>1)):110;
imgAvgCr+=*(frameCr+((k>>1)));
*(Crzft+*(frameCr+((k>>1))))=*(Crzft+*(frameCr+((k>>1))))+1;
SumCr++;
}
//sum++;
*(Fmax2+k)=*(frameYp+k);
}
f++;
}
}
imgAvgY=imgAvgY/(SumY);
imgAvgCb=imgAvgCb/(SumCb);
imgAvgCr=imgAvgCr/(SumCr);
for(i=0;i<256;i++)//norm grams
{
*(Yzft+i)=(*(Yzft+i)*100)/(float)SumY;
*(Cbzft+i)=(*(Cbzft+i)*100)/(float)SumCb;
*(Crzft+i)=(*(Crzft+i)*100)/(float)SumCr;
}
if(*flag==1)//set features of standard object 1
{
*ckbt1=(float)dx/dy>1?(float)dx/dy:(float)dy/dx;//length/width ratio
for(i=0;i<256;i++) { *(Yzftt1+i)=*(Yzft+i); *(Cbzftt1+i)=*(Cbzft+i); *(Crzftt1+i)=*(Crzft+i); }
IM(SubIY,dx,dy,imt1); //IM
for(i=0;i<7;i++)inIM[i]=*(imt1+i);
}
else if(*flag==2)//set features of standard object 2
{
*ckbt2=(float)dx/dy>1?(float)dx/dy:(float)dy/dx;
for(i=0;i<256;i++) { *(Yzftt2+i)=*(Yzft+i); *(Cbzftt2+i)=*(Cbzft+i); *(Crzftt2+i)=*(Crzft+i); }
IM(SubIY,dx,dy,imt2);
for(i=0;i<7;i++)inIM[i]=*(imt2+i);
}
else if(*flag==3)//set features of standard object 3
{
*ckbt3=(float)dx/dy>1?(float)dx/dy:(float)dy/dx;
for(i=0;i<256;i++) { *(Yzftt3+i)=*(Yzft+i); *(Cbzftt3+i)=*(Cbzft+i); *(Crzftt3+i)=*(Crzft+i); }
IM(SubIY,dx,dy,imt3);
for(i=0;i<7;i++)inIM[i]=*(imt3+i);
}
else if(*flag==4)//set features of standard object 4
{
*ckbt4=(float)dx/dy>1?(float)dx/dy:(float)dy/dx;
for(i=0;i<256;i++) { *(Yzftt4+i)=*(Yzft+i); *(Cbzftt4+i)=*(Cbzft+i); *(Crzftt4+i)=*(Crzft+i); }
IM(SubIY,dx,dy,imt4);
for(i=0;i<7;i++)inIM[i]=*(imt4+i);
}
return;
}
if(*flag==0)//input is video image frame
{
//Recognition
*kind=0;
frameYp=&frameY[0];
frameCbp=&frameCb[0];
frameCrp=&frameCr[0];
for ( i = 576-1; i>=0; i--) //extract Y Cb Cr
{
for ( j = 0; j<720; j++)
{
if ((j%2)==0)
{
*frameCbp=*inbuf;
inbuf++;
frameCbp++;
}
else
{
*frameCrp=*inbuf;
inbuf++;
frameCrp++;
}
*frameYp=*inbuf;
inbuf++;
frameYp++;
}
}
inbuf-=720*576<<1;
frameYp-=720*576;
frameCbp-=720*576>>1;
frameCrp-=720*576>>1;
num_frame++;//total number of frames
if(num_frame==1) //Initialization
{
temp1 = 0;
temp2 = 0;
temp3 = 0;
temp4 = 0;
temp5 = 0;
Objt=0;
}
if(num_frame == (INTERFRAME-1))//set previous background image
{
DATA_COPY_2D_TO_1D(frameY,PBImageY,720,576,720,*handle);
ACPY3_wait(*handle);
DATA_COPY_2D_TO_1D(frameCb,PBImageCb,360,576,360,*handle);
ACPY3_wait(*handle);
DATA_COPY_2D_TO_1D(frameCr,PBImageCr,360,576,360,*handle);
ACPY3_wait(*handle);
return;
}
if(num_frame==INTERFRAME)
{
for ( j=0; j<ROWS; j++ )//set background image
{
for ( i=0; i<COLS; i++ )
{
k=i+j*COLS;
*(BImageY+k)=scale_a * (*((frameY)+k))+ (1-scale_a) * (*(PBImageY+k));
if(k==0)
{
*(BImageCb)=scale_a * (*(frameCb))+ (1-scale_a) * (*(PBImageCb));
*(BImageCr)=scale_a * (*(frameCr))+ (1-scale_a) * (*(PBImageCr));
}
else if (k%2==0)
{
*(BImageCb+(k>>1))=scale_a * (*(frameCb+(k>>1)))+ (1-scale_a) * (*(PBImageCb+(k>>1)));
*(BImageCr+(k>>1))=scale_a * (*(frameCr+(k>>1)))+ (1-scale_a) * (*(PBImageCr+(k>>1)));
}
}
}
DATA_COPY_2D_TO_1D(BImageY,PBImageY,720,576,720,*handle);
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);
Objt=0;
return;
}
//when number>3, strart recognition
memset(tframeY,0,ROWS*COLS);
memset(tframeCb,0,(ROWS*COLS>>1));
memset(tframeCr,0,(ROWS*COLS>>1));
for(i =0; i< COLS*ROWS; i++)//|Y-BY|
{
*(tframeY+i)=(*(frameY+i)-*(BImageY+i))>0?(*(frameY+i)-*(BImageY+i)):(*(BImageY+i)-*(frameY+i));
}
for(i =0; i< COLS*ROWS>>1; i++)//max(|Cb-BCb|,|Cr-BCr|)
{
*((tframeCb)+i)=(*(frameCb+i)-*(BImageCb+i))>0?(*(frameCb+i)-*(BImageCb+i)):(*(BImageCb+i)-*(frameCb+i));
*((tframeCr)+i)=(*(frameCr+i)-*(BImageCr+i))>0?(*(frameCr+i)-*(BImageCr+i)):(*(BImageCr+i)-*(frameCr+i));
if((*(tframeCr+i)<*(tframeCb+i)))
*((tframeCr)+i)=*(tframeCb+i);
}
for(i =0; i< COLS*ROWS; i+=2)//max(|Y-BY|,|Cb-BCb|,|Cr-BCr|)
{
if((*(tframeCr+(i>>1))>*(tframeY+i)));
*((tframeY)+i)=*(tframeCr+(i>>1));
if(*(tframeCr+(i>>1))>*(tframeY+i+1))
*((tframeY)+i+1)=*(tframeCr+(i>>1));
}
imgAvgY=0;
imgAvgCb=0;
imgAvgCr=0;
for(i =0; i< COLS*ROWS; i++)
{
imgAvgY+=*(frameY+i);
if(i<(ROWS*COLS>>1))
{
imgAvgCb+=*(frameCb+i);
imgAvgCr+=*(frameCr+i);
}
}
imgAvgY=imgAvgY/(COLS*ROWS);//average Y of frame
imgAvgCb=imgAvgCb/(COLS*ROWS>>1);//average Cb of frame
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -