www.pudn.com > numberdetect.rar > ChildView.cpp


// ChildView.cpp : implementation of the CChildView class 
// 
#include "stdafx.h" 
#include "DigitRec.h" 
#include "ChildView.h" 
#include "INPUT1.h" 
#include "mydiblib.h" 
#include "Bp.h" 
#include "DBpParamater.h" 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
void ThiningDIB(LPSTR lpDIBBits, LONG lWidth, LONG lHeight); 
///////////////////////////////////////////////////////////////////////////// 
// CChildView 
 
CChildView::CChildView() 
{ 
	fileloaded=false; 
	gyhinfoinput=false; 
	gyhfinished=false; 
	m_hDIB=NULL; 
} 
 
CChildView::~CChildView() 
{ 
} 
 
BEGIN_MESSAGE_MAP(CChildView,CWnd ) 
	//{{AFX_MSG_MAP(CChildView) 
	ON_WM_PAINT() 
	ON_COMMAND(IDmy_FILE_OPEN_BMP, OnFileOpenBmp) 
	ON_COMMAND(IDmy_FILE_SAVE_BMP, OnFileSaveBmp) 
	ON_COMMAND(IDmy_IMGPRC_SHRINK_ALIGN, OnImgprcShrinkAlign) 
	ON_COMMAND(IDmy_IMGPRC_ALL, OnImgprcAll) 
	ON_COMMAND(IDmy_IMGPRC_256ToGray, OnIMGPRC256ToGray) 
	ON_COMMAND(IDmy_IMGPRC_DIVIDE, OnImgprcDivide) 
	ON_COMMAND(IDmy_IMGPRC_TO_DIB_AND_SAVE, OnImgprcToDibAndSave) 
	ON_COMMAND(IDmy_IMGPRC_REMOVE_NOISE, OnImgprcRemoveNoise) 
	ON_COMMAND(IDmy_IMGPRC_STANDARIZE, OnImgprcStandarize) 
	ON_COMMAND(IDmy_IMGPRC_THINNING, OnImgprcThinning) 
	ON_COMMAND(IDmy_IMGPRC_ADJUST_SLOPE, OnImgprcAdjustSlope) 
	ON_COMMAND(IDmy_IMGPRC_GrayToWhiteBlack, OnIMGPRCGrayToWhiteBlack) 
	ON_COMMAND(IDmy_IMGPRC_SHARP, OnImgprcSharp) 
	ON_COMMAND(IDmy_FILE_RE_LOAD_BMP, OnFileReLoadBmp) 
	ON_COMMAND(ID_INPUT1, OnInputGuiyihuaInfo) 
	ON_COMMAND(IDmy_BPNET_TRAIN, OnBpnetTrain) 
	ON_COMMAND(IDmy_BPNET_RECOGNIZE, OnBpnetRecognize) 
	ON_COMMAND(ID_aver, Onaver) 
	ON_COMMAND(ID_Gass, OnGass) 
	ON_COMMAND(ID_Mid, OnMid) 
	ON_COMMAND(IDmy_IMGPRC_EQUALIZE, OnImgprcEqualize) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CChildView message handlers 
 
BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs)  
{ 
	if (!CWnd::PreCreateWindow(cs)) 
		return FALSE; 
 
	cs.dwExStyle |= WS_EX_CLIENTEDGE; 
	cs.style &= ~WS_BORDER; 
	cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,  
		::LoadCursor(NULL, IDC_ARROW), HBRUSH(COLOR_WINDOW+1), NULL); 
 
	return TRUE; 
} 
 
void CChildView::OnPaint()  
{ 
	CPaintDC dc(this); // device context for painting 
	OnDraw(&dc); 
	// Do not call CWnd::OnPaint() for painting messages 
} 
 
