www.pudn.com > Face3DModel.zip > Face3DModelDlg.cpp


               // Face3DModelDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "Face3DModel.h" 
#include "Face3DModelDlg.h" 
#include "SelectMarkerDlg.h" 
#include "CornerMatchTestDlg.h" 
#include "PoseRecoveryTestDlg.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
#define THUMB_WIDTH   320 
#define BUTTON_HEIGHT 60 
///////////////////////////////////////////////////////////////////////////// 
// CFace3DModelDlg dialog 
 
CFace3DModelDlg::CFace3DModelDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CFace3DModelDlg::IDD, pParent) 
    , m_pBmpSnap1(NULL) 
    , m_pBmpSnap2(NULL) 
    , m_pVideoSource(NULL) 
{ 
	//{{AFX_DATA_INIT(CFace3DModelDlg) 
		// NOTE: the ClassWizard will add member initialization here 
	//}}AFX_DATA_INIT 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
    memset(&m_bmpInfoHeader, 0, sizeof(BITMAPINFOHEADER)); 
    m_bmpInfoHeader.biSize = sizeof(BITMAPINFOHEADER); 
    m_bmpInfoHeader.biBitCount =24; 
    m_bmpInfoHeader.biWidth = 640; 
    m_bmpInfoHeader.biHeight = 480; 
    m_bmpInfoHeader.biPlanes = 1; 
    m_bmpInfoHeader.biCompression = BI_RGB; 
} 
 
void CFace3DModelDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CFace3DModelDlg) 
		// NOTE: the ClassWizard will add DDX and DDV calls here 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CFace3DModelDlg, CDialog) 
	//{{AFX_MSG_MAP(CFace3DModelDlg) 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_WM_ERASEBKGND() 
	ON_BN_CLICKED(IDC_CONTROL_CAPTURE, OnControlCapture) 
	ON_WM_DESTROY() 
    ON_COMMAND(ID_CAMERA_VIDEO_SOURCE, OnCameraVideoSource) 
	ON_COMMAND(ID_CAMERA_VIDEO_FORMAT, OnCameraVideoFormat) 
	ON_WM_TIMER() 
	ON_BN_CLICKED(IDC_SNAP_FIRST, OnSnapFirst) 
	ON_BN_CLICKED(IDC_SNAP_SECOND, OnSnapSecond) 
	ON_BN_CLICKED(IDC_SELECT_MARKER_FIRST, OnSelectMarkerFirst) 
	ON_BN_CLICKED(IDC_SELECT_MARKER_SECOND, OnSelectMarkerSecond) 
	ON_COMMAND(ID_CAMERA_CONNECT, OnCameraConnect) 
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen) 
	ON_UPDATE_COMMAND_UI(ID_CAMERA_VIDEO_FORMAT, OnUpdateCameraVideoFormat) 
	ON_UPDATE_COMMAND_UI(ID_CAMERA_VIDEO_SOURCE, OnUpdateCameraVideoSource) 
	ON_UPDATE_COMMAND_UI(ID_CAMERA_CONNECT, OnUpdateCameraConnect) 
	ON_BN_CLICKED(IDC_CORNER_DETECT, OnCornerDetect) 
	ON_BN_CLICKED(IDC_POSE_RECOVERY, OnPoseRecovery) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CFace3DModelDlg message handlers 
 
BOOL CFace3DModelDlg::OnInitDialog() 
{ 
	CDialog::OnInitDialog(); 
 
	SetIcon(m_hIcon, TRUE);			// Set big icon 
	SetIcon(m_hIcon, FALSE);		// Set small icon 
 
	return TRUE;  // return TRUE  unless you set the focus to a control 
} 
 
// If you add a minimize button to your dialog, you will need the code below 
//  to draw the icon.  For MFC applications using the document/view model, 
//  this is automatically done for you by the framework. 
 
void CFace3DModelDlg::OnPaint()  
{ 
	if (IsIconic()) 
	{ 
		CPaintDC dc(this); // device context for painting 
 
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); 
 
		// Center icon in client rectangle 
		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; 
 
		// Draw the icon 
		dc.DrawIcon(x, y, m_hIcon); 
	} 
	else 
	{ 
        CPaintDC dc(this); 
		RECT rect; 
		GetClientRect(&rect); 
        int oldMode = SetStretchBltMode(dc.m_hDC, COLORONCOLOR); 
 
        if (m_pBmpSnap1 != NULL) 
        { 
            RECT rcIn = rect; 
            rcIn.left = rect.right - THUMB_WIDTH; 
            rcIn.bottom = (rect.bottom - BUTTON_HEIGHT) / 2; 
            RECT rcOut = rcIn; 
            ComputeRenderRect(rcIn, rcOut, m_bmpInfoHeader.biWidth, m_bmpInfoHeader.biHeight); 
            StretchDIBits(dc.m_hDC, 
                rcOut.left, rcOut.top, rcOut.right - rcOut.left, rcOut.bottom - rcOut.top, 
                0, 0, m_bmpInfoHeader.biWidth, m_bmpInfoHeader.biHeight, 
                m_pBmpSnap1, 
                reinterpret_cast(&m_bmpInfoHeader), 
                DIB_RGB_COLORS, 
                SRCCOPY); 
        } 
        if (m_pBmpSnap2 != NULL) 
        { 
            RECT rcIn = rect; 
            rcIn.left = rect.right - THUMB_WIDTH; 
            rcIn.top = (rect.bottom - BUTTON_HEIGHT) / 2; 
            rcIn.bottom = rect.bottom - BUTTON_HEIGHT; 
            RECT rcOut = rcIn; 
            ComputeRenderRect(rcIn, rcOut, m_bmpInfoHeader.biWidth, m_bmpInfoHeader.biHeight); 
            StretchDIBits(dc.m_hDC, 
                rcOut.left, rcOut.top, rcOut.right - rcOut.left, rcOut.bottom - rcOut.top, 
                0, 0, m_bmpInfoHeader.biWidth, m_bmpInfoHeader.biHeight, 
                m_pBmpSnap2, 
                reinterpret_cast(&m_bmpInfoHeader), 
                DIB_RGB_COLORS, 
                SRCCOPY); 
        } 
        SetStretchBltMode(dc.m_hDC, oldMode); 
 
		CDialog::OnPaint(); 
	} 
} 
 
HCURSOR CFace3DModelDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
 
BOOL CFace3DModelDlg::OnEraseBkgnd(CDC* pDC)  
{	 
	return CDialog::OnEraseBkgnd(pDC); 
    //return TRUE; 
} 
 
void CFace3DModelDlg::OnControlCapture()  
{ 
    if (m_pVideoSource != NULL) 
    { 
        if (State_Stopped == m_pVideoSource->GetState()) 
        { 
            if (TRUE == m_pVideoSource->Run()) 
            { 
                GetDlgItem(IDC_CONTROL_CAPTURE)->SetWindowText(_T("Stop Capture")); 
            } 
        } 
        else 
        { 
            if (TRUE == m_pVideoSource->Stop()) 
            { 
                GetDlgItem(IDC_CONTROL_CAPTURE)->SetWindowText(_T("Start Capture")); 
            } 
        } 
    } 
} 
 
void CFace3DModelDlg::OnDestroy()  
{ 
    if (m_pBmpSnap1 != NULL) 
    { 
        delete [] m_pBmpSnap1; 
        m_pBmpSnap1 = NULL; 
    } 
    if (m_pBmpSnap2 != NULL) 
    { 
        delete [] m_pBmpSnap2; 
        m_pBmpSnap2 = NULL; 
    } 
	CDialog::OnDestroy(); 
} 
 
void CFace3DModelDlg::OnCameraVideoSource() 
{ 
    if (m_pVideoSource == &m_videoCamera) 
    { 
        LONG nState = m_videoCamera.GetState(); 
        m_videoCamera.Stop(); 
        m_videoCamera.OnCameraVideoSource(); 
        LONG nWidth, nHeight; 
        if (SUCCEEDED(m_videoCamera.GetSize(&nWidth, &nHeight))) 
        { 
            RECT rcIn; 
            GetClientRect(&rcIn); 
            rcIn.right -= THUMB_WIDTH; 
            rcIn.bottom -= BUTTON_HEIGHT; 
            RECT rcOut = rcIn; 
            ComputeRenderRect(rcIn, rcOut, nWidth, nHeight); 
            m_videoCamera.SetVideoWindow(GetSafeHwnd(), 
                rcOut.left, rcOut.top, rcOut.right - rcOut.left, rcOut.bottom - rcOut.top); 
        } 
        switch (nState) 
        { 
        case State_Stopped: 
            m_videoCamera.Stop(); 
            break; 
        case State_Paused: 
            m_videoCamera.Pause(); 
            break; 
        case State_Running: 
            m_videoCamera.Run(); 
            break; 
        } 
    } 
} 
 
