📄 facedetectview.cpp
字号:
//数据很小,设置为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 + -