//打开256色位图文件 
void CChildView::OnFileOpenBmp()  
{ 
	//创建一个打开文件对话框,并返回完整的文件路径 
	static char BASED_CODE szFilter[] = "256色位图文件(*.bmp)|"; 
	CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter,NULL); 
    if(dlg.DoModal() == IDOK) 
	   strPathName = dlg.GetPathName(); 
	else return; 
	//创建一个文件对象 
   	CFile file; 
	//以只读模式打开文件 
	file.Open (strPathName,CFile::modeRead); 
	//读取文件到HDIB句柄中. 注意:此时只是读取位图文件中文件头之后的部分,不含文件头 
	m_hDIB=::ReadDIBFile (file); 
	//HDIB句柄: 就是一块存储位图数据的内存区域的地址 
	//HDIB句柄包含:位图信息头、调色板(如果有的话)、DIB图像数据 
	//关闭文件 
	file.Close (); 
	//指向DIB的指针(指向位图信息头) 
	BYTE* lpDIB=(BYTE*)::GlobalLock ((HGLOBAL)m_hDIB); 
	// 获取DIB中颜色表中的颜色数目 
	WORD wNumColors;	 
	wNumColors = ::DIBNumColors((char*)lpDIB);	 
	// 判断是否是256色位图 
	if (wNumColors != 256) 
	{ 
		// 提示用户 
		MessageBox("非256色位图!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
		// 解除锁定 
		::GlobalUnlock((HGLOBAL)m_hDIB); 
		// 返回 
		return; 
	} 
	//在屏幕上显示位图 
	CDC* pDC=GetDC(); 
	DisplayDIB(pDC,m_hDIB);	 
	//更改位图文件是否已加载的标志 
	fileloaded=true; 
    //gyhinfoinput=false;          //2004.4.26修改 
	gyhfinished=false; 
} 
 
//取消一切更改,重新加载位图文件 
void CChildView::OnFileReLoadBmp()  
{ 
	//判断位图文件是否已加载。如果尚未加载,则弹出文件打开对话框 
	if(fileloaded==false) 
	{ 
		OnFileOpenBmp(); 
		if(fileloaded==false) 
			return; 
	} 
	//创建一个文件对象 
   	CFile file; 
	//以只读模式打开文件 
	file.Open (strPathName,CFile::modeReadWrite); 
	m_hDIB=::ReadDIBFile (file); 
	//关闭文件 
	file.Close (); 
	//在屏幕上显示位图 
	CDC* pDC=GetDC(); 
	DisplayDIB(pDC,m_hDIB);		 
} 
 
 
void CChildView::OnFileSaveBmp()  
{ 
	//创建一个保存文件对话框,并返回完整的文件路径 
	static char BASED_CODE szFilter[] = "256色位图文件(*.bmp)|"; 
	CFileDialog dlg(FALSE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter,NULL); 
    if(dlg.DoModal() == IDOK) 
	   strPathNameSave = dlg.GetPathName(); 
	else return; 
	//在文件名后添加.bmp后缀 
	//strPathNameSave+=".bmp"; 
	//以读写模式打开一个文件。如果文件不存在,则创建之 
   	CFile file(strPathNameSave, CFile::modeReadWrite|CFile::modeCreate); 
	::SaveDIB (m_hDIB,file); 
	//关闭文件 
	file.Close ();	 
} 
 
//一次性预处理 
void CChildView::OnImgprcAll()  
{ 
	if(fileloaded==false) 
	{ 
		if(::AfxMessageBox ("请先打开一个图像文件再进行此操作!",MB_YESNO|MB_ICONSTOP)==IDNO) 
		   return; 
	} 
	//打开文件 
	OnFileReLoadBmp(); 
	//判断用户是否已输入归一化高度和宽度信息 
	if(gyhinfoinput==false) OnInputGuiyihuaInfo(); 
	//将256色图转换为灰度图 
	OnIMGPRC256ToGray(); 
	//将灰度图二值化 
	OnIMGPRCGrayToWhiteBlack(); 
	//梯度锐化 
	//OnImgprcSharp(); 
	//去除离散杂点噪声 
	OnImgprcRemoveNoise(); 
	//调整数字字符的整体倾斜 
	OnImgprcAdjustSlope(); 
	//分割并画框标识 
	OnImgprcDivide(); 
	//将分割后的数字字符宽、高标准化,以便于下一步与BP网络的输入兼容 
	OnImgprcStandarize(); 
	ConvertGrayToWhiteBlack(m_hDIB); 
	//紧缩重排数字字符 
	OnImgprcShrinkAlign(); 
	//分别保存这些已经经过分割、标准后的单个的数字字符到bmp文件,以便后续过程使用 
	//OnImgprcToDibAndSave(); 
	//OnPreprocThin();	 
} 
 
//图像预处理第1步:将256色图像转化为灰度图像 
void CChildView::OnIMGPRC256ToGray()  
{	 
	Convert256toGray(m_hDIB);	 
	//在屏幕上显示位图 
	CDC* pDC=GetDC(); 
	DisplayDIB(pDC,m_hDIB);	 
} 
 
