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

📄 facedetectview.cpp

📁 人脸识别因其在安全验证系统、信用卡验证、医学、档案管理、视频会 议、人机交互、系统公安(罪犯识别等)等方面的巨大应用前景而越来越成为 当前模式识别和人工智能领域的一个研究热点。
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	//数据很小,设置为0
	if(pByte<=Low)
		return 0;
	//中间数据,进行对比增强处理
	else if ((Low<pByte)&&(pByte<High))
		return int(((pByte-Low)/Grad));
	//数据很大,设置为255
	else
		return  255;

}
//////////////////////均衡直方图/////////////////////////////////
void CFaceDetectView::OnReadyZft() 
{
	// TODO: Add your command handler code here
	if(!FaceGass)
	{
		::AfxMessageBox("请确认是否进行高斯平滑?");
		return ;
	}
    	
	ReadyZft5();
	FaceGass=false;
    FaceJunHeng=true;
}
void CFaceDetectView::ReadyZft5()
{
	LPBYTE lpData;
	long lOffset;
	lpData = gDib.FindDIBBits(hDIB);
    WORD gwBytesPerLine = gDib.BytePerLine(hDIB);
	int k,i;
	ZFT= new int*[v_top-v_bottom+1];
	for( k=0;k<v_top-v_bottom+1;k++)
      ZFT[k]=new int [v_right-v_left+1];

    int lCount[256];
	for(int t=0;t<256;t++)
		lCount[t]=0;
    for(i=v_bottom,k=0; i<=v_top; i++,k++)
		for(int j=v_left,k1=0; j<=v_right; j++,k1++)
		{
         lCount[Gray[k][k1]]++;
		}
	

///////////////////////////////////////////////////////////////////////
		// 计算灰度映射表
		int bMap[256],j;
	for (i = 0; i < 256; i++)
	{
		// 初始为0
		int lTemp = 0;
		
		for (j = 0; j <= i ; j++)
		{
			lTemp += lCount[j];
		}
		
		// 计算对应的新灰度值
		bMap[i] = (BYTE) (lTemp * 255 / (v_top-v_bottom+1) / (v_right-v_left+1));
	}
	
	
	
//////////////////////////////////////////////////////////////////////
	for( i=v_bottom,k=0; i<=v_top; i++,k++)
		for(int j=v_left,k1=0; j<=v_right; j++,k1++)
		{
           lOffset = gDib.PixelOffset(i, j, gwBytesPerLine);
           int state=bMap[Gray[k][k1]];
//           *(lpData + lOffset)=state ;
//		   *(lpData + lOffset+1)=state ;
//		   *(lpData + lOffset+2)=state ;
		   ZFT[k][k1]=state;

		}
		 
	Invalidate();

}

//////////////////////////二值化//////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
void CFaceDetectView::OnReadyWhiteblack() 
{
	// TODO: Add your command handler code here
	if(!FaceDbidu)
	{
		::AfxMessageBox("请确认是否进行对比度增强?");
		return ;
	}
     ReadyWhiteblack7();
	 FaceDbidu=false;
	 FaceTwo=true;

}

