⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 objectrecognition-final.c

📁 TI达芬奇开发平台下的目标识别程序主要匹配准则为力矩直方图和人的肤色等
💻 C
📖 第 1 页 / 共 3 页
字号:
#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 + -