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

📄 facedetectview.cpp

📁 人脸识别因其在安全验证系统、信用卡验证、医学、档案管理、视频会 议、人机交互、系统公安(罪犯识别等)等方面的巨大应用前景而越来越成为 当前模式识别和人工智能领域的一个研究热点。
💻 CPP
📖 第 1 页 / 共 5 页
字号:
					Count++;
			}
			if((T_NoseMiddleLine-B_NoseMiddleLine)*0.5<Count)
			{
			    H_lnose=j; 
			
			}
        }


///////////////////////鼻右//////
H_rnose=0;
	for(j=(H_lreye+H_rleye)/2;j>((v_right-v_left)/5);j--)
		{   int Count=0;
			for(i=B_NoseMiddleLine;i<T_NoseMiddleLine;i++)
			{
				if(WhiteBlack[i][j]==0)
					Count++;
			}
			if((T_NoseMiddleLine-B_NoseMiddleLine)*0.5<Count)
			{
			    H_rnose=j; 
			
			}
        }
if(H_lnose==0)
  H_lnose=H_lreye;
if(H_rnose==0)
  H_rnose=H_rleye;
  

//////////////////////////////////////////////////////////////////////////
  int N_left=(H_lnose+H_rnose)/2;
  int N_right=((v_right-v_left)/5)*4;
  int N_ntop=T_NoseMiddleLine;
  int N_bottom=B_NoseMiddleLine;
      L_noseX=  H_lnose+v_left;
  L_noseY=NoseY(N_left,N_right,N_ntop,N_bottom)+v_bottom;
      

  N_left=((v_right-v_left)/5);
  N_right=(H_lnose+H_rnose)/2;
  N_ntop=T_NoseMiddleLine;
  N_bottom=B_NoseMiddleLine;
  R_noseX=H_rnose+v_left;
  R_noseY=NoseY(N_left,N_right,N_ntop,N_bottom)+v_bottom;

  L_noseY=(L_noseY+R_noseY)/2;
  R_noseY=L_noseY;
  
      
   N_MiddleX=(R_noseX+L_noseX)/2;
   N_MiddleY=(L_noseX-R_noseX)*0.4+L_noseY;
     DrawCrossX(N_MiddleX, N_MiddleY);

 
  DrawCrossX(L_noseX,L_noseY);
  DrawCrossX(R_noseX,R_noseY);
  /*
/////////////////////////////////鼻子框//////////////////////////////////////////
for(j=v_left+H_rnose-5;j<v_left+H_lnose+5;j++)
{
	  lOffset = gDib.PixelOffset(T_NoseMiddleLine+v_bottom-5, j, gwBytesPerLine);
					*(lpData + lOffset) = 0;
			        *(lpData + lOffset+1) = 0;
			        *(lpData + lOffset+2) =255 ;
					
        lOffset = gDib.PixelOffset(B_NoseMiddleLine+v_bottom+5, j, gwBytesPerLine);
					*(lpData + lOffset) = 0;
			        *(lpData + lOffset+1) =0 ;
			        *(lpData + lOffset+2) =255;
					


}
////////////////////////////////////////////////////////////////////////////////////////
  
////////////////////////////////////////////////////////////////////////////////////////
for(i=B_NoseMiddleLine+v_bottom-5;i<T_NoseMiddleLine+v_bottom+5;i++)
{
	  lOffset = gDib.PixelOffset(i,v_left+H_lnose-5, gwBytesPerLine);
					*(lpData + lOffset) = 0;
			        *(lpData + lOffset+1) = 0;
			        *(lpData + lOffset+2) =255 ;
					
        lOffset = gDib.PixelOffset(i, v_left+H_rnose+5, gwBytesPerLine);
					*(lpData + lOffset) = 0;
			        *(lpData + lOffset+1) =0 ;
			        *(lpData + lOffset+2) =255;
					


}


//////////////////////////////////////////////////////////////
*/
}

int CFaceDetectView::NoseX(int N_left,int N_right,int N_top,int N_bottom)
{
	int Max=0;
	int N_x;
   for(int i=N_left;i<N_right;i++)
   {  int Count=0;
	   for(int j=N_bottom;j<N_top;j++)
	   {
          if(WhiteBlack[j][i]==0)
			Count++; 
	   }
	   if(Max<Count)
	   {
		   Max=Count;
		   N_x=i;
	   }
   }
   for( i=N_x;i<N_right;i++)
   {    int  Count=0;
	   for(int j=N_bottom;j<N_top;j++)
	   {
          if(WhiteBlack[j][i]==0)
			Count++; 
	   }
	   if(Max*0.5>Count)
	   {
		   N_x=i;break;

	   }
   }
   return N_x;
}

int CFaceDetectView::NoseRX(int N_left,int N_right,int N_top,int N_bottom)
{
	int Max=0;
	int N_x;
   for(int i=N_right;i>N_left;i--)
   {  int Count=0;
	   for(int j=N_bottom;j<N_top;j++)
	   {
          if(WhiteBlack[j][i]==0)
			Count++; 
	   }
	   if(Max<Count)
	   {
		   Max=Count;
		   N_x=i;
	   }
   }

   for(i=N_x;i>N_left;i--)
   {  int Count=0;
	   for(int j=N_bottom;j<N_top;j++)
	   {
          if(WhiteBlack[j][i]==0)
			Count++; 
	   }
	   if(Max*0.5>Count)
	   {
		   N_x=i;break;
	   }
   }
   return N_x;
}
int CFaceDetectView::NoseY(int N_left,int N_right,int N_top,int N_bottom)
{
	int Max=0;
	int N_y;
   for(int j=N_bottom;j<N_top;j++)
   {  int Count=0;
	   for(int i=N_left;i<N_right;i++)
	   {
          if(WhiteBlack[j][i]==0)
			Count++; 
	   }
	   if(Max<Count)
	   {
		   Max=Count;
		   N_y=j;
	   }
   }
   return N_y;
}