void CFaceDetectView::ReadyWhiteblack7() 
{
	LPBYTE lpData;
	long lOffset;
	lpData = gDib.FindDIBBits(hDIB);
    WORD gwBytesPerLine = gDib.BytePerLine(hDIB);
	WhiteBlack= new int*[v_top-v_bottom+1];
	
	//////////////////////////////////////////////////////////////////////
 
	int x,y;
	int n,k,k1;
	double Ut1,Ut2;
	 double Qt1;
	 double Qb;
	 double temp=0;
	 for(int t=100;t<256;t++)
	 {     int T_t=0; 
	       int B_t=0;
	       int Gsumn=0;
		   int Gsum=0;
          for(y=v_bottom,k=0; y<=v_top; y++,k++)
		        for(x=v_left,k1=0; x<=v_right; x++,k1++)
				{	
					lOffset = gDib.PixelOffset(y, x, gwBytesPerLine);
					if(Icd[k][k1]>=t)
					{
						T_t++;
                        Gsum=Gsum+Icd[k][k1];
					}
					else
					{
						B_t++;
						Gsumn=Gsumn+Icd[k][k1];
					}
				}

				Qt1=double(T_t)/((v_top-v_bottom+1)*(v_right-v_left+1));
                Ut1=double(Gsum)/T_t;
				Ut2=double(Gsumn)/B_t;
			    Qb=Qt1*(1-Qt1)*(Ut1-Ut2)*(Ut1-Ut2);
                if(Qb>temp)
				{
					temp=Qb;
                    n=t;
				}


	 }

	//////////////////////////////////////////////////////////////////////
	
	int i;
	for( k=0;k<v_top-v_bottom+1;k++)
     WhiteBlack[k]=new int [v_right-v_left+1];
     
	for( i=v_bottom,k=0; i<=v_top; i++,k++)
		for(int j=v_left,k1=0; j<=v_right; j++,k1++)
		{
           lOffset = gDib.PixelOffset(i, j, gwBytesPerLine);
           if(ZFT[k][k1]<n-60)
		   {
//           *(lpData + lOffset)=0;
//		   *(lpData + lOffset+1)=0;
//		   *(lpData + lOffset+2)=0;
		   WhiteBlack[k][k1]=0;
		   }
		   else
		   {
//		   *(lpData + lOffset)=255;
//		   *(lpData + lOffset+1)=255;
//		   *(lpData + lOffset+2)=255;
		   WhiteBlack[k][k1]=255;
		   }

		}
		 
	Invalidate();

}


//////////////////////////去除孤立点////////////////////////////
void CFaceDetectView::OnREADYBanishOnlyPoint() 
{
	// TODO: Add your command handler code here
	if(!FaceTwo)
	{
		::AfxMessageBox("请确认是否进行对比度增强?");
		return ;
	}
	LPBYTE lpData;
	long lOffset;
	lpData = gDib.FindDIBBits(hDIB);
    WORD gwBytesPerLine = gDib.BytePerLine(hDIB);
     int sum=0;
	for( int i=v_bottom+1,k=1; i<v_top; i++,k++)
		for(int j=v_left+1,k1=1; j<v_right; j++,k1++)
       {
	//当前点的数值
	int num = WhiteBlack[k][k1];
	if (num !=255)//不是黑色
         {
         
 ////////////////////判断右边////////////////////
    

            num = WhiteBlack[k][k1+1];

            if (num !=255)//不是黑色
               sum++;
///////////////////判断右下//////////////////

    
           num = WhiteBlack[k-1][k1+1];
            if (num !=255)//不是黑色
             sum++;
///////////////////判断右下//////////////////

    
           num = WhiteBlack[k-1][k1];
            if (num !=255)//不是黑色
            sum++;
///////////////////判断右偏左下//////////////////

    
           num = WhiteBlack[k-1][k1-1];
            if (num !=255)//不是黑色
             sum++;
 ///////////////////判断左边//////////////////
 
     
           num = WhiteBlack[k-1][k1];
            if (num !=255)//不是黑色
            sum++;
///////////////////判断左偏上边//////////////////
 
           num = WhiteBlack[k+1][k1-1];
		   if (num !=255)//不是黑色
            sum++;
///////////////////判断左上//////////////////
 
           num = WhiteBlack[k+1][k1];
            if (num !=255)//不是黑色
             sum++; 
////////////////////判断是否为孤立点//////////////////////
			
           if(sum<2)
             {
               lOffset = gDib.PixelOffset(i, j, gwBytesPerLine);
              //*(lpData + lOffset++) = 255;
			  //*(lpData + lOffset++) = 255;
			  //*(lpData + lOffset++) = 255;
			 // WhiteBlack[k][k1]=255;
             }
           sum=0;

         }
        
       }
	
	Invalidate();
	
	 FaceTwo=false; 
	 FaceGuLi=true;

}


