基于VC手写数字识别程序设计优秀论文定稿可编辑_第1页
基于VC手写数字识别程序设计优秀论文定稿可编辑_第2页
基于VC手写数字识别程序设计优秀论文定稿可编辑_第3页
基于VC手写数字识别程序设计优秀论文定稿可编辑_第4页
基于VC手写数字识别程序设计优秀论文定稿可编辑_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 基于vc+手写数字识别程序设计目录1、摘要12、原理22.1、图像的二值化处理22.2、模板匹配法22.3、图像的特征提取33、系统设计43.1、主界面43.2、图像绘制63.3、特征提取63.4、学习73.5、识别83.6、清除94、系统调试95、心得体会116、参考文献12附录:131、摘要 自上世纪六十年代以来,计算机视觉与图像处理越来越受到人们的关注,并逐渐成为一门重要的学科领域。而作为它们的研究对象的数字图像,也因为它含有研究目标的丰富信息而成为越来越重要的研究对象。图像识别的目标是用计算机自动完成某些信息的处理,用来替代人工去处理图像分类及识别的任务。 手写数字识别是图像识别学科

2、下的一个分支,是图像处理和模式识别领域研究的课题之一,由于其具有很强的实用性一直是多年来的研究热点。由于手写体数字的随意性很大,例如,笔画的粗细,字体的大小,倾斜等等都直接影响到字符的正确识别,所以手写体数字识别是一个很有挑战性的课题。在过去的数十年中,研究者们提出了许多的识别方法,取得了较大的成果。手写体数字识别实用性很强,在大规模数据统计如例行年检,人口普查,财务,税务,邮件分拣等等应用领域中都有广阔的应用前景。本课题拟研究手写体数字识别的理论和方法,开发一个小型的手写体数字识别系统。 本次设计主要完成以下几个工作:手写数字绘制问题、数字的预处理问题、特征提取问题、特征库的建立问题、数字识

3、别问题。关键词:绘制数字;预处理;特征提取;特征库;数字识别2、原理 本次设计主要用到图像的二值化处理、图像特征提取和模板匹配法三个知识点,下面将对这三个知识点进行简单介绍:2.1、图像的二值化处理 图像的二值化处理就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果。在手写数字识别系统中,我们在vc可视化编程界面中在一个固定大小的控件中手写了一个数字,在程序中获得的只是以这个控件左上角为原点的一系列坐标。在内存中我们开辟一个大小跟这个控件区域大小相同的二维数组以像素为单位,即生成一张图片的长跟宽跟这个矩形区域相等,这样内存中图像的数据区域的二维数组就跟手写区域的

4、坐标相同,我们再取出手写区域的坐标值,将这些坐标值对应到图像图像数据区域中,并且将它的灰度值置为255白色,将图像数据区域的其它坐标值下的灰度值置为0黑色,这样我们就得到了一张手写数字的二值化图像。在数字图像处理中,二值图像占有非常重要的地位,图像的二值化有利于图像的进一步处理,使图像变得简单,而且数据量减小,能凸显出感兴趣的目标的轮廓。2.2、模板匹配法 模板匹配法是图像识别中最具有代表性的方法之一。它是将从待识别的图像提取的若干特征量与模板对应的特征量进行比较,计算图像和模板特征量之间的距离,用最小距离法判定所属类。模板匹配通常事先建立标准模板库。这里,模板库中的标准模板是数字样本的特征向

5、量。 具体过程是:对于一个待测试的样本x,计算x和训练集中的某样本xj(0jm,m为训练集中的样本数)之间的距离。循环计算待测样本和训练集中各已知样本之间的距离,比较所有的距离值,找出距离待测样本最近的已知样本,其中所对应的样本所属的类别就是待测样本x所属的类别。2.3、图像的特征提取 若直接把预处理后的数据作为输入量,进行分类计算时数据时数据量大,同时由于手写字体的多样化及图像本身和预处理过程中附带的某些干扰的影响,对系统的容错能力要求较高。特征提取的目的就是从分析数字的拓扑结构入手,把它的某些结构特征提取出来,使数字的位移、大小变化、字形畸形等干扰相对较小,也就是把那些反映数字特征的关键信