/////////////////////////////////////嘴巴定位////////////////////////////////////////
void CFaceDetectView::FixeMouth()
{
  T_MouthMiddleLine=0;
  B_MouthMiddleLine=0;
  LPBYTE lpData;
  lpData = gDib.FindDIBBits(hDIB);
  WORD gwBytesPerLine = gDib.BytePerLine(hDIB);
	int lOffset;
int i,j;
for(i=B_NoseMiddleLine-2;i>1;i--)
		{   int Count=0;
			for(j=((v_right-v_left)/5)*2;j<((v_right-v_left)/5)*3;j++)
			{
				if(WhiteBlack[i][j]==0)
					Count++;
			}
			if(((v_right-v_left)/5)*0.5<Count)
			{
			    T_MouthMiddleLine=i; 
				break;
			}
        }
    int jump=0;
	for(i=T_MouthMiddleLine-((v_right-v_left)/5)*0.5;i>3;i--)
		{   int Count=0;
			for(j=((v_right-v_left)/5)*2;j<((v_right-v_left)/5)*3;j++)
			{
				if(WhiteBlack[i][j]==0)
					Count++;
			}
			if(((v_right-v_left)/5)*0.5>Count)
			{
			    B_MouthMiddleLine=i; 
				
				break;
			}
			
        }

	int M_Max=0;
	int M_Line=0;
	for(i=B_NoseMiddleLine-2;i>B_NoseMiddleLine-22;i--)
	{   int Count=0;
		for(j=0;j<(v_right-v_left);j++)
		{
         if(WhiteBlack[i][j]==0)
			 Count++;
		}
		if(M_Max<Count)
		{
         M_Max=Count;
		 M_Line=i;
		}
	}
/*
///////////////////////////////////////////////////////////////////////////////////
for(j=v_left;j<v_right;j++)
{
	  lOffset = gDib.PixelOffset(M_Line+v_bottom, j, gwBytesPerLine);
					*(lpData + lOffset) = 0;
			        *(lpData + lOffset+1) = 0;
			        *(lpData + lOffset+2) =255;
					

}
//////////////////////////////////////////////////////////////////////////////////
*/


   H_lMouth=0;
   H_rMouth=0;

  for(j=((v_right-v_left)/5)*2+((v_right-v_left)/5)/2+10;j<(v_right-v_left);j++)
  {   int  Count=0;
	  for(i=B_MouthMiddleLine;i<T_MouthMiddleLine+2;i++)
	  if(WhiteBlack[i][j]==0)
	   Count++;
	   if(Count<(T_MouthMiddleLine-B_MouthMiddleLine)/4)
	   {H_lMouth=j;
	    break;
	   }
  }

  for(j=((v_right-v_left)/5)*2+((v_right-v_left)/5)/2-6;j>0;j--)
  {   int  Count=0;
	  for(i=B_MouthMiddleLine;i<T_MouthMiddleLine+2;i++)
	  if(WhiteBlack[i][j]==0)
	   Count++;
	   if(Count<(T_MouthMiddleLine-B_MouthMiddleLine)/4)
	   {H_rMouth=j;
	    break;
	   }
  }
////////////////////////////////////////////////////////////////////////////
       N_MiddleX=((H_rleye+H_lreye)/2+v_left+N_MiddleX)/2;
	  if(((N_MiddleX-v_left)-H_rMouth)>(H_lMouth-(N_MiddleX-v_left)))
	  {
		  M_RX=H_rMouth+v_left ;
		  M_RY=M_Line+v_bottom;

          M_LX=((N_MiddleX-v_left)-H_rMouth)+(N_MiddleX-v_left)+v_left-2;
		  M_LY=M_Line+v_bottom;
	  }
	  else
	  { 
		   M_LX=H_lMouth+v_left ;
		   M_LY=M_Line+v_bottom;

		   M_RX=(N_MiddleX-v_left)-(H_lMouth-(N_MiddleX-v_left))+v_left+3;
		   M_RY=M_Line+v_bottom;
	  }

	  if(M_LX<L_noseX)
		  M_LX=L_noseX+(L_noseX-R_noseX)/2;
	  if(M_RX>R_noseX)
          M_RX=R_noseX-(L_noseX-R_noseX)/2;

      DrawCrossX( M_LX,  M_LY);
	  
      DrawCrossX( M_RX, M_RY);

	  xiabaX=N_MiddleX;
	  //xiabaY=N_MiddleY-(2*(L_teye+(v_top-v_bottom)/2-N_MiddleY+v_bottom))*4/5;
	  xiabaY=N_MiddleY-(N_MiddleY-T_MouthMiddleLine-v_bottom)*2-(N_MiddleY-T_MouthMiddleLine-v_bottom)/4;
	  DrawCrossX( xiabaX, xiabaY);
	  /*
////////////////////////////嘴巴框//////////////////////////////////////

	
for(j=v_left+H_rMouth;j<v_left+H_lMouth;j++)
{
	  lOffset = gDib.PixelOffset(T_MouthMiddleLine+v_bottom, j, gwBytesPerLine);
					*(lpData + lOffset) = 0;
			        *(lpData + lOffset+1) = 0;
			        *(lpData + lOffset+2) =255 ;
					
        lOffset = gDib.PixelOffset(B_MouthMiddleLine+v_bottom, j, gwBytesPerLine);
					*(lpData + lOffset) = 0;
			        *(lpData + lOffset+1) =0 ;
			        *(lpData + lOffset+2) =255;
					

}

for(i=B_MouthMiddleLine+v_bottom;i<T_MouthMiddleLine+v_bottom;i++)
{
	  lOffset = gDib.PixelOffset(i,v_left+H_lMouth, gwBytesPerLine);
					*(lpData + lOffset) = 0;
			        *(lpData + lOffset+1) = 0;
			        *(lpData + lOffset+2) =255 ;
					
        lOffset = gDib.PixelOffset(i, v_left+H_rMouth, gwBytesPerLine);
					*(lpData + lOffset) = 0;
			        *(lpData + lOffset+1) =0 ;
			        *(lpData + lOffset+2) =255;
					


}
*/

}


//////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////获取特征参数////////////////////////////////////
void CFaceDetectView::OnPROCESSINGGetCharacteristicParameter() 
{
	// TODO: Add your command handler code here

 /*   
	Centerofgravity();
	GetEyesParameter();
    GetPartParameter();
	GetNoseParameter() ;
	GetmouthParameter() ;
	
	
*/	
	GetNewParameter();
	
	Invalidate();
	
}

