📄 facedetectview.cpp
字号:
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 + -