6、息提供给系统,这样就等于间接地增加了系统的容错能力,而且经过特征提取后数据量也大大减少了,这样就提高了识别的效率。 手写数字识别的特征提取极大程度地影响着分类器的设计和性能,以及识别的效果和效率。为了保证所要求的分类识别的正确率和节省资源,希望依据最少的特征达到所要求的分类识别的正确率。在进行手写数字识别的过程中,特征提取应遵循以下原则:特征应能尽量包含字符的有用信息。特征的提取方法应简单而且提取快速。各个特征之间的相关性应尽可能小。特征数量尽可能少。特征应有较好的抗干扰能力。3、系统设计 本系统主要包括了主界面、图像绘制、特征提取、学习、识别、清除六个模块,其总框图如图3.0所示: 图3.0

7、 系统总框图以下是各模块详细设计:3.1、主界面 3.2、图像绘制 图像的绘制主要是按下鼠标左键、拖动鼠标、放开鼠标左键这样一个过程,本次设计通过onlbuttondown(鼠标左键按下函数)、onmousemove(鼠标移动函数)、onlbuttonup(鼠标左键放开函数)来实现图像的绘制,流程图如图3.2所示: 图3.2图像绘制流程图3.3、特征提取 本模块首先要创建一个结构体变量来表示所绘图形的各种特征,比如value(手写数字值)、vhderection(水平垂直特征)、length1(第一个笔画长度)等等,具体情况看附录-程序清单里的特征提取函数,每个特征的提取如图3.3流程图所示:

8、 图3.3 特征提取流程图3.4、学习 首先点击学习按钮,判断当前写入数值是否已在模板中,随后出现输入学习值对话框,提取特征值,最后存入模板,如图3.4所示: 图3.4 学习流程图3.5、识别 识别过程就相当于一个查询过程,首先点击识别按钮,然后提取特征值,将特征值与模板一一对比,若有则显示其值,若无则显示无法识别,如图3.5所示: 图3.5 识别流程图 3.6、清除 清除最为简单,把绘图区域的每个点设置为白点,即二值图像中灰度值都变为255,流程如图3.6所示: 图3.6 清除流程图4、系统调试 图4.1 学习调试 点击确定后点击清除按钮,再输入一个8,如图4.2所示,这次就跟之前不一样了,

9、说明模板库里没有刚刚写入的数字,然后往两个编辑框里都输入8以后点击ok,这样就完成了学习的功能。 图4.2 学习调试点击清除之后,往绘图区写入一个4,如图4.3所示说明识别成功。 图4.3识别调试识别率如表4.1:数字测试次数正确次数识别率0201680%1201995%2201890%3201890%4201785%5201365%6201680%7201995%820945%9201785%表4.1 识别率统计分析:从表中可以看出8和5较难识别,因为其特征不太好提取,特征比较多样化,所以需要大量的学习,丰富模板库,这样可以提高识别率。5、心得体会 本文对基于vc+6.0的手写数字识别系统的

10、基本原理及方法进行了介绍。手写体数字识别是一个极具研究价值的课题,手写数字的样品类别总共只有0一9十类,与其它的大字符集的识别汉字识别相比要相对容易。本文所采用的模板匹配分类器既节省时间,简便易行,也可以达到较高地识别效果。但是在系统的设计上由于时间的限制导致系统界面的设计不够美观,特征训练不够导致识别率不够高。手写体数字的特征提取是一个非常复杂的问题,可以考虑在识别的时候使用有监督的识别方法,这样在识别的同时可以更新特征库,这里所说的更新是把导致识别错误的模板替换掉这样出错的几率就会越来越小从而使特征库越来越完善,进一步提高识别的准确度。 6、参考文献(2)冯伟兴著.visual c+数字图