///////////////////////////////////////////////////////////////////////
void CFaceDetectView::GetNewParameter()
{     

      x1=TwoPointDistance(R_EyeRX,R_EyeRY,N_MiddleX,N_MiddleY)/TwoPointDistance(N_MiddleX,N_MiddleY,xiabaX,xiabaY);
	  x2=TwoPointDistance(R_EyeLX,R_EyeLY,N_MiddleX,N_MiddleY)/TwoPointDistance(N_MiddleX,N_MiddleY,xiabaX,xiabaY);
	  x3=TwoPointDistance(L_EyeRX,L_EyeRY,N_MiddleX,N_MiddleY)/TwoPointDistance(N_MiddleX,N_MiddleY,xiabaX,xiabaY);
	  x4=TwoPointDistance(L_EyeLX,L_EyeLY,N_MiddleX,N_MiddleY)/TwoPointDistance(N_MiddleX,N_MiddleY,xiabaX,xiabaY);
	  x5=TwoPointDistance(R_noseX,R_noseY,N_MiddleX,N_MiddleY)/TwoPointDistance(N_MiddleX,N_MiddleY,xiabaX,xiabaY);
	  x6=TwoPointDistance(L_noseX,L_noseY,N_MiddleX,N_MiddleY)/TwoPointDistance(N_MiddleX,N_MiddleY,xiabaX,xiabaY);
	  x7=TwoPointDistance(M_RX, M_RY,N_MiddleX,N_MiddleY)/TwoPointDistance(N_MiddleX,N_MiddleY,xiabaX,xiabaY);
	  x8=TwoPointDistance(M_LX, M_LY,N_MiddleX,N_MiddleY)/TwoPointDistance(N_MiddleX,N_MiddleY,xiabaX,xiabaY);
	  x9=(L_EyeRX-R_EyeLX)/TwoPointDistance(N_MiddleX,N_MiddleY,xiabaX,xiabaY);
	  x10=(L_noseX-R_noseX)/TwoPointDistance(N_MiddleX,N_MiddleY,xiabaX,xiabaY);
	  x11=(M_LX-M_RX)/TwoPointDistance(N_MiddleX,N_MiddleY,xiabaX,xiabaY);
	  
}
double CFaceDetectView::TwoPointDistance(int x1,int y1,int x2,int y2)
{
	return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}