void CFace3DModelDlg::OnCameraVideoFormat()  
{ 
    if (m_pVideoSource == &m_videoCamera) 
    { 
        m_videoCamera.OnCameraVideoFormat(); 
    } 
} 
 
void CFace3DModelDlg::OnTimer(UINT nIDEvent)  
{	 
	CDialog::OnTimer(nIDEvent); 
} 
 
void CFace3DModelDlg::OnSnapFirst()  
{ 
    if (m_pVideoSource != NULL && State_Running == m_pVideoSource->GetState()) 
    { 
        long nDibLength = m_bmpInfoHeader.biWidth * m_bmpInfoHeader.biHeight * 3; 
	    if (m_pBmpSnap1 != NULL) 
        { 
            delete [] m_pBmpSnap1; 
            m_pBmpSnap1 = NULL; 
        } 
        m_pBmpSnap1 = new BYTE[nDibLength]; // dib for 640*480 24bits bitmap 
        if (FALSE == m_pVideoSource->GetCurrentBuffer(&nDibLength, (long *)m_pBmpSnap1)) 
        { 
            delete [] m_pBmpSnap1; 
            m_pBmpSnap1 = NULL; 
            MessageBox(_T("Failed to Snap First Bitmap!")); 
        } 
        Invalidate(); 
    } 
} 
 
void CFace3DModelDlg::OnSnapSecond()  
{ 
    if (m_pVideoSource != NULL && State_Running == m_pVideoSource->GetState()) 
    { 
        long nDibLength = m_bmpInfoHeader.biWidth * m_bmpInfoHeader.biHeight * 3; 
	    if (m_pBmpSnap2 != NULL) 
        { 
            delete [] m_pBmpSnap2; 
            m_pBmpSnap2 = NULL; 
        } 
        m_pBmpSnap2 = new BYTE[nDibLength]; // dib for 640*480 24bits bitmap 
        if (FALSE == m_pVideoSource->GetCurrentBuffer(&nDibLength, (long *)m_pBmpSnap2)) 
        { 
            delete [] m_pBmpSnap2; 
            m_pBmpSnap2 = NULL; 
            MessageBox(_T("Failed to Snap Second Bitmap!")); 
        } 
        Invalidate(); 
    } 
} 
 
void CFace3DModelDlg::OnSelectMarkerFirst()  
{ 
    if (m_pBmpSnap1 != NULL) 
    { 
        CSelectMarkerDlg dlg; 
        dlg.SetSnapBitmap(&m_bmpInfoHeader, m_pBmpSnap1); 
        if (dlg.DoModal() == IDOK) 
        { 
        } 
    } 
} 
 
void CFace3DModelDlg::OnSelectMarkerSecond()  
{ 
    if (m_pBmpSnap2 != NULL) 
    { 
        CSelectMarkerDlg dlg; 
        dlg.SetSnapBitmap(&m_bmpInfoHeader, m_pBmpSnap2); 
        if (dlg.DoModal() == IDOK) 
        { 
        } 
    } 
} 
 
void CFace3DModelDlg::OnCameraConnect()  
{ 
    if (m_pVideoSource != NULL && m_pVideoSource->IsConnect()) 
    { 
        m_pVideoSource->Disconnect(); 
        m_pVideoSource = NULL; 
    } 
    if (m_videoCamera.Connect()) 
    { 
        if (FAILED(m_videoCamera.GetSize(&m_bmpInfoHeader.biWidth, &m_bmpInfoHeader.biHeight))) 
        { 
            m_bmpInfoHeader.biWidth = 320; 
            m_bmpInfoHeader.biHeight = 240; 
        } 
        RECT rcIn; 
        GetClientRect(&rcIn); 
        rcIn.right -= THUMB_WIDTH; 
        rcIn.bottom -= BUTTON_HEIGHT; 
        RECT rcOut = rcIn; 
        ComputeRenderRect(rcIn, rcOut, m_bmpInfoHeader.biWidth, m_bmpInfoHeader.biHeight); 
        m_videoCamera.SetVideoWindow(GetSafeHwnd(), 
            rcOut.left, rcOut.top, rcOut.right - rcOut.left, rcOut.bottom - rcOut.top); 
        m_videoCamera.Run(); 
        m_pVideoSource = &m_videoCamera; 
        GetDlgItem(IDC_CONTROL_CAPTURE)->SetWindowText(_T("Stop Capture")); 
    } 
    else 
    { 
        MessageBox(_T("No Camera is found, Please connect a camera!")); 
    } 
} 
 