//////////////////////////////////////////////////////////////////////
//进行中值滤波
void CFaceDetectView::OnREADYMediumvalue() 
{
	// TODO: Add your command handler code here
	
CFaceDetectDoc* pDoc = GetDocument();

	//进行中值滤波
   MidFilter(3,3);

	Invalidate(TRUE);

}


void CFaceDetectView::MidFilter(int tem_w,int tem_h)
{
	LPBYTE lpData;
	int m_Width;
	m_Width=v_right-v_left+1;
    int m_Height;
	int lOffset;
	m_Height=v_top-v_bottom+1;
	BYTE *temp=(BYTE*)malloc(tem_w*tem_h*sizeof(BYTE));
	lpData = gDib.FindDIBBits(hDIB);
	WORD gwBytesPerLine = gDib.BytePerLine(hDIB);
  	for( int i=v_bottom; i<v_top; i++)
	{
		for(int j=v_left; j<v_right; j++)
	   {   
          //将点(i,j)点作为模板的中心
          for(int m=i-((tem_h-1)/2);m<=i+((tem_h-1)/2);m++)
          {
		     for(int n=j-((tem_w-1)/2);n<=j+((tem_w-1)/2);n++)
			 {
             //将以点(i,j)为中心,与模板大小相同的范围内的象素传递到模板矩阵中
			  lOffset = gDib.PixelOffset(m, n, gwBytesPerLine);
		      temp[(m-i+((tem_h-1)/2))*tem_w+n-j+((tem_w-1)/2)]=*(lpData + lOffset);
			 }

          int mid;
		 //利用气泡法计算中值
           for(m=0;m<tem_w*tem_h-1;m++)
           {
		   
		      for(n=0;n<tem_w*tem_h-m-1;n++)
			 
			    if(temp[n]>temp[n+1]) 
                {
			    mid=temp[n];
                temp[n]=temp[n+1];
			    temp[n+1]=mid;
			  }
		   
		   } 

           //将计算的结果放到新的位图的相应位置
		       lOffset = gDib.PixelOffset(i, j, gwBytesPerLine);
              *(lpData + lOffset++) = temp[(tem_w*tem_h-1)/2];
			  *(lpData + lOffset++) = temp[(tem_w*tem_h-1)/2];
			  *(lpData + lOffset++) = temp[(tem_w*tem_h-1)/2];

	      
		 }
	   }
	}
	
}

void CFaceDetectView::OnREADYDilationFirst() 
{
	// TODO: Add your command handler code here
	gDib.Dilation(hDIB,v_top,v_bottom,v_left,v_right);
	gDib.Dilation(hDIB,v_top,v_bottom,v_left,v_right);
	Invalidate();
	
}

void CFaceDetectView::OnREADYDecay() 
{
	// TODO: Add your command handler code here
	
    gDib.Erasion(hDIB,v_top,v_bottom,v_left,v_right);
	gDib.Erasion(hDIB,v_top,v_bottom,v_left,v_right);
	gDib.Erasion(hDIB,v_top,v_bottom,v_left,v_right);
	Invalidate();


}