11、像模式识别技术详解.北京:机械工业出版社,2010年9月.(3)张宏林著.精通visual c+数字图像模式识别技术及工程实践.北京:人民邮电出版社,2008年8月.(4)章毓晋著.图像工程(中册)图像分析(第二版).北京:清华大学出版社,2009年7月.(5)谢凤英著.visual c+ 数字图像处理.北京:电子工业出版社,2008年5月.附录:程序清单:1、初始化程序cpatternview:cpatternview/ todo: add construction code heremousedown0;/初始化,使得每个点皆为白点forint i0;i16;i+forint j0;j16

12、;j+bitgraphij0;/初始化,使得坐标序列中的点皆为空点mytime0;fori0;i100;i+mypointi.x-1;mypointi.y-1; mytime0;curvalue-1;mytezhengtezheng *mallocsizeoftezheng;mytezheng-value-1;mytezheng-lenth0;mytezheng-lenth10;fori0;i15;i+mytezheng-vhderectioni-1;mytezheng-decon0;/打开保存模板特征量的文件ifcf.open"mydata.dat",cfile:mode

13、create|cfile:modenotruncate|cfile:modereadwritenullafxmessagebox"打开文件失败,n您最好退出程序"2、创建主界面程序void cpatternview:ondrawcdc* pdccpatterndoc* pdoc getdocument;assert_validpdoc;/*assert_valid是一个断定宏,如果pdoc为null就不继续运行*/ todo: add draw code for native data here/erase the background/ 创建一个面色刷cbrush bru

14、sh rgb 128, 0 , 0 ;/*cbrush是封装了windows图形设备接口(gdi)中画刷的mfc类,用于构造cbrush对象,然后传给需要画刷的cdc成员函数*/cbrush* poldbrush pdc-selectobject &brush;/选择刷到设备上下文/ get the area that needs to be erased擦除)crect rcclip;/crect从tagrect结构派生而来pdc-getclipbox &rcclip;/*该函数得到一个能够完整包含当前可见区域的最小矩形的大小*/paint the areapdc- patb

15、lt rcclip.left , rcclip.top , rcclip.width , rcclip.height , patcopy ;/使用当前选入指定设备环境中的刷子绘制给定的矩形区域pdc-selectobject poldbrush ;/取消选择刷出设备上下文/三个模拟位图按钮cbitmap bitmapstudy,bitmaprecognize,bitmapclear; /*类cbitmap封装了windows图形设备接口(gdi)中的位图*/ cdc dcmemory1,dcmemory2,dcmemory3;/*通过cdc对象的成员函数进行所有的绘图*/bitmapstudy

16、.loadbitmapidb_bitmap_study;/*从模块的可执行文件中加载idb_bitmap_study位图资源*/ dcmemory1.createcompatibledcpdc;/*创建一个与pdc兼容的内存设备上下文环境(dc)*/ dcmemory1.selectobject&bitmapstudy;/*选择bitmapstudy到dcmemory1的上下文环境中*/ pdc-bitblt220, 20, 50, 20, &dcmemory1, 0, 0, srccopy;/*对&dcmemory1中的像素进行位块转换,以传送到目标设备环境*/ bi

17、tmaprecognize.loadbitmapidb_bitmap_recognize; dcmemory2.createcompatibledcpdc; dcmemory2.selectobject&bitmaprecognize; pdc-bitblt220, 80, 50, 20, &dcmemory2, 0, 0, srccopy; bitmapclear.loadbitmapidb_bitmap_clear; dcmemory3.createcompatibledcpdc; dcmemory3.selectobject&bitmapclear; pdc-bi

18、tblt220, 140, 50, 20, &dcmemory3, 0, 0, srccopy;/画板cbrush brushboard rgb 255, 255 , 255 ;/ select the brush into the device contextpoldbrush pdc-selectobject &brushboard;/paint the areapdc- patblt 8,8,176,240, patcopy ;/unselect brush out of device contextpdc-selectobject poldbrush ;pdc-sett