void CFace3DModelDlg::OnFileOpen()  
{ 
    if (m_pVideoSource != NULL && m_pVideoSource->IsConnect()) 
    { 
        m_pVideoSource->Disconnect(); 
        m_pVideoSource = NULL; 
    } 
    if (m_videoFile.Connect()) 
    { 
        if (FAILED(m_videoFile.GetSize(&m_bmpInfoHeader.biWidth, &m_bmpInfoHeader.biHeight))) 
        { 
            m_bmpInfoHeader.biWidth = 320; 
            m_bmpInfoHeader.biHeight = 240; 
        } 
        RECT rcIn; 
        GetClientRect(&rcIn); 
        rcIn.right -= THUMB_WIDTH; 
        rcIn.bottom -= BUTTON_HEIGHT; 
        RECT rcOut = rcIn; 
        ComputeRenderRect(rcIn, rcOut, m_bmpInfoHeader.biWidth, m_bmpInfoHeader.biHeight); 
        m_videoFile.SetVideoWindow(GetSafeHwnd(), 
            rcOut.left, rcOut.top, rcOut.right - rcOut.left, rcOut.bottom - rcOut.top); 
        m_videoFile.Run(); 
        m_pVideoSource = &m_videoFile; 
        GetDlgItem(IDC_CONTROL_CAPTURE)->SetWindowText(_T("Stop Capture")); 
    } 
    else 
    { 
        MessageBox(_T("No File is Opened or Unsupported File, Please Select another File!")); 
    } 
} 
 
void CFace3DModelDlg::OnUpdateCameraVideoFormat(CCmdUI* pCmdUI)  
{ 
    pCmdUI->Enable(m_pVideoSource == &m_videoCamera && m_videoCamera.IsConnect()); 
} 
 
void CFace3DModelDlg::OnUpdateCameraVideoSource(CCmdUI* pCmdUI)  
{ 
    pCmdUI->Enable(m_pVideoSource == &m_videoCamera && m_videoCamera.IsConnect());	 
} 
 
void CFace3DModelDlg::OnUpdateCameraConnect(CCmdUI* pCmdUI)  
{ 
    pCmdUI->Enable(FALSE == m_videoCamera.IsConnect()); 
} 
 
void CFace3DModelDlg::OnCornerDetect()  
{ 
	CCornerMatchTestDlg dlg; 
    if (m_pBmpSnap1 != NULL && m_pBmpSnap2 != NULL) 
    { 
        dlg.SetBitmap1(m_bmpInfoHeader, m_pBmpSnap1, NULL); 
        dlg.SetBitmap2(m_bmpInfoHeader, m_pBmpSnap2, NULL); 
    } 
    dlg.DoModal(); 
	 
} 
 
void CFace3DModelDlg::ComputeRenderRect(RECT &rcIn, RECT &rcOut, int width, int height) 
{ 
    int nInWidth = rcIn.right - rcIn.left; 
    int nInHeight = rcIn.bottom - rcIn.top; 
    if (nInWidth >= width && nInWidth >= height) 
    { 
        rcOut.left = rcIn.left + (nInWidth - width) / 2; 
        rcOut.right = rcOut.left + width; 
        rcOut.top = rcIn.top + (nInHeight - height) / 2; 
        rcOut.bottom = rcOut.top + height; 
    } 
    else if (width * nInHeight >= height * nInWidth) 
    { 
        rcOut.left = rcIn.left; 
        rcOut.right = rcIn.right; 
        int nOutHeight = height * nInWidth / width; 
        rcOut.top = rcIn.top + (nInHeight - nOutHeight) / 2; 
        rcOut.bottom = rcOut.top + nOutHeight; 
    } 
    else 
    { 
        rcOut.top = rcIn.top; 
        rcOut.bottom = rcIn.bottom; 
        int nOutWidth = width * nInHeight / height; 
        rcOut.left = rcIn.left + (nInWidth - nOutWidth) / 2; 
        rcOut.right = rcOut.left + nOutWidth; 
    } 
} 
 
void CFace3DModelDlg::OnPoseRecovery()  
{ 
	CPoseRecoveryTestDlg dlg; 
    if (m_pBmpSnap1 != NULL && m_pBmpSnap2 != NULL) 
    { 
        dlg.SetBitmap1(m_bmpInfoHeader, m_pBmpSnap1); 
        dlg.SetBitmap2(m_bmpInfoHeader, m_pBmpSnap2); 
    } 
    dlg.DoModal();	 
}