VS2013+MFC+OPENCV人脸识别考勤软件

来源:互联网 发布:淘宝加入购物车代码 编辑:程序博客网 时间:2024/04/27 13:56

这里写图片描述

// 人脸识别考勤软件Dlg.cpp : 实现文件
//

include “stdafx.h”

include “afxwin.h”

include “人脸识别考勤软件.h”

include “人脸识别考勤软件Dlg.h”

include “afxdialogex.h”

include “resource.h”

ifdef _DEBUG

define new DEBUG_NEW

endif

include “opencv2/objdetect/objdetect.hpp”

include “opencv2/highgui/highgui.hpp”

include “opencv2/imgproc/imgproc.hpp”

include

include

include

include “highgui.h”

include

include

// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
using namespace std;
using namespace cv;
Mat image2, frame;
std::vector faces;
CascadeClassifier face_cascade;
Ptr modelPCA = createEigenFaceRecognizer();

VideoCapture capture;
double fx, fy, fw, fh;
int predictFisher, predictPCA, predictLBP;
COLORREF m_bkcolor1 RGB(207, 210, 210), m_bkcolor2 RGB(207, 210, 210), m_bkcolor3 RGB(207, 210, 210), m_bkcolor4 RGB(207, 210, 210), m_bkcolor5 RGB(207, 210, 210), m_bkcolor6 RGB(207, 210, 210), m_bkcolor7 RGB(207, 210, 210), m_bkcolor8 RGB(207, 210, 210);
void detectAndDisplay(Mat frame);
String face_cascade_name = “haarcascade_frontalface_alt.xml”;
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();

// 对话框数据
enum { IDD = IDD_ABOUTBOX };

protected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()

// C人脸识别考勤软件Dlg 对话框

C人脸识别考勤软件Dlg::C人脸识别考勤软件Dlg(CWnd* pParent /=NULL/)
: CDialogEx(C人脸识别考勤软件Dlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void C人脸识别考勤软件Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(C人脸识别考勤软件Dlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(StartWatch, &C人脸识别考勤软件Dlg::OnBnClickedStartwatch)
ON_BN_CLICKED(IDC_BUTTON2, &C人脸识别考勤软件Dlg::OnBnClickedButton2)
ON_BN_CLICKED(IDC_BUTTON3, &C人脸识别考勤软件Dlg::OnBnClickedButton3)
ON_WM_CTLCOLOR()
END_MESSAGE_MAP()

// C人脸识别考勤软件Dlg 消息处理程序

BOOL C人脸识别考勤软件Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();

// 将“关于...”菜单项添加到系统菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){    BOOL bNameValid;    CString strAboutMenu;    bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);    ASSERT(bNameValid);    if (!strAboutMenu.IsEmpty())    {        pSysMenu->AppendMenu(MF_SEPARATOR);        pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);    }}// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动//  执行此操作SetIcon(m_hIcon, TRUE);         // 设置大图标SetIcon(m_hIcon, FALSE);        // 设置小图标// TODO:  在此添加额外的初始化代码return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE

}

void C人脸识别考勤软件Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。

void C人脸识别考勤软件Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文

    SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);    // 使图标在工作区矩形中居中    int cxIcon = GetSystemMetrics(SM_CXICON);    int cyIcon = GetSystemMetrics(SM_CYICON);    CRect rect;    GetClientRect(&rect);    int x = (rect.Width() - cxIcon + 1) / 2;    int y = (rect.Height() - cyIcon + 1) / 2;    // 绘制图标    dc.DrawIcon(x, y, m_hIcon);}else{    CDialogEx::OnPaint();}

}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR C人脸识别考勤软件Dlg::OnQueryDragIcon()
{
return static_cast(m_hIcon);
}

void C人脸识别考勤软件Dlg::OnBnClickedStartwatch()
{

    // TODO:  在此添加控件通知处理程序代码    capture=0;    namedWindow("view", WINDOW_AUTOSIZE);    HWND hWnd = (HWND)cvGetWindowHandle("view");    HWND hParent = ::GetParent(hWnd);    ::SetParent(hWnd, GetDlgItem(face_picture)->m_hWnd);    ::ShowWindow(hParent, SW_HIDE);//隐藏运行程序框,并且把它“画”到MFC上    if (!face_cascade.load(face_cascade_name)){ printf("--(!)Error loading\n"); };    modelPCA->load("PCA.xml");    if (capture.isOpened())    {        for (;;)        {            capture >> frame;            if (!frame.empty())            {                detectAndDisplay(frame);                imshow("view", frame);                UpdateData(FALSE);            }            else            {                printf(" --(!) No captured frame -- Break!"); break;            }            waitKey(1);        }    }

}

void detectAndDisplay(Mat frame){    Mat frame_gray;    cvtColor(frame, frame_gray, COLOR_BGR2GRAY);    equalizeHist(frame_gray, frame_gray);    face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(80, 80));    for (size_t i = 0; i < faces.size(); i++)    {        Point center1(faces[i].x-20, faces[i].y-20);        Point center2(faces[i].x + faces[i].width+20, faces[i].y + faces[i].height+20);        cv::rectangle(frame, center1, center2, Scalar(255, 0, 255), 2, 8, 0);        fx = faces[i].x;        fy = faces[i].y;        fw = faces[i].width;        fh = faces[i].height;    }

}

void C人脸识别考勤软件Dlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
//cvReleaseCaputre(&capture);
if (capture.isOpened()){ capture.release(); }
CDialogEx::OnCancel();
}

void C人脸识别考勤软件Dlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
Rect rect(fx, fy, fw, fh);
Mat roi = frame(rect);
int myP, myL, myF;
Size dsize = Size(92, 112);
image2 = Mat(dsize, CV_32S);
resize(roi, image2, dsize);
char* outImageName2 = “test26.jpg”;
imwrite(outImageName2, image2);

Mat testImage = imread("test26.jpg", 0);predictPCA = modelPCA->predict(testImage);switch (predictPCA){case 41: myP = 1; break;case 42: myP = 2; break;case 43: myP = 3; break;case 44: myP = 4; break;case 45: myP = 5; break;case 46: myP = 6; break;case 47: myP = 7; break;case 48: myP = 8; break;}if (  myP == 1 ){   m_bkcolor1 = RGB(251, 251, 36); GetDlgItem(IDC_STATIC1)->InvalidateRect(NULL);}else if ( myP == 2 ){   m_bkcolor2 = RGB(251, 251, 36); GetDlgItem(IDC_STATIC2)->InvalidateRect(NULL);}else if ( myP == 3 ){   m_bkcolor3 = RGB(251, 251, 36); GetDlgItem(IDC_STATIC3)->InvalidateRect(NULL);}else if (  myP ==4 ){   m_bkcolor4 = RGB(251, 251, 36); GetDlgItem(IDC_STATIC4)->InvalidateRect(NULL);}    else if ( myP == 5 ){   m_bkcolor5 = RGB(251, 251, 36); GetDlgItem(IDC_STATIC5)->InvalidateRect(NULL);}    else if ( myP == 6 ){   m_bkcolor6 = RGB(251, 251, 36); GetDlgItem(IDC_STATIC6)->InvalidateRect(NULL);}else if ( myP == 7 ){   m_bkcolor7 = RGB(251, 251, 36); GetDlgItem(IDC_STATIC7)->InvalidateRect(NULL);}    else if ( myP == 8 ){   m_bkcolor8 = RGB(251, 251, 36); GetDlgItem(IDC_STATIC8)->InvalidateRect(NULL);}else{ MessageBox(_T("识别失败,请正面看镜头或者打开闪光灯")); }

}

HBRUSH C人脸识别考勤软件Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
static CBrush gBr;
static bool isInited = false;

// TODO:  在此更改 DC 的任何特性if (pWnd->GetDlgCtrlID() == IDC_STATIC1)  { pDC->SetBkColor(m_bkcolor1); }if (pWnd->GetDlgCtrlID() == IDC_STATIC2)  { pDC->SetBkColor(m_bkcolor2); }if (pWnd->GetDlgCtrlID() == IDC_STATIC3)  { pDC->SetBkColor(m_bkcolor3); }if (pWnd->GetDlgCtrlID() == IDC_STATIC4)  { pDC->SetBkColor(m_bkcolor4); }if (pWnd->GetDlgCtrlID() == IDC_STATIC5)  { pDC->SetBkColor(m_bkcolor5); }if (pWnd->GetDlgCtrlID() == IDC_STATIC6)  { pDC->SetBkColor(m_bkcolor6); }if (pWnd->GetDlgCtrlID() == IDC_STATIC7)  { pDC->SetBkColor(m_bkcolor7); }if (pWnd->GetDlgCtrlID() == IDC_STATIC8)  { pDC->SetBkColor(m_bkcolor8); }

if(!isInited)
{
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
gBr.CreatePatternBrush(&bitmap);
COLORREF clearColor = -1;
bitmap.DeleteObject();
isInited = true;
}
if (pWnd == this)
{
pDC->SetBkMode(TRANSPARENT);
return gBr; //主窗口背景使用这个背景刷

}// TODO:  如果默认的不是所需画笔,则返回另一个画笔return (HBRUSH)::GetStockObject(5); //其他控件使用透明背景

}

0 0
原创粉丝点击