//图像预处理第2步:将灰度图二值化 
void CChildView::OnIMGPRCGrayToWhiteBlack() 
{ 
	ConvertGrayToWhiteBlack(m_hDIB); 
	//在屏幕上显示位图 
	CDC* pDC=GetDC(); 
	DisplayDIB(pDC,m_hDIB);	 
} 
 
//图像预处理第3步:梯度锐化 
void CChildView::OnImgprcSharp()  
{ 
	GradientSharp(m_hDIB); 
	//在屏幕上显示位图 
	CDC* pDC=GetDC(); 
	DisplayDIB(pDC,m_hDIB);		 
} 
 
//图像预处理第4步:去离散杂点噪声 
void CChildView::OnImgprcRemoveNoise()  
{ 
	RemoveScatterNoise(m_hDIB); 
	//在屏幕上显示位图 
	CDC* pDC=GetDC(); 
	DisplayDIB(pDC,m_hDIB);	 
} 
 
//图像预处理第5步:倾斜度调整 
void CChildView::OnImgprcAdjustSlope()  
{ 
    SlopeAdjust(m_hDIB); 
	//在屏幕上显示位图 
	CDC* pDC=GetDC(); 
	DisplayDIB(pDC,m_hDIB);	 
} 
 
//图像预处理第6步:分割,并在分割出来的字符外面画框以标识 
void CChildView::OnImgprcDivide()  
{ 
	m_charRect=CharSegment(m_hDIB); 
	//在屏幕上显示位图 
	CDC* pDC=GetDC(); 
	DisplayDIB(pDC,m_hDIB);	 
	DrawFrame(pDC,m_hDIB,m_charRect,2,RGB(20,60,200)); 
} 
 
//图像预处理第7步:标准归一化 
//将分割出来的各个不同宽、高的数字字符宽、高统一 
void CChildView::OnImgprcStandarize()  
{ 
	StdDIBbyRect(m_hDIB,w_sample,h_sample); 
	//在屏幕上显示位图 
	CDC* pDC=GetDC(); 
	DisplayDIB(pDC,m_hDIB);	 
	DrawFrame(pDC,m_hDIB,m_charRect,2,RGB(21,255,25)); 
	gyhfinished=true; 
} 
 
//图像预处理第8步:紧缩重排已经分割完毕的数字字符,并形成新的位图句柄 
void CChildView::OnImgprcShrinkAlign()  
{ 
	m_hDIB=AutoAlign(m_hDIB); 
	//在屏幕上显示位图 
	CDC* pDC=GetDC(); 
	DisplayDIB(pDC,m_hDIB);	 
	DrawFrame(pDC,m_hDIB,m_charRect,1,RGB(252,115,27)); 
} 
 
//图像预处理第9步:将最终标准化后的字符图像分为单个单个的HDIB保存,并存为.bmp文件 
void CChildView::OnImgprcToDibAndSave()  
{ 
	unsigned char* lpSrc; 
	int w,h; 
	w=m_charRect.front ().Width() ; 
	h=m_charRect.front ().Height() ; 
	m_dibRect.clear (); 
	m_dibRectCopy.clear (); 
	int i_src,j_src; 
	int i,j; 
	int counts=0; 
	CRect rect,rectnew; 
	BYTE* lpDIB=(BYTE*)::GlobalLock ((HGLOBAL)m_hDIB); 
	BYTE* lpDIBBits=(BYTE*)::FindDIBBits ((char*)lpDIB); 
	BYTE* lpNewDIBBits; 
	BYTE* lpDst; 
	LONG lLineBytes=(digicount*w+3)/4*4; 
	LONG lLineBytesnew =(w+3)/4*4; 
	HDIB hDIB=NULL; 
	while(!m_charRect.empty ()) 
	{ 
		hDIB=::NewDIB (w,h,8); 
		lpDIB=(BYTE*) ::GlobalLock((HGLOBAL)hDIB);	 
		lpNewDIBBits = (BYTE*)::FindDIBBits((char*)lpDIB); 
		lpDst=(BYTE*)lpNewDIBBits; 
		memset(lpDst,(BYTE)255,lLineBytesnew * h);		 
		rect=m_charRect.front (); 
		m_charRect.pop_front (); 
		for(i=0;i