www.pudn.com > ImageCheck.rar > ImageCheckDlg.cpp
// ImageCheckDlg.cpp : implementation file
//
#include "stdafx.h"
#include "ImageCheck.h"
#include "ImageCheckDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
BOOL bIsPlay = FALSE;
void ThreadPlaySound(LPVOID lParam)
{
if (bIsPlay)
{
//确保声音不重复播放
return;
}
bIsPlay = TRUE;
UINT nID = (UINT)lParam;
PlaySound(MAKEINTRESOURCE(nID),GetModuleHandle(NULL), SND_RESOURCE);
bIsPlay = FALSE;
}
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CImageCheckDlg dialog
CImageCheckDlg::CImageCheckDlg(CWnd* pParent /*=NULL*/)
: CDialog(CImageCheckDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CImageCheckDlg)
m_strInterval = _T("1000");
m_strThresholdArea = _T("10.0");
m_strThresholdMax = _T("230");
m_strThresholdMin = _T("30");
m_bCheckFilter = TRUE;
m_bCheckGray = TRUE;
m_bSaveImage = TRUE;
m_bSound = TRUE;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_bIsAuto = FALSE;
m_strAppPath = "";
m_dwLastSaveTime = 0;
}
void CImageCheckDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CImageCheckDlg)
DDX_Control(pDX, IDC_RECT_OBJECT, m_rectObject);
DDX_Control(pDX, IDC_RECT_BACKGROUND, m_rectBackGround);
DDX_Control(pDX, IDC_STATIC_PREVIEW, m_staPreview);
DDX_Control(pDX, IDC_STATIC_OPERATE, m_staOperate);
DDX_Control(pDX, IDC_STATIC_BACKGROUND, m_staBackGround);
DDX_Control(pDX, IDC_STATIC_OBJECT, m_staObject);
DDX_Text(pDX, IDC_EDIT_INTERVAL, m_strInterval);
DDX_Text(pDX, IDC_EDIT_THRESHOLD_AREA, m_strThresholdArea);
DDX_Text(pDX, IDC_EDIT_THRESHOLD_MAX, m_strThresholdMax);
DDX_Text(pDX, IDC_EDIT_THRESHOLD_MIN, m_strThresholdMin);
DDX_Check(pDX, IDC_CHECK_FILTER, m_bCheckFilter);
DDX_Check(pDX, IDC_CHECK_GRAY, m_bCheckGray);
DDX_Check(pDX, IDC_CHECK_SAVE_IMAGE, m_bSaveImage);
DDX_Check(pDX, IDC_CHECK_SOUND, m_bSound);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CImageCheckDlg, CDialog)
//{{AFX_MSG_MAP(CImageCheckDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BTN_PREVIEW_START, OnBtnPreviewStart)
ON_WM_SIZE()
ON_BN_CLICKED(IDC_BTN_GET_BG, OnBtnGetBg)
ON_BN_CLICKED(IDC_BTN_GET_OBJECT, OnBtnGetObject)
ON_BN_CLICKED(IDC_BTN_SUBTRACT, OnBtnSubtract)
ON_BN_CLICKED(IDC_BTN_SAVE_OBJECT, OnBtnSaveObject)
ON_BN_CLICKED(IDC_BTN_AUTO, OnBtnAuto)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_BTN_PREVIEW_STOP, OnBtnPreviewStop)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CImageCheckDlg message handlers
BOOL CImageCheckDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
char szPath[MAX_PATH];
GetCurrentDirectory(MAX_PATH,szPath);
m_strAppPath.Format("%s",szPath);
m_strAppPath.TrimRight("\\");
CRect rt;
GetClientRect(&rt);
rt.right -= 100;
m_caiDX.Create(NULL,"CaiDX",WS_CHILD|WS_VISIBLE,rt,this,9999);
SetLayout();
return TRUE; // return TRUE unless you set the focus to a control
}
void CImageCheckDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// 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 CImageCheckDlg::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
{
CDialog::OnPaint();
CRect rt;
m_rectBackGround.GetClientRect(&rt);
HDC hdc = ::GetDC(m_rectBackGround.GetSafeHwnd());
m_imgBackGround.DrawImg(hdc,rt);
if (!m_bIsAuto)
{
m_rectObject.GetClientRect(&rt);
hdc = ::GetDC(m_rectObject.GetSafeHwnd());
m_imgObject.DrawImg(hdc,rt);
}
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CImageCheckDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CImageCheckDlg::OnOK()
{
// TODO: Add extra validation here
CDialog::OnOK();
}
void CImageCheckDlg::OnCancel()
{
// TODO: Add extra cleanup here
CDialog::OnCancel();
}
void CImageCheckDlg::OnBtnPreviewStart()
{
if(!m_caiDX.StartPreview())
{
AfxMessageBox("连接采集设备失败!");
}
}
void CImageCheckDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
SetLayout();
}
void CImageCheckDlg::SetLayout()
{
CRect rt;
GetClientRect(&rt);
CRect rtCtrl;
if (m_staOperate.GetSafeHwnd())
{
rtCtrl = rt;
rtCtrl.right -= rt.Width() / 2 + 5;
rtCtrl.bottom -= rt.Height() / 2 + 5;
m_staOperate.SetWindowPos(NULL,rtCtrl.left,rtCtrl.top,rtCtrl.Width(),rtCtrl.Height(),SWP_FRAMECHANGED);
}
if (m_staPreview.GetSafeHwnd())
{
rtCtrl = rt;
rtCtrl.left += rt.Width() / 2 + 5;
rtCtrl.bottom -= rt.Height() / 2 + 5;
m_staPreview.SetWindowPos(NULL,rtCtrl.left,rtCtrl.top,rtCtrl.Width(),rtCtrl.Height(),SWP_FRAMECHANGED);
if (m_caiDX.GetSafeHwnd())
{
rtCtrl.DeflateRect(5,15,5,5);
m_caiDX.SetWindowPos(NULL,rtCtrl.left,rtCtrl.top,rtCtrl.Width(),rtCtrl.Height(),SWP_FRAMECHANGED);
}
}
if (m_staBackGround.GetSafeHwnd())
{
rtCtrl = rt;
rtCtrl.right -= rt.Width() / 2 + 5;
rtCtrl.top += rt.Height() / 2 + 5;
m_staBackGround.SetWindowPos(NULL,rtCtrl.left,rtCtrl.top,rtCtrl.Width(),rtCtrl.Height(),SWP_FRAMECHANGED);
if (m_rectBackGround.GetSafeHwnd())
{
rtCtrl.DeflateRect(5,15,5,5);
m_rectBackGround.SetWindowPos(NULL,rtCtrl.left,rtCtrl.top,rtCtrl.Width(),rtCtrl.Height(),SWP_FRAMECHANGED);
}
}
if (m_staObject.GetSafeHwnd())
{
rtCtrl = rt;
rtCtrl.left += rt.Width() / 2 + 5;
rtCtrl.top += rt.Height() / 2 + 5;
m_staObject.SetWindowPos(NULL,rtCtrl.left,rtCtrl.top,rtCtrl.Width(),rtCtrl.Height(),SWP_FRAMECHANGED);
if (m_rectObject.GetSafeHwnd())
{
rtCtrl.DeflateRect(5,15,5,5);
m_rectObject.SetWindowPos(NULL,rtCtrl.left,rtCtrl.top,rtCtrl.Width(),rtCtrl.Height(),SWP_FRAMECHANGED);
}
}
}
void CImageCheckDlg::OnBtnGetBg()
{
UpdateData(TRUE);
BYTE* pBuf = NULL;
LONG nWidth = 0;
LONG nHeight = 0;
int nBitCount = 0;
DWORD dwDibWidthBytes;
if (!m_caiDX.GetImage(&pBuf,nWidth,nHeight,nBitCount))
{
return;
}
dwDibWidthBytes = (((nWidth * 24 + 31) / 32) * 4);
if(!m_imgBackGround.CreateFromArray(pBuf,nWidth,nHeight,nBitCount,dwDibWidthBytes,FALSE))
{
return;
}
if (m_bCheckGray)
{
m_imgBackGround.ToGray();
}
if (m_bCheckFilter)
{
m_imgBackGround.Median(3);
}
CRect rt;
m_rectBackGround.GetClientRect(&rt);
HDC hdc = ::GetDC(m_rectBackGround.GetSafeHwnd());
m_imgBackGround.DrawImg(hdc,rt);
}
void CImageCheckDlg::OnBtnGetObject()
{
UpdateData(TRUE);
BYTE* pBuf = NULL;
LONG nWidth = 0;
LONG nHeight = 0;
int nBitCount = 0;
DWORD dwDibWidthBytes;
if (!m_caiDX.GetImage(&pBuf,nWidth,nHeight,nBitCount))
{
return;
}
dwDibWidthBytes = (((nWidth * 24 + 31) / 32) * 4);
if(!m_imgObject.CreateFromArray(pBuf,nWidth,nHeight,nBitCount,dwDibWidthBytes,FALSE))
{
return;
}
if (m_bSaveImage)
{
m_imgForSave.CopyImg(&m_imgObject);
}
if (m_bCheckGray)
{
m_imgObject.ToGray();
}
if (m_bCheckFilter)
{
m_imgObject.Median(3);
}
if (!m_bIsAuto)
{
CRect rt;
HDC hdc ;
m_rectObject.GetClientRect(&rt);
hdc = ::GetDC(m_rectObject.GetSafeHwnd());
m_imgObject.DrawImg(hdc,rt);
}
}
void CImageCheckDlg::OnBtnSubtract()
{
UpdateData(TRUE);
int nThresholdMin = atoi(m_strThresholdMin);
int nThresholdMax = atoi(m_strThresholdMax);
DOUBLE dbArea = atof(m_strThresholdArea);
LONG nCount = 0;
RGBQUAD rgbA;
RGBQUAD rgbB;
for(LONG i=0;inThresholdMax) //230
{
rgbA.rgbBlue = 255;
rgbA.rgbGreen = 255;
rgbA.rgbRed = 255;
}
else
{
rgbA.rgbBlue = 0;
rgbA.rgbGreen = 0;
rgbA.rgbRed = 0;
nCount ++;
}
m_imgObject.SetPixel(j,i,rgbA);
}
}
// m_imgObject.Median(3);
CRect rt;
HDC hdc ;
m_rectObject.GetClientRect(&rt);
hdc = ::GetDC(m_rectObject.GetSafeHwnd());
m_imgObject.DrawImg(hdc,rt);
CString strTmp;
DOUBLE dbLike = 0;
dbLike = nCount*100/(DOUBLE)(m_imgObject.GetWidth()*m_imgObject.GetHeight());
strTmp.Format("物体面积: %.2f%% ",dbLike);
if (dbLike>dbArea) //10
{
if (m_bSound)
{
PlayWave(IDR_WAVE_WELCOME);
}
if (m_bSaveImage)
{
if (m_dwLastSaveTime-GetTickCount()>=5000)
{
OnBtnSaveObject();
m_dwLastSaveTime = GetTickCount();
}
}
//AfxMessageBox(strTmp);
strTmp += "有人来了!!!";
}
SetWindowText(strTmp);
}
void CImageCheckDlg::OnBtnSaveObject()
{
CString strTmp;
COleDateTime dt=COleDateTime::GetCurrentTime();
strTmp.Format("%s\\%#.4d-%#.2d-%#.2d-%#.2d-%#.2d-%#.2d-%d.bmp",m_strAppPath,
dt.GetYear(),dt.GetMonth(),dt.GetDay(),dt.GetHour(),dt.GetMinute(),dt.GetSecond(),rand());
m_imgForSave.SaveImg(strTmp);
}
void CImageCheckDlg::OnBtnAuto()
{
UpdateData(TRUE);
int nInterval = atoi(m_strInterval);
if (m_bIsAuto)
{
KillTimer(1);
SetWindowText("运动人体目标检测");
}
else
{
SetTimer(1,nInterval,NULL);
}
m_bIsAuto =!m_bIsAuto;
}
void CImageCheckDlg::OnTimer(UINT nIDEvent)
{
if (nIDEvent==1)
{
OnBtnGetObject();
OnBtnSubtract();
}
CDialog::OnTimer(nIDEvent);
}
void CImageCheckDlg::PlayWave(UINT nID)
{
AfxBeginThread(AFX_THREADPROC(ThreadPlaySound),(LPVOID)nID);
}
void CImageCheckDlg::OnBtnPreviewStop()
{
m_caiDX.StopPreview();
}