?? childview.cpp
字號(hào):
// 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()
{
//創(chuàng)建一個(gè)打開文件對話框,并返回完整的文件路徑
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;
//創(chuàng)建一個(gè)文件對象
CFile file;
//以只讀模式打開文件
file.Open (strPathName,CFile::modeRead);
//讀取文件到HDIB句柄中. 注意:此時(shí)只是讀取位圖文件中文件頭之后的部分,不含文件頭
m_hDIB=::ReadDIBFile (file);
//HDIB句柄: 就是一塊存儲(chǔ)位圖數(shù)據(jù)的內(nèi)存區(qū)域的地址
//HDIB句柄包含:位圖信息頭、調(diào)色板(如果有的話)、DIB圖像數(shù)據(jù)
//關(guān)閉文件
file.Close ();
//指向DIB的指針(指向位圖信息頭)
BYTE* lpDIB=(BYTE*)::GlobalLock ((HGLOBAL)m_hDIB);
// 獲取DIB中顏色表中的顏色數(shù)目
WORD wNumColors;
wNumColors = ::DIBNumColors((char*)lpDIB);
// 判斷是否是256色位圖
if (wNumColors != 256)
{
// 提示用戶
MessageBox("非256色位圖!", "系統(tǒng)提示" , MB_ICONINFORMATION | MB_OK);
// 解除鎖定
::GlobalUnlock((HGLOBAL)m_hDIB);
// 返回
return;
}
//在屏幕上顯示位圖
CDC* pDC=GetDC();
DisplayDIB(pDC,m_hDIB);
//更改位圖文件是否已加載的標(biāo)志
fileloaded=true;
//gyhinfoinput=false; //2004.4.26修改
gyhfinished=false;
}
//取消一切更改,重新加載位圖文件
void CChildView::OnFileReLoadBmp()
{
//判斷位圖文件是否已加載。如果尚未加載,則彈出文件打開對話框
if(fileloaded==false)
{
OnFileOpenBmp();
if(fileloaded==false)
return;
}
//創(chuàng)建一個(gè)文件對象
CFile file;
//以只讀模式打開文件
file.Open (strPathName,CFile::modeReadWrite);
m_hDIB=::ReadDIBFile (file);
//關(guān)閉文件
file.Close ();
//在屏幕上顯示位圖
CDC* pDC=GetDC();
DisplayDIB(pDC,m_hDIB);
}
void CChildView::OnFileSaveBmp()
{
//創(chuàng)建一個(gè)保存文件對話框,并返回完整的文件路徑
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";
//以讀寫模式打開一個(gè)文件。如果文件不存在,則創(chuàng)建之
CFile file(strPathNameSave, CFile::modeReadWrite|CFile::modeCreate);
::SaveDIB (m_hDIB,file);
//關(guān)閉文件
file.Close ();
}
//一次性預(yù)處理
void CChildView::OnImgprcAll()
{
if(fileloaded==false)
{
if(::AfxMessageBox ("請先打開一個(gè)圖像文件再進(jìn)行此操作!",MB_YESNO|MB_ICONSTOP)==IDNO)
return;
}
//打開文件
OnFileReLoadBmp();
//判斷用戶是否已輸入歸一化高度和寬度信息
if(gyhinfoinput==false) OnInputGuiyihuaInfo();
//將256色圖轉(zhuǎn)換為灰度圖
OnIMGPRC256ToGray();
//將灰度圖二值化
OnIMGPRCGrayToWhiteBlack();
//梯度銳化
//OnImgprcSharp();
//去除離散雜點(diǎn)噪聲
OnImgprcRemoveNoise();
//調(diào)整數(shù)字字符的整體傾斜
OnImgprcAdjustSlope();
//分割并畫框標(biāo)識(shí)
OnImgprcDivide();
//將分割后的數(shù)字字符寬、高標(biāo)準(zhǔn)化,以便于下一步與BP網(wǎng)絡(luò)的輸入兼容
OnImgprcStandarize();
ConvertGrayToWhiteBlack(m_hDIB);
//緊縮重排數(shù)字字符
OnImgprcShrinkAlign();
//分別保存這些已經(jīng)經(jīng)過分割、標(biāo)準(zhǔn)后的單個(gè)的數(shù)字字符到bmp文件,以便后續(xù)過程使用
//OnImgprcToDibAndSave();
//OnPreprocThin();
}
//圖像預(yù)處理第1步:將256色圖像轉(zhuǎn)化為灰度圖像
void CChildView::OnIMGPRC256ToGray()
{
Convert256toGray(m_hDIB);
//在屏幕上顯示位圖
CDC* pDC=GetDC();
DisplayDIB(pDC,m_hDIB);
}
//圖像預(yù)處理第2步:將灰度圖二值化
void CChildView::OnIMGPRCGrayToWhiteBlack()
{
ConvertGrayToWhiteBlack(m_hDIB);
//在屏幕上顯示位圖
CDC* pDC=GetDC();
DisplayDIB(pDC,m_hDIB);
}
//圖像預(yù)處理第3步:梯度銳化
void CChildView::OnImgprcSharp()
{
GradientSharp(m_hDIB);
//在屏幕上顯示位圖
CDC* pDC=GetDC();
DisplayDIB(pDC,m_hDIB);
}
//圖像預(yù)處理第4步:去離散雜點(diǎn)噪聲
void CChildView::OnImgprcRemoveNoise()
{
RemoveScatterNoise(m_hDIB);
//在屏幕上顯示位圖
CDC* pDC=GetDC();
DisplayDIB(pDC,m_hDIB);
}
//圖像預(yù)處理第5步:傾斜度調(diào)整
void CChildView::OnImgprcAdjustSlope()
{
SlopeAdjust(m_hDIB);
//在屏幕上顯示位圖
CDC* pDC=GetDC();
DisplayDIB(pDC,m_hDIB);
}
//圖像預(yù)處理第6步:分割,并在分割出來的字符外面畫框以標(biāo)識(shí)
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));
}
//圖像預(yù)處理第7步:標(biāo)準(zhǔn)歸一化
//將分割出來的各個(gè)不同寬、高的數(shù)字字符寬、高統(tǒng)一
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;
}
//圖像預(yù)處理第8步:緊縮重排已經(jīng)分割完畢的數(shù)字字符,并形成新的位圖句柄
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));
}
//圖像預(yù)處理第9步:將最終標(biāo)準(zhǔn)化后的字符圖像分為單個(gè)單個(gè)的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<h;i++)
for(j=0;j<w;j++)
{
i_src=rect.top + i;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -