📄 facedetectview.cpp
字号:
// FaceDetectView.cpp : implementation of the CFaceDetectView class
//
#include "stdafx.h"
#include "FaceDetect.h"
#include "DIB.h"
#include "FaceDetectDoc.h"
#include "FaceDetectView.h"
#include "STUDY_1.h"
#include "Tishi.h"
#include "GetStudyNum.h "
#include "ShowPMessage.h"
#include "XiuGai.h"
#include "GetName.h"
#include "Message.h"
#include "shujuyanchi.h"
#include "Meg.h"
#include "DelectMessage.h"
#include "FINDMESSAGE.h"
#include "math.h"
#define WIDTHBYTES(bits) ((bits+31)/32*4)
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
DIB gDib;
HANDLE hDIB;
HANDLE hDIB1;
HANDLE hDIBTemp;
HANDLE hDIBTemp1;
int gheight;
int gwidth;
WORD gwBytesPerLine;
static int v_left,v_top,v_bottom,v_right;
/////////////////////////////////////////////////////////////////////////////
// CFaceDetectView
IMPLEMENT_DYNCREATE(CFaceDetectView, CView)
BEGIN_MESSAGE_MAP(CFaceDetectView, CView)
//{{AFX_MSG_MAP(CFaceDetectView)
ON_COMMAND(ID_READY_LIGHTINGCONPENSATE, OnReadyLightingconpensate)
ON_COMMAND(ID_READY_SCALE, OnReadyScale)
ON_COMMAND(ID_READY_ContrastEnhance, OnREADYContrastEnhance)
ON_COMMAND(ID_READY_ZFT, OnReadyZft)
ON_COMMAND(ID_READY_WHITEBLACK, OnReadyWhiteblack)
ON_COMMAND(ID_READY_BanishOnlyPoint, OnREADYBanishOnlyPoint)
ON_COMMAND(ID_READY_Mediumvalue, OnREADYMediumvalue)
ON_COMMAND(ID_READY_DilationFirst, OnREADYDilationFirst)
ON_COMMAND(ID_READY_Decay, OnREADYDecay)
ON_COMMAND(ID_READY_OutLine, OnREADYOutLine)
ON_COMMAND(ID_READY_FixedPosition, OnREADYFixedPosition)
ON_COMMAND(ID_PROCESSING_GetCharacteristicParameter, OnPROCESSINGGetCharacteristicParameter)
ON_COMMAND(ID_PROSSING_detect, OnPROSSINGdetect)
ON_COMMAND(AFX_ID_VIDIO, OnIdVidio)
ON_COMMAND(ID_VIDIO_CANNEL, OnVidioCannel)
ON_COMMAND(AFX_ID_PROSSING, OnIdProssing)
ON_COMMAND(ID_READY_Template, OnREADYTemplate)
ON_BN_CLICKED(IDOK_GetName, OnGetName)
ON_COMMAND(ID_PROSSING_STUDY, OnProssingStudy)
ON_COMMAND(ID_DETECTFACE, OnDetectface)
ON_COMMAND(ID_STUDY_MENUITEM32798, OnStudyMenuitem32798)
ON_COMMAND(ID_DATABASE_FIND, OnDatabaseFind)
ON_COMMAND(ID_DATABASE_Delete, OnDATABASEDelete)
ON_COMMAND(ID_MENUITEM32799, OnMenuitem32799)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFaceDetectView construction/destruction
CFaceDetectView::CFaceDetectView()
{
// TODO: add construction code here
Study=0;
pname="temp";
Picture=1;
Picture1=1;
flagP=false;
lpRgb = NULL;
lpYcc = NULL;
faceNum = 0;
for(int i=0; i<ImgRange; i++)
for (int j=0; j<ImgRange; j++)
{
this->emymapc[i][j] = false;
this->emymapl[i][j] = false;
this->lab[i][j] = false;
}
this->result = false;
v_left=0;
v_top=0;
v_bottom=0;
v_right=0;
GetFlag=0;
FaceAere=false;
FaceLine=false;
FaceGray=false;
FaceGass=false;
FaceJunHeng=false;
FaceDbidu=false;
FaceTwo=false;
FaceGuLi=false;
FaceDingWei=false;
FaceTeZheng=false;
FaceShiBie=false;
}
CFaceDetectView::~CFaceDetectView()
{
}
BOOL CFaceDetectView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CFaceDetectView drawing
void CFaceDetectView::OnDraw(CDC* pDC)
{
CFaceDetectDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CPen NewPen1(PS_SOLID,2,RGB(255,0,0));
CPen *pOldPen=pDC->SelectObject(&NewPen1);
if(hDIB)
{
gDib.PaintDIBTrue(pDC->GetSafeHdc(),CRect(500+100,10+50,gwidth+500+100,gheight+10+50),hDIB,CRect(0,0,gwidth,gheight),SRCCOPY);
//dc.SetROP2(R2_NOTXORPEN);
}
if(hDIB1)
gDib.PaintDIBTrue1(pDC->GetSafeHdc(),CRect(500+100-300-100+150,10+300+50,820+100-300-100+150,250+300+50),hDIB1,CRect(0,0,gwidth,gheight),SRCCOPY);
///////////////////////////识别图象框///////////////////
int x1=10+100;
int y1=10+50;
int x2=320+10+100;
int y2=240+10+50;
pDC->MoveTo(x1-5,y1-5);
pDC->LineTo(x1-5,y2+5);
pDC->MoveTo(x1-5,y2+5);
pDC->LineTo(x2+5,y2+5);
pDC->MoveTo(x2+5,y2+5);
pDC->LineTo(x2+5,y1-5);
pDC->MoveTo(x2+5,y1-5);
pDC->LineTo(x1-5,y1-5);
pDC->TextOut(80,100,"摄");
pDC->TextOut(80,120,"像");
pDC->TextOut(80,140,"头");
//dc.SetROP2(R2_NOTXORPEN);
//////////////////////摄像头框////////////////////////
x1=500+100;
y1=10+50;
x2=820+100;
y2=250+50;
pDC->MoveTo(x1-5,y1-5);
pDC->LineTo(x1-5,y2+5);
pDC->MoveTo(x1-5,y2+5);
pDC->LineTo(x2+5,y2+5);
pDC->MoveTo(x2+5,y2+5);
pDC->LineTo(x2+5,y1-5);
pDC->MoveTo(x2+5,y1-5);
pDC->LineTo(x1-5,y1-5);
pDC->TextOut(80+490,100,"识");
pDC->TextOut(80+490,120,"别");
pDC->TextOut(80+490,140,"图");
pDC->TextOut(80+490,160,"像");
/////////////////////////////////标准图象框/////////////////////////////////////
CPen NewPen2(PS_SOLID,2,RGB(0,255,0));
CPen *pOldPen2=pDC->SelectObject(&NewPen2);
x1=500+100-300-100+150;
y1=10+300+50;
x2=820+100-300-100+150;
y2=250+300+50;
pDC->MoveTo(x1-5,y1-5);
pDC->LineTo(x1-5,y2+5);
pDC->MoveTo(x1-5,y2+5);
pDC->LineTo(x2+5,y2+5);
pDC->MoveTo(x2+5,y2+5);
pDC->LineTo(x2+5,y1-5);
pDC->MoveTo(x2+5,y1-5);
pDC->LineTo(x1-5,y1-5);
pDC->TextOut(500+100-300-100-30+150,10+300+50+40,"标");
pDC->TextOut(500+100-300-100-30+150,10+300+50+40+20,"准");
pDC->TextOut(500+100-300-100-30+150,10+300+50+40+40,"图");
pDC->TextOut(500+100-300-100-30+150,10+300+50+60+40,"像");
// TODO: add draw code for native data here
}
/*
void CFaceDetectView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal;
//TODO: calculate the total size of this view
sizeTotal.cx = sizeTotal.cy = 100;
SetScrollSizes(MM_TEXT, sizeTotal);
}
*/
/////////////////////////////////////////////////////////////////////////////
// CFaceDetectView printing
void CFaceDetectView::DrawLine(int left,int top,int bottom ,int right)
{
v_left=0;
v_top=0;
v_bottom=0;
v_right=0;
v_left=left;
v_top=bottom;
v_bottom=top;
v_right=right;
LPBYTE lpData;
long lOffset;
FaceAere=true;
lpData = gDib.FindDIBBits(hDIB);
WORD gwBytesPerLine = gDib.BytePerLine(hDIB);
for( int i=v_left; i<v_right; i++)
{
lOffset = gDib.PixelOffset( v_top,i, gwBytesPerLine);
*(lpData + lOffset)=0;
*(lpData + lOffset+1)=0;
*(lpData + lOffset+2)=255;
lOffset = gDib.PixelOffset( v_bottom,i, gwBytesPerLine);
*(lpData + lOffset)=0;
*(lpData + lOffset+1)=0;
*(lpData + lOffset+2)=255;
}
for(int j=v_bottom; j<v_top; j++)
{
lOffset = gDib.PixelOffset( j,v_left, gwBytesPerLine);
*(lpData + lOffset)=0;
*(lpData + lOffset+1)=0;
*(lpData + lOffset+2)=255;
lOffset = gDib.PixelOffset( j,v_right, gwBytesPerLine);
*(lpData + lOffset)=0;
*(lpData + lOffset+1)=0;
*(lpData + lOffset+2)=255;
}
/* for(i=0;i<5;i++)
{ int H=((v_right-v_left)/5)*i+v_left;
for(j=v_bottom; j<v_top; j++)
{
lOffset = gDib.PixelOffset( j,H, gwBytesPerLine);
*(lpData + lOffset)=0;
*(lpData + lOffset+1)=0;
*(lpData + lOffset+2)=255;
}
}
for( i=v_left; i<v_right; i++)
{
lOffset = gDib.PixelOffset( (v_top+v_bottom)/2,i, gwBytesPerLine);
*(lpData + lOffset)=0;
*(lpData + lOffset+1)=0;
*(lpData + lOffset+2)=255;
}
for( i=v_bottom; i<v_top; i++)
{
lOffset = gDib.PixelOffset( i,(v_left+v_right)/2, gwBytesPerLine);
*(lpData + lOffset)=0;
*(lpData + lOffset+1)=0;
*(lpData + lOffset+2)=255;
}
*/
//////////////////////////////////////////////////////////////////////////////////////////////
//Invalidate();
}
BOOL CFaceDetectView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CFaceDetectView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CFaceDetectView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CFaceDetectView diagnostics
#ifdef _DEBUG
void CFaceDetectView::AssertValid() const
{
CView::AssertValid();
}
void CFaceDetectView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CFaceDetectDoc* CFaceDetectView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFaceDetectDoc)));
return (CFaceDetectDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CFaceDetectView message handlers
void CFaceDetectView::OnReadyLightingconpensate()
{
// TODO: Add your command handler code here
if(FaceAere)
{
::AfxMessageBox("请确认脸部区域是否获取?");
return ;
}
ReadyLightingconpensate2();
FaceLine=true;
FaceAere=false;
}
void CFaceDetectView::ReadyLightingconpensate2()
{
hDIBTemp = gDib.CopyHandle(hDIB);
gDib.LightingCompensate(hDIB);
GlobalUnlock(hDIB);
Invalidate();
}
void CFaceDetectView::OnReadyScale()
{
// TODO: Add your command handler code here
if(!FaceLine)
{
::AfxMessageBox("请确认是否进行补光处理?");
return ;
}
ReadyScale3();
FaceGray=true;
FaceLine=false;
}
void CFaceDetectView::ReadyScale3()
{
LPBYTE lpData;
long lOffset;
lpData = gDib.FindDIBBits(hDIB);
WORD gwBytesPerLine = gDib.BytePerLine(hDIB);
unsigned ColorR,ColorG,ColorB,gray;
Gray= new int*[v_top-v_bottom+1];
int k;
for( k=0;k<v_top-v_bottom+1;k++)
Gray[k]=new int [v_right-v_left+1];
int k1,i,j;
for(i=v_bottom,k=0; i<=v_top; i++,k++)
{
for(j=v_left,k1=0; j<=v_right; j++,k1++)
{
lOffset = gDib.PixelOffset(i, j, gwBytesPerLine);
ColorB=*(lpData + lOffset);
ColorG=*(lpData + lOffset+1);
ColorR=*(lpData + lOffset+2);
gray = (ColorG*50+ColorR*39+ColorB*11)/100;
// *(lpData + lOffset)=gray ;
// *(lpData + lOffset+1)=gray ;
// *(lpData + lOffset+2)=gray ;
Gray[k][k1]=gray;
}
}
///////////////////////////////////////////////////////////////////////////
/*
int sumDCT=0;
int Au,Av;
int u,v,x,y;
LPBITMAPINFOHEADER lpbi;
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
gheight = lpbi->biHeight;
gwidth = lpbi->biWidth;
for(u=0; u<100; u++)
for( v=0; v<100; v++)
{
for(x=0; x<100; x++)
for( y=0; y<10; y++)
{ lOffset = gDib.PixelOffset(x, y, gwBytesPerLine);
sumDCT=sumDCT+(*(lpData + lOffset))*cos((((2*x+1)*u*3.1415926))/((v_top-v_bottom+1)*2))*cos((((2*y+1)*v*3.1415926))/((v_left-v_right+1)*2));
}
if(u==0)
Au=1/sqrt(v_top-v_bottom+1);
else
Au=sqrt(2/(v_top-v_bottom+1));
if(v==0)
Av=1/sqrt(v_right-v_left+1);
else
Av=sqrt(2/(v_right-v_left+1));
// ::AfxMessageBox("只能对宽度和高度相等的图像进行方块编码!");
sumDCT=Av*Au*sumDCT;
lOffset = gDib.PixelOffset(u, v, gwBytesPerLine);
*(lpData + lOffset)=sumDCT ;
*(lpData + lOffset+1)=sumDCT ;
*(lpData + lOffset+2)=sumDCT;
}
*/
//////////////////////////////////////////////////////////////////////////
Invalidate();
}
//函数说明:该函数实现图像对比度增强的功能
void CFaceDetectView::OnREADYContrastEnhance()
{
// TODO: Add your command handler code here
if(!FaceJunHeng)
{
::AfxMessageBox("请确认是否进行直方图均衡?");
return ;
}
READYContrastEnhance6();
FaceJunHeng=false;
FaceDbidu=true;
}
void CFaceDetectView::READYContrastEnhance6()
{
LPBYTE lpData;
long lOffset;
lpData = gDib.FindDIBBits(hDIB);
WORD gwBytesPerLine = gDib.BytePerLine(hDIB);
Icd= new int*[v_top-v_bottom+1];
int k,i;
for( k=0;k<v_top-v_bottom+1;k++)
Icd[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);
int state=IncreaseContrast(ZFT[k][k1], 100);
// *(lpData + lOffset)=state ;
// *(lpData + lOffset+1)=state ;
// *(lpData + lOffset+2)=state ;
Icd[k][k1]=state;
}
Invalidate();
}
int CFaceDetectView::IncreaseContrast(int pByte,int n)
{
//根据参数n来调节对比度,n越大,对比越强烈
int Low = n;
int High = 255-n;
float Grad = ((float)(High-Low))/255;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -