⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spdlg.cpp

📁 基于图象理解的汽车牌照自动识别系统是智能交通系统(ITS)的一个重要分支
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// spDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Splash.h"
#include "sp.h"
#include "spDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CDib m_dib;
int Flag=-1;   //各个按钮的标志位
int Ispre=0;
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

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

/////////////////////////////////////////////////////////////////////////////
// CSpDlg dialog

CSpDlg::CSpDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSpDlg::IDD, pParent)
{
	m_ipzLeft=0;
	m_ipzRight=0;
	m_ipzBottom=0;
	m_ipzTop=0;
	//{{AFX_DATA_INIT(CSpDlg)
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CSpDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSpDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CSpDlg, CDialog)
//{{AFX_MSG_MAP(CSpDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_CTLCOLOR()
ON_BN_CLICKED(IDC_BUTTON1, OnBuHuo)
ON_BN_CLICKED(IDC_BUTTON2, OnTruecolorToGray)
ON_BN_CLICKED(IDC_BUTTON3, OnTwoValue)
ON_BN_CLICKED(IDC_BUTTON4, OnWeakenBG)
ON_BN_CLICKED(IDC_BUTTON5, OnMedianFilter)
ON_BN_CLICKED(IDC_BUTTON6, OnHVProject)
ON_BN_CLICKED(IDC_BUTTON7, OnAreaCut)
ON_BN_CLICKED(IDC_BUTTON9, OnQuick)
ON_BN_CLICKED(IDC_ABOUT, OnAbout)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_OPEN, OnOpenFile)
ON_BN_CLICKED(IDC_PREVIEW, OnPreview)
ON_BN_CLICKED(IDCLOSE, OnClose)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSpDlg message handlers

BOOL CSpDlg::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
	
	//显示动画
	for (int i=0;i<6;i++)
	{
		m_Bitmap[i]=new CBitmap;
	}
    m_Frame=0;
	m_Bitmap[0]->LoadBitmap(IDB_BITMAP3);
	m_Bitmap[1]->LoadBitmap(IDB_BITMAP4);
	m_Bitmap[2]->LoadBitmap(IDB_BITMAP5);
	m_Bitmap[3]->LoadBitmap(IDB_BITMAP6);
	m_Bitmap[4]->LoadBitmap(IDB_BITMAP7);
	m_Bitmap[5]->LoadBitmap(IDB_BITMAP8);
	if(SetTimer(1,500,NULL)==0)MessageBox("Install Timer Fail!");
	
    return TRUE;  // return TRUE unless you set the focus to a control
}


void CSpDlg::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 CSpDlg::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();
	}
}
// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
void CSpDlg::Show()
{
	HDIB hDIB = m_dib.GetHDIB();
	CClientDC dc(GetDlgItem(IDC_PIC));
	CRect rcclient;
	GetDlgItem(IDC_PIC)->GetClientRect(&rcclient);
	if (hDIB != NULL)
	{	
		LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);				
		int cxDIB = (int) m_dib.DIBWidth(lpDIB);  // 获取DIB宽度			
		int cyDIB = (int) m_dib.DIBHeight(lpDIB); // 获取DIB高度		
		::GlobalUnlock((HGLOBAL) hDIB);
		
		CRect rcDest;  //要绘制的矩形区域
		rcDest.top=rcDest.left=0;
		rcDest.right=rcclient.Width();
		rcDest.bottom=rcclient.Height();
		CRect rcDIB;  //源DIB
        rcDIB=rcDest;
		m_dib.PaintDIB(dc.m_hDC, &rcDest, m_dib.GetHDIB(),
			&rcDIB, m_dib.GetDocPalette());// 输出DIB图像
	}
}

HCURSOR CSpDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

HBRUSH CSpDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	pDC->SetTextColor(RGB(0,0,255));
	
	// TODO: Change any attributes of the DC here
	
	// TODO: Return a different brush if the default is not desired
	return hbr;
}

//////////////////////////////////////////////////////////////////////////
void CSpDlg::OnBuHuo() 
{	
	if(Flag!=10)
	{
		MessageBox("没有打开视频","错误",MB_ICONSTOP|MB_OK);
		return;
	}
	capPreview(m_hWndCap,FALSE);
	capEditCopy(m_hWndCap);
	HDIB hNewDIB = NULL;
	if (OpenClipboard())
	{
		hNewDIB = (HDIB) m_dib.CopyHandle(::GetClipboardData(CF_DIB));
		CloseClipboard();
		if (hNewDIB != NULL)
		{
			m_dib.ReplaceHDIB(hNewDIB);
			m_dib.InitDIBData();
		}
	}
	Show();
	EmptyClipboard();
	Flag=0;
	Ispre=1;
}

// 复制当前图像
void CSpDlg::OnEditCopy()
{
	if (OpenClipboard())
	{
		EmptyClipboard();
		SetClipboardData (CF_DIB, m_dib.CopyHandle((HANDLE) m_dib.GetHDIB()) );
		CloseClipboard();
	}
	
}
//剪裁指定区域图像
void CSpDlg::OnTempSubrect()
{
	HDIB hDIB,hNewDIB;
	hDIB=m_dib.GetHDIB();
	
	long lWidth;                   
	long lHeight;
	LPSTR	lpDIB;
	
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_dib.GetHDIB());
	lWidth = m_dib.DIBWidth(lpDIB);   //DIB 宽度
	lHeight = m_dib.DIBHeight(lpDIB); //DIB 高度
	
	CRect rect(m_ipzLeft,m_ipzTop,m_ipzRight,m_ipzBottom);
	hNewDIB= myCropDIB(hDIB,rect);
	
	if (OpenClipboard())
	{
		EmptyClipboard();
		SetClipboardData (CF_DIB, m_dib.CopyHandle((HANDLE) hNewDIB ));
		CloseClipboard();
	}	
}
// 粘贴图像
void CSpDlg::OnEditPaste()
{
	HDIB hNewDIB = NULL;
	if (OpenClipboard())
	{
		hNewDIB = (HDIB) m_dib.CopyHandle(::GetClipboardData(CF_DIB));
		CloseClipboard();
		if (hNewDIB != NULL)
		{
			m_dib.ReplaceHDIB(hNewDIB);
			m_dib.InitDIBData();
		}
	}
}

//将24位真彩图像转化为灰度图
void CSpDlg::OnTruecolorToGray() 
{
	if(Flag!=0)
	{
		MessageBox("没有打开文件或捕获视频","错误",MB_ICONSTOP|MB_OK);
		return;
	}
	LPSTR lpDIB;                	
	OnEditCopy();
	lpDIB = (LPSTR)::GlobalLock((HGLOBAL)m_dib.GetHDIB());	
	ConvertToGrayScale(lpDIB);
	::GlobalUnlock((HGLOBAL) m_dib.GetHDIB());
	Show();
	Flag=1;
}
//用一初始阈值T对图像A进行二值化得到二值化图像B,初始阈值T的确定方法是:选择阈值
//T=Gmax-(Gmax-Gmin)/3,Gmax和Gmin分别是最高、最低灰度值。
void CSpDlg::OnTwoValue() 
{ 
	if(Flag!=1)
	{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -