- Visual C++源码
- Visual Basic源码
- C++ Builder源码
- Java源码
- Delphi源码
- C/C++源码
- PHP源码
- Perl源码
- Python源码
- Asm源码
- Pascal源码
- Borland C++源码
- Others源码
- SQL源码
- VBScript源码
- JavaScript源码
- ASP/ASPX源码
- C#源码
- Flash/ActionScript源码
- matlab源码
- PowerBuilder源码
- LabView源码
- Flex源码
- MathCAD源码
- VBA源码
- IDL源码
- Lisp/Scheme源码
- VHDL源码
- Objective-C源码
- Fortran源码
- tcl/tk源码
- QT源码
getcharDlg.cpp
资源名称:getchar.rar [点击查看]
上传用户:kennygump
上传日期:2022-07-22
资源大小:347k
文件大小:12k
源码类别:
图形/文字识别
开发平台:
Visual C++
- // getcharDlg.cpp : implementation file
- //
- #include "stdafx.h"
- #include "getchar.h"
- #include "getcharDlg.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
- /////////////////////////////////////////////////////////////////////////////
- // CGetcharDlg dialog
- CGetcharDlg::CGetcharDlg(CWnd* pParent /*=NULL*/)
- : CDialog(CGetcharDlg::IDD, pParent)
- {
- //{{AFX_DATA_INIT(CGetcharDlg)
- // NOTE: the ClassWizard will add member initialization here
- //}}AFX_DATA_INIT
- // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
- m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
- }
- void CGetcharDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CGetcharDlg)
- // NOTE: the ClassWizard will add DDX and DDV calls here
- //}}AFX_DATA_MAP
- }
- BEGIN_MESSAGE_MAP(CGetcharDlg, CDialog)
- //{{AFX_MSG_MAP(CGetcharDlg)
- ON_WM_PAINT()
- ON_WM_QUERYDRAGICON()
- ON_BN_CLICKED(IDC_BTNOPENBMP, OnBtnopenbmp)
- ON_BN_CLICKED(IDC_BTNRELOAD, OnBtnreload)
- ON_BN_CLICKED(IDC_BTN_ALL, OnBtnAll)
- ON_BN_CLICKED(IDC_ImgprcAll, OnImgprcAll)
- ON_BN_CLICKED(IDC_IMGPRC256ToGray, OnIMGPRC256ToGray)
- ON_BN_CLICKED(IDC_IMGPRCGrayToWhiteBlack, OnIMGPRCGrayToWhiteBlack)
- ON_BN_CLICKED(IDC_InputGuiyihuaInfo, OnInputGuiyihuaInfo)
- ON_BN_CLICKED(IDC_BpnetTrain, OnBpnetTrain)
- ON_BN_CLICKED(IDC_BpnetRecognize, OnBpnetRecognize)
- ON_BN_CLICKED(IDC_ImgprcSharp, OnImgprcSharp)
- ON_BN_CLICKED(IDC_ImgprcRemoveNoise, OnImgprcRemoveNoise)
- ON_BN_CLICKED(IDC_ImgprcAdjustSlope, OnImgprcAdjustSlope)
- ON_BN_CLICKED(IDC_ImgprcDivide, OnImgprcDivide)
- ON_BN_CLICKED(IDC_ImgprcStandarize, OnImgprcStandarize)
- ON_BN_CLICKED(IDC_ImgprcShrinkAlign, OnImgprcShrinkAlign)
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CGetcharDlg message handlers
- BOOL CGetcharDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- // 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
- // TODO: Add extra initialization here
- 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 CGetcharDlg::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.
- HCURSOR CGetcharDlg::OnQueryDragIcon()
- {
- return (HCURSOR) m_hIcon;
- }
- void CGetcharDlg::OnBtnopenbmp()
- {
- // TODO: Add your control notification handler code here
- //创建一个打开文件对话框,并返回完整的文件路径
- 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;
- gyhfinished=false;
- }
- void CGetcharDlg::OnBtnreload()
- {
- // TODO: Add your control notification handler code here
- //判断位图文件是否已加载。如果尚未加载,则弹出文件打开对话框
- if(fileloaded==false)
- {
- OnBtnopenbmp();
- 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 CGetcharDlg::OnImgprcAll()
- {
- // TODO: Add your control notification handler code here
- if(fileloaded==false)
- {
- if(::AfxMessageBox ("请先打开一个图像文件再进行此操作!",MB_YESNO|MB_ICONSTOP)==IDNO)
- return;
- }
- //打开文件
- OnBtnreload();
- //判断用户是否已输入归一化高度和宽度信息
- if(gyhinfoinput==false) OnInputGuiyihuaInfo();
- //将256色图转换为灰度图
- OnIMGPRC256ToGray();
- //将灰度图二值化
- OnIMGPRCGrayToWhiteBlack();
- //梯度锐化
- //OnImgprcSharp();
- //去除离散杂点噪声
- OnImgprcRemoveNoise();
- //调整数字字符的整体倾斜
- OnImgprcAdjustSlope();
- //分割并画框标识
- OnImgprcDivide();
- //将分割后的数字字符宽、高标准化,以便于下一步与BP网络的输入兼容
- OnImgprcStandarize();
- ConvertGrayToWhiteBlack(m_hDIB);
- //紧缩重排数字字符
- OnImgprcShrinkAlign();
- //分别保存这些已经经过分割、标准后的单个的数字字符到bmp文件,以便后续过程使用
- //OnImgprcToDibAndSave();
- //OnPreprocThin();
- }
- //图像预处理第1步:将256色图像转化为灰度图像
- void CGetcharDlg::OnIMGPRC256ToGray()
- {
- // TODO: Add your control notification handler code here
- Convert256toGray(m_hDIB);
- //在屏幕上显示位图
- CDC* pDC=GetDC();
- DisplayDIB(pDC,m_hDIB);
- }
- //图像预处理第2步:将灰度图二值化
- void CGetcharDlg::OnIMGPRCGrayToWhiteBlack()
- {
- // TODO: Add your control notification handler code here
- ConvertGrayToWhiteBlack(m_hDIB);
- //在屏幕上显示位图
- CDC* pDC=GetDC();
- DisplayDIB(pDC,m_hDIB);
- }
- //图像预处理第3步:梯度锐化
- void CGetcharDlg::OnImgprcSharp()
- {
- // TODO: Add your control notification handler code here
- GradientSharp(m_hDIB);
- //在屏幕上显示位图
- CDC* pDC=GetDC();
- DisplayDIB(pDC,m_hDIB);
- }
- //图像预处理第4步:去离散杂点噪声
- void CGetcharDlg::OnImgprcRemoveNoise()
- {
- // TODO: Add your control notification handler code here
- RemoveScatterNoise(m_hDIB);
- //在屏幕上显示位图
- CDC* pDC=GetDC();
- DisplayDIB(pDC,m_hDIB);
- }
- //图像预处理第5步:倾斜度调整
- void CGetcharDlg::OnImgprcAdjustSlope()
- {
- // TODO: Add your control notification handler code here
- SlopeAdjust(m_hDIB);
- //在屏幕上显示位图
- CDC* pDC=GetDC();
- DisplayDIB(pDC,m_hDIB);
- }
- //图像预处理第6步:分割,并在分割出来的字符外面画框以标识
- void CGetcharDlg::OnImgprcDivide()
- {
- // TODO: Add your control notification handler code here
- 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 CGetcharDlg::OnImgprcStandarize()
- {
- // TODO: Add your control notification handler code here
- 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 CGetcharDlg::OnImgprcShrinkAlign()
- {
- // TODO: Add your control notification handler code here
- m_hDIB=AutoAlign(m_hDIB);
- //在屏幕上显示位图
- CDC* pDC=GetDC();
- DisplayDIB(pDC,m_hDIB);
- DrawFrame(pDC,m_hDIB,m_charRect,1,RGB(252,115,27));
- }
- void CGetcharDlg::OnInputGuiyihuaInfo()
- {
- // TODO: Add your control notification handler code here
- CINPUT1 input;
- input.w =8;
- input.h =16;
- if(input.DoModal ()!=IDOK) return;
- w_sample=input.w;
- h_sample=input.h;
- gyhinfoinput=true;
- }
- void CGetcharDlg::OnBpnetTrain()
- {
- // TODO: Add your control notification handler code here
- OnImgprcAll();
- //判断是否经过了归一划的处理
- if(gyhfinished==false)
- {
- //如果没有进行提示错误并返回
- ::MessageBox(NULL,"没有进行归一划预处理",NULL,MB_ICONSTOP);
- return;
- }
- //建立BP网络训练参数对话框
- CDBpParamater BpPa;
- //初始化变量
- BpPa.m_a=0;
- BpPa.m_eta=0.015;
- BpPa.m_ex=0.001;
- BpPa.m_hn=10;
- // 显示对话框
- if(BpPa.DoModal()!=IDOK)
- {
- //返回
- return;
- }
- //用户获得参数信息
- //相关系数
- double momentum=BpPa.m_a;
- //最小均方误差
- double min_ex=BpPa.m_ex;
- //隐层数目
- int n_hidden=BpPa.m_hn;
- //训练步长
- double eta=BpPa.m_eta;
- //获得指向DIB的指针
- BYTE *lpDIB=(BYTE*)::GlobalLock((HGLOBAL) m_hDIB);
- //获得指向DIB象素的指针,并指向象素的起始位置
- BYTE *lpDIBBits =(BYTE*)::FindDIBBits((char *)lpDIB);
- //获得颜色信息
- int numColors=(int) ::DIBNumColors((char *)lpDIB);
- //不是灰度图返回
- if (numColors!=256)
- {
- ::GlobalUnlock((HGLOBAL) m_hDIB);
- ::MessageBox(NULL,"只能处理灰度图像",NULL,MB_ICONSTOP);
- return;
- }
- //获取图像的宽度
- LONG lWidth = (LONG) ::DIBWidth((char *)lpDIB);
- //获取图像的高度
- LONG lHeight = (LONG) ::DIBHeight((char *)lpDIB);
- //计算图像每行的字节数
- LONG lLineByte = (lWidth+3)/4*4;
- //归一化的宽度
- LONG lSwidth = w_sample;
- //归一化的高度
- LONG LSheight = h_sample;
- //指向输入样本的特征向量的指针
- double **data_in;
- //从输入的训练样本中提取特征向量
- data_in = code ( lpDIBBits, digicount, lLineByte, lSwidth, LSheight);
- //计算输入层结点的数目
- int n_in = LSheight*lSwidth;
- double out[][4]={
- 0.1,0.1,0.1,0.1,
- 0.1,0.1,0.1,0.9,
- 0.1,0.1,0.9,0.1,
- 0.1,0.1,0.9,0.9,
- 0.1,0.9,0.1,0.1,
- 0.1,0.9,0.1,0.9,
- 0.1,0.9,0.9,0.1,
- 0.1,0.9,0.9,0.9,
- 0.9,0.1,0.1,0.1,
- 0.9,0.1,0.1,0.9
- };
- double **data_out;
- data_out = alloc_2d_dbl(digicount,4);
- for(int i=0;i<digicount;i++)
- {
- for(int j=0;j<4;j++)
- data_out[i][j]=out[i%10][j];
- }
- BpTrain( data_in, data_out, n_in,n_hidden,min_ex,momentum,eta,digicount);
- ::GlobalUnlock(m_hDIB);
- CDC* pDC=GetDC();
- DisplayDIB(pDC,m_hDIB);
- }
- void CGetcharDlg::OnBpnetRecognize()
- {
- // TODO: Add your control notification handler code here
- OnImgprcAll();
- //判断是否经过了归一划的处理
- if(gyhfinished==false)
- {
- //如果没有进行提示错误并返回
- ::MessageBox(NULL,"没有进行归一划预处理",NULL,MB_ICONSTOP);
- return;
- }
- //获得指向DIB的指针
- BYTE *lpDIB=(BYTE*)::GlobalLock((HGLOBAL) m_hDIB);
- //获得指向DIB象素的指针,并指向象素的起始位置
- BYTE *lpDIBBits =(BYTE*)::FindDIBBits((char *)lpDIB);
- //获得颜色信息
- int numColors=(int) ::DIBNumColors((char *)lpDIB);
- //不是灰度图返回
- if (numColors!=256)
- {
- ::GlobalUnlock((HGLOBAL) m_hDIB);
- ::MessageBox(NULL,"只能处理256色图像",NULL,MB_ICONSTOP);
- return;
- }
- //获取图像的宽度
- LONG lWidth = (LONG) ::DIBWidth((char *)lpDIB);
- //获取图像的高度
- LONG lHeight = (LONG) ::DIBHeight((char *)lpDIB);
- //计算图像每行的字节数
- LONG lLineByte = (lWidth+3)/4*4;
- //归一化的宽度
- LONG lSwidth = w_sample;
- //归一化的高度
- LONG LSheight = h_sample;
- // 读取结点信息
- int n[3];
- if(r_num(n,"num")==false)
- return;
- //获得输入层结点数目
- int n_in=n[0];
- //获得隐层结点数目
- int n_hidden=n[1];
- //获得输出层结点数目
- int n_out=n[2];
- //判断待识别样本的归一划信息是否与训练时相同
- if(n_in!=lSwidth*LSheight)
- {
- //如果不相同提示错误并返回
- ::MessageBox(NULL,"归一划尺寸与上一次训练时不一致",NULL,MB_ICONSTOP);
- return;
- }
- //指向输入样本的特征向量的指针
- double **data_in;
- //从输入的训练样本中提取特征向量
- data_in = code ( lpDIBBits, digicount, lLineByte, lSwidth, LSheight);
- //根据提取的特征进行样本识别
- CodeRecognize(data_in, digicount,n_in,n_hidden,n_out);
- ::GlobalUnlock(m_hDIB);
- CDC* pDC=GetDC();
- DisplayDIB(pDC,m_hDIB);
- }
- void CGetcharDlg::OnBtnAll()
- {
- // TODO: Add your control notification handler code here
- CGetcharDlg::OnImgprcAll();
- }