///////////////////////////////////////眼、鼻子、嘴巴的重心///////////////////////
void CFaceDetectView::Centerofgravity()
{
///////////////////////左眼重心////////////////////////////////////////////
	int i,j,x,y;
	int sumx=0;
	int sumy=0;
	int sumg=0;
		for(i=(v_top-v_bottom)/2+L_beye,y=1;i<=(v_top-v_bottom)/2+L_teye;i++,y++)
		for(j=H_lreye,x=1;j<=H_lleye;j++,x++)
          if(WhiteBlack[i][j]==0)
		  {
               sumx=sumx+x; 
			   sumy=sumy+y;
			   sumg++;
		  }
    Cofg_lefteyex=sumx/sumg;
	Cofg_lefteyey=sumy/sumg;

     DrawCrossX(v_left+H_lreye+Cofg_lefteyex,(v_top+v_bottom)/2+L_beye+Cofg_lefteyey);

///////////////////////右眼重心////////////////////////////////////////////

       sumx=0;
	   sumy=0;
	   sumg=0;
	   
	for(i=(v_top-v_bottom)/2+R_beye,y=1;i<(v_top-v_bottom)/2+R_teye;i++,y++)
	{   
		for(j=H_rreye,x=1;j<=H_rleye;j++,x++)
          if(WhiteBlack[i][j]==0)
		  { 
               sumx=sumx+x; 
			   sumy=sumy+y;
			   sumg++;
		  }
	}
	
	  Cofg_righteyex=sumx/sumg;
	  Cofg_righteyey=sumy/sumg;
	
DrawCrossX(v_left+H_rreye+Cofg_righteyex,(v_top+v_bottom)/2+R_beye+Cofg_righteyey);
///////////////////////鼻子重心////////////////////////////////////////////
	   sumx=0;
	   sumy=0;
	   sumg=0;
     for(i=B_NoseMiddleLine,y=1;i<=T_NoseMiddleLine;i++,y++)
	    for(j=H_rnose,x=1;j<=H_lnose;j++,x++)
          if(WhiteBlack[i][j]==0)
		  {
               sumx=sumx+x; 
			   sumy=sumy+y;
			   sumg++;
		  }
       Cofg_nosex=sumx/sumg;
       Cofg_nosey=sumy/sumg;
DrawCrossX(v_left+H_rnose+Cofg_nosex,v_bottom+B_NoseMiddleLine+Cofg_nosey);
///////////////////////嘴巴重心////////////////////////////////////////////
       sumx=0;
	   sumy=0;
	   sumg=0;
     for(i=B_MouthMiddleLine,y=1;i<=T_MouthMiddleLine;i++,y++)
	    for(j=H_rMouth,x=1;j<=H_lMouth;j++,x++)
          if(WhiteBlack[i][j]==0)
		  {
               sumx=sumx+x; 
			   sumy=sumy+y;
			   sumg++;
		  }
       Cofg_mouthx=sumx/sumg;
	   Cofg_mouthy=sumy/sumg;


///////////////////////////////////////////////////////////////////////////////////////////

 
}
///////////////////////////获取眼睛的特征关系/////////////////////////////////////
void CFaceDetectView::GetEyesParameter()
{
  double TwoEyeAngle;
  double Toweye_nose;
  double Toweye_mouth;
  double Toweye_face;
  int X;
  int Y;
  ///////////////////////////////////两眼角度///////////////////////////////
    if(Cofg_lefteyex>Cofg_righteyex)
		X=Cofg_lefteyex-Cofg_righteyex+H_lreye-H_rreye;
	else
		X=Cofg_righteyex-Cofg_lefteyex+H_lreye-H_rreye;
	 if(Cofg_lefteyey>Cofg_righteyey)
		 Y=Cofg_lefteyey-Cofg_righteyey+abs(L_beye-R_beye);
	 else
		 Y=Cofg_righteyey-Cofg_lefteyey+abs(L_beye-R_beye);
	 TwoEyeAngle=atan(double(Y)/X);
   ///////////////////////////////////鼻眼鼻所形成的角//////////////////////////////
    int T_line;
	int L_line ;
	int R_line;

T_line=X*X+Y*Y;
	R_line=((v_top-v_bottom)/2+R_beye+Cofg_righteyey-Cofg_nosey-B_NoseMiddleLine)*
           ((v_top-v_bottom)/2+R_beye+Cofg_righteyey-Cofg_nosey-B_NoseMiddleLine)+
		    (H_rnose+Cofg_nosex-H_rreye-Cofg_righteyex)*(H_rnose+Cofg_nosex-H_rreye-Cofg_righteyex);
    L_line=((v_top-v_bottom)/2+L_beye+Cofg_lefteyey-Cofg_nosey-B_NoseMiddleLine)*
            ((v_top-v_bottom)/2+L_beye+Cofg_lefteyey-Cofg_nosey-B_NoseMiddleLine)+
            (H_rnose+Cofg_nosex-H_lreye-Cofg_righteyex)*(H_rnose+Cofg_nosex-H_lreye-Cofg_righteyex);
    Toweye_nose  =	(T_line-R_line-L_line)/(-2.0*sqrt(R_line)*sqrt(L_line));
	
///////////////////////////////////////鼻嘴鼻所形成的角////////////////////////////////            
T_line=X*X+Y*Y;
	R_line=((v_top-v_bottom)/2+R_beye+Cofg_righteyey-Cofg_mouthy-B_MouthMiddleLine)*
           ((v_top-v_bottom)/2+R_beye+Cofg_righteyey-Cofg_mouthy-B_MouthMiddleLine)+
		    (H_rMouth+Cofg_mouthx-H_rreye-Cofg_righteyex)*(H_rMouth+Cofg_mouthx-H_rreye-Cofg_righteyex);

    L_line=((v_top-v_bottom)/2+L_beye+Cofg_lefteyey-Cofg_mouthy-B_MouthMiddleLine)*

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -