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

📄 objectrecognition-final.c

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