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();
}