19、extcolorrgb255,255,255;/设置当前环境hdc的字体颜色pdc-settextalignta_center|ta_top;/指定设备环境设置文字对齐标志pdc-setbkmodetransparent;/*transparent是使用透明的输出,也就是文字的背景是不改变的*/3、学习程序void cpatternview:onstudyvoid/输入数字值的对话框inputdialog inputdlg;cf.seektobegin;/定位当前文件指针到文件开头int nfilesizecf.getlength;/获取文件长度int infilesize/sizeoftez

20、heng;tezheng *temp;temptezheng *mallocsizeoftezheng;/计算当前画板中数字的特征值gettezheng;/首先判断当前的数字类型是否已经在模板中forint j0;ji;j+cf.readvoid *temp,sizeoftezheng;/从文件cf的当前位置读数据forint k0;k15;k+iftemp-vhderectionk!mytezheng-vhderectionk /判断水平特征break;ifk15&&temp-deconmytezheng-decon&&temp-lenfirstmytezhe

21、ng-lenfirst&&temp-lenth1mytezheng-lenth1&&temp-lenthmytezheng-lenth&&temp-lenendmytezheng-lenendchar s20;sprintfs,"您输入的是:%d,数据已有",temp-value;afxmessageboxs;break;/说明该数字类型不在模板中ifjiifinputdlg.domodalidok/判断数字输入对话框中的两个数字是否相同ifinputdlg.m_value1!inputdlg.m_value2afxmessa

22、gebox"您的输入有误,n请重新输入"/相同,则将新的数字类型写入模板文件中elsegettezheng;trymytezheng-valueinputdlg.m_value1;cf.seektoend;/定位当前文件指针到文件尾cf.write&mytezheng-value,sizeofsigned char;/将文件数据写入当前文件位置cf.writemytezheng-vhderection,sizeofsigned char*15;cf.write&mytezheng-lenth1,sizeofsigned char;cf.write&m

23、ytezheng-lenth,sizeofsigned char;cf.write&mytezheng-decon,sizeofsigned char;cf.write&mytezheng-lenfirst,sizeofsigned char;cf.write&mytezheng-lenend,sizeofsigned char;catchcfileexception *e/alert user to errore-delete;/end try-catch/end if-else/end if/end ifreturn;4、识别程序void cpatternview:

24、onrecognizevoidcf.seektobegin;int nfilesizecf.getlength;int infilesize/sizeoftezheng;tezheng *temp;temptezheng *mallocsizeoftezheng;/计算特征值gettezheng;/在模板文件中寻找,是否有与当前特征值相同的forint j0;ji;j+cf.readvoid *temp,sizeoftezheng;forint k0;k15;k+iftemp-vhderectionk!mytezheng-vhderectionkbreak;/找到识别结果ifk15&&

25、amp;temp-deconmytezheng-decon&&temp-lenfirstmytezheng-lenfirst&&temp-lenth1mytezheng-lenth1&&temp-lenthmytezheng-lenth&&temp-lenendmytezheng-lenendchar s20;sprintfs,"您输入的是:%d",temp-value;afxmessageboxs;break;/搜索结束ifjiafxmessagebox"抱歉,无法识别"return;5、

26、清除程序void cpatternview:onclearvoidcdc *pdcgetdc;/*检索一指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄,以后可以在gdi函数中使用该句柄来在设备上下文环境中绘图*/cbrush brushboard rgb 255, 255 , 255 ;cbrush poldbrush;pdc- patblt 8,8,176,240, patcopy ;forint i0;i16;i+forint j0;j16;j+bitgraphij0;mousedown0;mytime0;fori0;i100;i+mypointi.x-1;mypointi.y-1

27、;curvalue-1;mytezheng-value-1;mytezheng-lenth0;mytezheng-lenth10;fori0;i15;i+mytezheng-vhderectioni-1;mytezheng-decon0;return;6、特征提取程序void cpatternview:gettezhengint p,q;int i0;/从第一个点到最后一个点forint j0;jmytime-1;j+ifi0mytezheng-lenth1+;ifi13afxmessagebox"内存溢出,呵呵",null,null;return;/判断两个相邻点的距离p