void CFaceDetectView::OnREADYOutLine() 
{
    LPBYTE lpData;
	lpData = gDib.FindDIBBits(hDIB);
	WORD gwBytesPerLine = gDib.BytePerLine(hDIB);
  
	//循环变量
     int  i;
      int j;
	unsigned char n,e,s,w,ne,se,nw,sw;


   
	
       
	//当前点的数值
	int k,k1;
	for(  i=v_bottom+1,k=1; i<v_top; i++,k++)
	{
		for( j=v_left+1,k1=1; j<v_right; j++,k1++)
		{
			int pixel = Icd[k][k1];
			
			if(pixel == 0)
			{
				
				nw = Icd[k][k1-1];
				n  = Icd[k+1][k1-1];
				ne = Icd[k+1][k1];
				w = Icd[k+1][k1+1];
				e = Icd[k][k1+1];
				sw =Icd[k-1][k1+1];
				s  = Icd[k-1][k1];
				se = Icd[k-1][k1-1];
				//如果相邻的八个点都是黑点
				if(nw+n+ne+w+e+sw+s+se==0)
				{
					int lOffset = gDib.PixelOffset(i, j, gwBytesPerLine);
					*(lpData + lOffset++) = 255;
			        *(lpData + lOffset++) = 255;
			        *(lpData + lOffset++) = 255;


				}
			}
		}
	}


Invalidate();

}
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////定位///////////////////////////////////////////
void CFaceDetectView::OnREADYFixedPosition() 
{
	// TODO: Add your command handler code here
	
	READYFixedPosition8();
   

}

bool CFaceDetectView::READYFixedPosition8() 
{
    bool Over;
     
	 Over=FixeEyes();
	 if(!Over)
		 return false;
	 FaceGuLi=false;

	 FixeNose();
	 FixeMouth();
	
	 Invalidate();
	 return true;

}
/////////////////////////////////////眼睛定位////////////////////////////////////////
bool CFaceDetectView::FixeEyes()
{
	int i,j,k,k1,k_Middle,k1_Middle;
	LPBYTE lpData;
	lpData = gDib.FindDIBBits(hDIB);
	WORD gwBytesPerLine = gDib.BytePerLine(hDIB);
	int lOffset;

	
	i=j=0;
    if((v_right-v_left)*(v_top-v_bottom)<10)
	{
		::AfxMessageBox("人脸太小!无法准确识别!");
		return false;
	}
	Vtemp=new int[(v_right-v_left)/5+1];
	Htemp=new int[(v_top-v_bottom)/2+1];
	for(i=0;i<(v_top-v_bottom)/2+1;i++)
		Htemp[i]=0;
	for(j=0;j<(v_right-v_left)/5+1;j++)
		Vtemp[j]=0;
	k_Middle=(v_top-v_bottom)/2;
	k1_Middle=(v_right-v_left)/2;
	 
    ///////////////////////////////////////////////左眼定位////////////////////////
	for(i=(v_top+v_bottom)/2,k=0;i<=v_top;i++,k++)
		for(j=v_left+(v_right-v_left)/2,k1=0;j<=v_left+(v_right-v_left);j++,k1++)
          if(WhiteBlack[k+k_Middle][k1+k1_Middle]==0)
		  {
                Htemp[k]++;
		  }
		  
  
     int Max=0;
	 int SMax=0;
	 int Line=0;
	 int BsecondLine=0;
	     L_teye=10000;
	
	 int L_EyeMiddleLine=0;
	 int TSecondLine=0;
	     L_beye=0;
	for(i=5;i<(v_top-v_bottom)/2-2;i++)
	{
		if(Htemp[i]>Max)
		{   
			Max=Htemp[i];
	    	Line=i;
			
		}
       
	}

if(Max<((v_right-v_left)/5)*0.2)
  {
   ::AfxMessageBox("请确认图片中是否有人脸!以及脸部的获取是否整确!");
    return false ;
  }

////////////////////////////////////////获取左波峰

int t1=Htemp[(v_top-v_bottom)/10+3];
int t2=Htemp[(v_top-v_bottom)/10+4];
int t3=Htemp[(v_top-v_bottom)/10+5];
int t4=Htemp[(v_top-v_bottom)/10+6];
int t5=Htemp[(v_top-v_bottom)/10+7];
int t6=Htemp[(v_top-v_bottom)/10+8];
int t7=Htemp[(v_top-v_bottom)/10+9];
int M_Line=Line;
int t=0;
int top=0;

⌨️ 快捷键说明

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