28、mypointj+1.x-mypointj.x*mypointj+1.x-mypointj.x;qmypointj+1.y-mypointj.y*mypointj+1.y-mypointj.y;/如果不是8连接,则为断裂点或者是写的太快ifp1|q1mytezheng-decon1;j+;i+;ifj+1mytime-1afxmessagebox"您可能写得太快了,呵呵",null,null;return;ifmypointj+1.xmypointj.xmytezheng-vhderectioni1;else ifmypointj+1.ymypointj.ymytezhen

29、g-vhderectioni2;else ifmypointj+1.xmypointj.xmytezheng-vhderectioni3;else mytezheng-vhderectioni4;mytezheng-lenth1;/尽量保持目前的方向elseifj0ifmypoint1.xmypoint0.xmytezheng-vhderection01;else ifmypoint1.ymypoint0.ymytezheng-vhderection02;else ifmypoint1.xmypoint0.xmytezheng-vhderection03;else mytezheng-vhde

30、rection04;mytezheng-lenth1;/end ifelseswitchmytezheng-vhderectionicase 1:ifmypointj+1.xmypointj.xi+;mytezheng-lenth1;ifmypointj+1.ymypointj.ymytezheng-vhderectioni2;else ifmypointj+1.ymypointj.ymytezheng-vhderectioni4;else mytezheng-vhderectioni3;else mytezheng-lenth+;break;case 2:ifmypointj+1.ymypo

31、intj.yi+;mytezheng-lenth1;ifmypointj+1.xmypointj.xmytezheng-vhderectioni3;else ifmypointj+1.xmypointj.xmytezheng-vhderectioni1;else mytezheng-vhderectioni4;else mytezheng-lenth+;break;case 3:ifmypointj+1.xmypointj.xi+;mytezheng-lenth1;ifmypointj+1.ymypointj.ymytezheng-vhderectioni4;else ifmypointj+1

32、.ymypointj.ymytezheng-vhderectioni2;else mytezheng-vhderectioni1;else mytezheng-lenth+;break;case 4:ifmypointj+1.ymypointj.yi+;mytezheng-lenth1;ifmypointj+1.xmypointj.xmytezheng-vhderectioni1;else ifmypointj+1.xmypointj.xmytezheng-vhderectioni3;else mytezheng-vhderectioni2;else mytezheng-lenth+;brea

33、k;default:break;/end switch/end else/end else/end forforp0;p4;p+forqp+1;qmytime;q+ifmypointpmypointqbreak;ifqmytimebreak;ifp4mytezheng-lenfirst2;elsemytezheng-lenfirst1;forpmytime-1;pmytime-6;p-forqp-1;q0;q-ifmypointpmypointqbreak;ifq0break;ifpmytime-6mytezheng-lenend2;else mytezheng-lenend1;ifmytez

34、heng-lenth0&&mytezheng-lenth4mytezheng-lenth1;else mytezheng-lenth2;ifmytezheng-lenth14mytezheng-lenth12;else mytezheng-lenth11;7、鼠标左键按下程序void cpatternview:onlbuttondownuint nflags, cpoint point mousedown1;ifpoint.x220&&point.x270&&point.y20&&point.y40onstudy;ifpoint.

35、x220&&point.x270&&point.y80&&point.y100onrecognize;ifpoint.x220&&point.x270&&point.y140&&point.y160onclear;cview:onlbuttondownnflags, point;8、鼠标移动程序void cpatternview:onmousemoveuint nflags, cpoint point / todo: add your message handler code here and/or call defaultcdc *pdcgetdc;/*检索一指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄,以后可以在gdi函数中使用该句柄来在设备上下文环境中绘图*/crgn rgn;/crgn类封装了一个windows图形设备接口(gdi)区域/限制在输入区域的范围内rgn.createrectrgnstartx,starty,startx+stepx*16-1,starty+stepy*16-1;/*用一个矩形区域来初始化一个crgn对象*/pdc-selectcliprgn&rgn;/*选

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论