汉语拼音大写字母规定格式练习系统设计.doc_第1页
汉语拼音大写字母规定格式练习系统设计.doc_第2页
汉语拼音大写字母规定格式练习系统设计.doc_第3页
汉语拼音大写字母规定格式练习系统设计.doc_第4页
汉语拼音大写字母规定格式练习系统设计.doc_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

永 州 职 业 技 术 学 院毕业设计汉语拼音大写字母规定格式练习系统设计 学生姓名:彭 嵩 年级专业:2005级 软件技术 指导老师:胡红宇 副教授 系 部:计算机系湖南永州提交日期:2009年11月20日湖南永州职业技术学院毕业 论文(设计)诚 信 声 明本人郑重声明:所呈交的大专毕业论文(设计),是本人在指导老师的指导下,独立进行研究工作所取得的成果,成果不存在知识产权争议,本设计不含任何其他个人或集体已经发表过的作品成果。本人完全意识到本声明的法律结果由本人承担。 毕业设计作者签名: 200 年 月 日一、毕业设计(论文)的主要内容及依据(任务及背景、工具环境、成果形式、着重培养的能力)二、应收集的资料及主要参考文献三、毕业设计(论文)进度计划起 迄 日 期工 作 进 度备 注 开 题 报 告 (该表格由学生独立完成)建议填写以下内容:1.简述课题的作用、意义,在国内外的研究现状和发展趋势,尚待研究的问题。2.重点介绍完成任务的可能思路和方案;3.需要的主要仪器和设备等。指导教师评语:(建议填写内容:对学生提出的方案给出评语,明确是否同意开题,提出学生完成上述任务的建议、注意事项等) 指导教师签名: 年 月 日目 录摘 要31 前言41.1 本课题的意义以及目标41.1.1 课题意义41.1.2 课题目标41.2 课题内容在国内外研究现状以及水平41.3 系统总体结构设计51.4 基本工作原理及方法61.5 整个毕业设计说明书的结构介绍62 相关的知识和工具72.1 计算机图形学72.2 模式识别72.3 BP神经网络72.4 Visual C+82.5 开发平台及语言83 窗口和书写笔画超范围识别设计93.1 窗口设计93.1.1 背景设计103.1.2 功能键设计103.1.3 格式键设计103.1.4 书写区域四线格设计103.2 书写笔画超范围识别设计113.2.1 功能分析113.2.2 笔画超范围设计分析124 手写汉语拼音大写字母的识别设计124.1 手写拼音大写字母结构分析124.2 系统功能分析154.3 手写大写拼音字母识别方案设计154.3.1 BP神经网络模型分析154.3.2 数据预处理174.3.3 神经网络的建立195 实验效果演示225.1 系统界面225.2 实例操作226 结论25参考文献26致谢 25附录28汉语拼音大写字母规定格式练习系统设计学 生:彭嵩指导老师:胡红宇 (湖南永州职业技术学院计算机系 永州 425000) 摘 要:幼儿教学是人生学习最重要的起点,而幼儿的汉语拼音教学又是孩子们在幼儿时期能够有个良好学习基础的关键之一。本文从方便幼儿学习汉语拼音字母的角度对汉语拼音大写字母规定格式练习进行了深入的理论探讨和程序实践。在手写大写拼音字母识别设计上利用了BP网络理论,先分别对各字母进行特征选择与提取,然后让神经网络对26个大写字母进行模式识别。实验结果显示,系统能够正确识别规定格式下的26个大写汉语拼音字母,该系统能够方便幼儿对汉语拼音字母的学习。关键词:汉语拼音大写字母,规定格式,练习系统,BP神经网络。 第1章 前言1.1 本课题的意义以及目标1.1.1 课题意义汉语拼音是帮助识字和学习普通话的工具。在小学阶段要求熟练掌握声母、韵母、拼音、声调、整体认读音节和一些拼写规则,能按顺序背诵、默写字母表,会用音序查字典;能运用拼音识字,正音和学习普通话。因此对幼儿汉语拼音的教学也就成了一件非常重要的事情。而汉语拼音规定格式练习系统是一种新型数字教学文具,让孩子们能够规范而且正确的学习汉语拼音,提高学习汉语拼音字母的效率。在新世纪里,新的课程目标,新的教学环境,新的教育模式无疑都是促使我们创造出新的教学方法和教学文具的动力。特别是新的课程标准的出台使中国站在了世界教育改革的前列。也使我们教育工作者变革着自己的教育教学思想,向传统教学中陈腐的教学观挑战,以期培养出具有创新精神,合作意识和开放视野,具有包括阅读理解与表达交流在内的多方面素质的人才。在中国,每年都有将近2亿的学前班、小学生开设了习字课,而学习汉语拼音的孩子大多数都是用拼音本采用四线格规定格式的汉语拼音练习本。每年仅小学生练习习字一项就须造32K的纸30多亿张,为造这30多亿张32K的纸需要砍伐的树木数量及造纸产生的污染不言而喻。利用手写板技术取代习字纸张不仅可以大量减少习字用纸,而且有益于小学生从小就接触到高科技技术,使他们能够从小就享受到高科技带来的成果。随着社会的不断进步,教育问题会得到更多关注,幼儿教育需要更加优秀的方法融于其中。通过规定格式下的手写汉语拼音字母练习系统设计可以让幼儿从小养成良好的学习习惯,使汉语拼音的学习变得充满趣味性,从而提高了学习汉语拼音的效率。因此,手写汉语拼音字母规定格式练习系统设计的研究有着重大的现实意义,一旦研究成功并投入商用,将产生巨大的经济和社会效益。1.1.2 课题目标研制出汉语拼音字母、拉丁字母的电脑辅助系统设计,重点研究手写大写拼音字母在规定格式中练习书写模式的识别。建立类文字库在规定格式书写条件下的识别方法。1.2 课题内容在国内外研究现状以及水平汉语拼音方案采用拉丁字母,跟英文的书写比较相似。现在国外英文的手写输入比较成熟,国内的汉字识别技术也有了长足的进步,从简单的单体识别发展到多种字体混排的识别,从中文印刷材料的识别发展到中英文混排材料的双语识别,各个系统可以支持简、繁汉字识别,汉字的识别率达到了98%以上。近来,基于神经网络的模式识别研究发展迅速,利用神经网络进行特征选择与提取技术应用也越来越受到重视,人工神经网络已应用于很多领域,并在许多科研项目上取得了可喜的成果。1.3 系统总体结构设计 系统的总体结构分为以下四个模块元素:(1) 写字板窗口设计:包括窗口背景风格设计,功能格式按钮设计以及书写区域四线格设计。(2) 写字规范化设计:自动对当前一笔画超四线格范围判断处理(该系统的设计是以文字形式提示,展望能够用语音进行提示)。(3)书写字母正确性判断:对当前写好的字母,当点击识别按钮时,系统便会对当前字母进行正确性判断。其中对手写大写拼音字母识别设计是本课题设计的重点,也是整个系统设计的重点和难点。(4) 书写质量分析:对书写正确的字母进行质量分析并根据质量进行评分各模块关系如图1-1所示。窗口设计规范化设计质量分析正确性判断 图1-1模块关系图系统对字母的判断处理过程如图1-2所示。字母输入超范围判断正确性判断书写成绩质量分析图1-2系统判断过程1.4 基本工作原理及方法本设计从模式识别的角度对输入的汉语拼音字母进行识别判断。它主要包括了拼音字母的输入,书写笔画的超范围识别,固定格式下的汉语拼音的识别。拼音字母的输入是直接用鼠标进行书写。笔画的超范围识别采用建立坐标系,对四线格边界坐标进行定位,并自动的随机的记录部分书写笔画的点进行判断处理。其中手写大写汉语拼音字母的识别是本课题研究的重点,也是整个系统的重点和难点。本文先对BP神经网络理论进行了探讨和分析,利用BP神经网络对各字母进行特征选择与提取,并对网络不断的进行样本训练,直到网络对大写字母能够较好的进行识别。1.5 整个毕业设计说明书的结构介绍整个毕业设计说明说由七章以及程序附录清单组成。第一章是概述,介绍了本课题的意义、目标以及国内外发展现状;第二章介绍系统设计中所用到的相关基础知识和工具:介绍了计算机图形学,模式识别技术,BP神经网络等;第三章介绍写字板窗口设计和字母超范围识别设计;第四章是本课题设计的重点,介绍了基于BP神经网络的大写字母识别设计;第五章是对设计效果的分析;第六章是结束语:简单分析了本系统的特色与成功、问题与展望,并对本次毕业设计做了总结以及致辞;附录是系统的部分核心源代码。第2章 相关的知识和工具2.1 计算机图形学计算机图形学是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。图形通常由点、线、面、体等几何元素和灰度、色彩、线型、线宽等非几何属性组成。从处理技术上来看,图形主要分为两类,一类是基于线条信息表示的,如工程图、等高线地图、曲面的线框图等,另一类是明暗图,也就是通常所说的真实感图形。计算机图形学一个主要的目的就是要利用计算机产生令人赏心悦目的真实感图形。它的研究内容非常广泛,如图形硬件、图形标准、图形交互技术、光栅图形生成算法、曲线曲面造型、实体造型、真实感图形计算与显示算法、非真实感绘制,以及科学计算可视化、计算机动画、自然景物仿真、虚拟现实等。2.2 模式识别模式识别又常称作模式分类,从处理问题的性质和解决问题的方法等角度,模式识别分为有监督的分类和无监督的分类两种。模式识别是人类的一项基本智能,在日常生活中,人们经常在进行“模式识别”。随着20世纪40年代计算机的出现以及50年代人工智能的兴起,人们当然也希望能用计算机来代替或扩展人类的部分脑力劳动。模式识别在20世纪60年代初迅速发展并成为一门新学科。 模式识别研究主要集中在两方面,一是研究生物体(包括人)是如何感知对象的,属于认识科学的范畴,二是在给定的任务下,如何用计算机实现模式识别的理论和方法。前者是生理学家、心理学家、生物学家和神经生理学家的研究内容,后者通过数学家、信息学专家和计算机科学工作者近几十年来的努力,已经取得了系统的研究成果2.3 BP神经网络BP (Back Propagation)神经网络是一种神经网络学习算法,全称基于误差反向传播算法的人工神经网络。一般为三层网络模型,即:输入层、中间层(也称隐层)和输出层。它的特点是:各层神经元仅与相邻层神经元之间相互全连接,同层内神经元之间无连接,各层神经元之间无反馈连接,够成具有层次结构的前馈型神经网络系统。单计算层前馈神经网络只能求解线性可分问题,能够求解非线性问题的网络必须是具有隐层的多层神经网络。在人工神经网络发展历史中,很长一段时间里没有找到隐层的连接权值调整问题的有效算法。直到误差反向传播算法(BP算法)的提出,成功地解决了求解非线性连续函数的多层前馈神经网络权重调整问题。BP (Back Propagation)神经网络,即误差反传误差反向传播算法的学习过程,由信息的正向传播和误差的反向传播两个过程组成。输入层各神经元负责接收来自外界的输入信息,并传递给中间层各神经元;中间层是内部信息处理层,负责信息变换,根据信息变化能力的需求,中间层可以设计为单隐层或者多隐层结构;最后一个隐层传递到输出层各神经元的信息,经进一步处理后,完成一次学习的正向传播处理过程,由输出层向外界输出信息处理结果。当实际输出与期望输出不符时,进入误差的反向传播阶段。误差通过输出层,按误差梯度下降的方式修正各层权值,向隐层、输入层逐层反传。周而复始的信息正向传播和误差反向传播过程,是各层权值不断调整的过程,也是神经网络学习训练的过程,此过程一直进行到网络输出的误差减少到可以接受的程度,或者预先设定的学习次数为止。2.4 Visual C+Visual C+是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出Visual C+1.0后,随着其新版本的不断问世,Visual C+已成为专业程序员进行软件开发的首选工具。虽然微软公司推出了Visual C+.NET(Visual C+7.0),但它的应用的很大的局限性,只适用于Windows 2000,Windows XP和Windows NT4.0。所以实际中,更多的是以Visual C+6.0为平台。Visual C+6.0不仅是一个C+编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrated development environment,IDE)。Visual C+6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。 这些组件通过一个名为Developer Studio的组件集成为和谐的开发环境。2.5 开发平台及语言操作系统:Windows XP Professional开发工具:Microsoft Visual C+6.0 MFC开发语言:C+,C+语言是一种优秀的面向对象程序设计语言,它在C语言的基础上发展而来,是它的一个超集,与C语言兼容。所以一方面,它继承了传统程序设计C语言的优点,克服了其不足;另一方面又在面向对象特征及非面向对象特征着两个方面增加了新的功能,使得它既适合于结构化程序设计,又能满足面向对象程序设计的要求。符合广大成形术人员逐步更新其程序设计观念和方法的要求,因而很快流行起来,成为当今最为流行的程序设计语言。Microsoft基本类库(MFC)的核心是一个大部分以C+封装的WindowsAPI。库中的了封装了代表窗口,对话框等。这些类为它们封装的Windows中的结构提供了一个良好的C+成员函数接口。除此以外,Microsoft基本类库还提供一个建立在WindowsAPI的C+封装上的附加应用功能层次结构。这个层次结构师一个Windows应用框架,它提供了windows编程所用的通用界面,包括工具栏,状态栏打印,打印预览,数据库支持和ActivX支持。运行环境最小配置要求:CPU:166兆赫(MHZ)Pentium级处理器以上内存:64兆(M)以上显卡:Direct 3D(16M以上)硬盘:500兆(M)以上软件:Windows 95/98/2000/XP/2003 操作系统第3章 窗口和书写笔画超范围识别设计3.1 窗口设计 根据系统的功能需求,窗口背景设计分为四个方面:背景设计,功能键设计,格式键设计,书写区域四线格设计。3.1.1 背景设计广大在校的学前班,小学生都采用四线格练习本进行练习,针对这一现状而提出了汉语拼音字母规定格式练习系统课题,该系统将来的用户群可能都是些幼儿、小学生,对于此,有必要将窗口的背景尽量设计的卡通一点、可爱一点,以增加对儿童的吸引力,提高他们的使用兴趣。 比如可以在窗口背景隐隐约约设计一些比较流行的卡通人物图案,或者一些比较鲜艳的花纹,而或可根据喜好随时变换背景图案。3.1.2 功能键设计功能键就是用户用其来操作命令系统“干事”的按钮,根据事先的功能需求,可以知道需要预设以下五个功能键:(1) 识别键:对书写好的字母进行识别,给出正误判断;(2) 重写键:对已写下的所以有字母笔画进行“清理工作”,使系统恢复到初始状态;(3) 消除前一笔:对当前写下的一笔进行“清理”;(4) 消除前一字:对当前写下的字母进行“清理”;(5) 消除当前行:对刚书写的一整行进行“清理”。3.1.3 格式键设计虽然汉语拼音字母是采用四线格进行书写练习的,但为了方便系统以后的改进升级,可以预设几个比较常用格式的格式键,扩大系统的使用功能,使系统不单单提供汉语拼音字母练习,还可以对汉字进行练习,以满足不同需要的用户。比方说可以预设以下三个格式键:(1) 四线格:汉语拼音字母练习;(2) 田字格:汉字练习;(3) 方子格:汉字或汉语拼音字母练习3.1.4 书写区域四线格设计根据书写量的需要,将整个书写区域设计了四条四线格。系统最终的窗口如图3-1所示,在四线格上进行字母书写后的效果如图3-2所示。 图3-1写字板窗口图3-2 书写字母效果图3.2 书写笔画超范围识别设计3.2.1 功能分析汉语拼音字母大小写共有52个,在本章节中将介绍对52个拼音字母的超范围识别设计。要求系统能够自动对当前的一笔画进行超范围判断,一旦当前笔画超出范围,要求系统能够给出相应的超范围提示,并会将无法继续书写,只有通过重写键或任一消除键将当前超范围的笔画消除后,才能继续书写。根据功能分析可得系统对字母笔画超范围的判断过程,如图3-3所示。开始字母笔画输入输出超范围提示判断是否超范围消除当前笔画NY是否继续书写结束NY图3-3系统超范围识别过程3.2.2 笔画超范围设计分析系统写字区共设计了四条四线格,可对四条四线格的上下边线在空间坐标系中进行定位,让系统自动的随机的对笔画落点进行提取,并判断是否有点落在了事先已被定位的边界外,一旦有落点超出边界,便以弹出对话框的形式进行提示。第4章 手写汉语拼音大写字母的识别设计4.1 手写拼音大写字母结构分析 专门针对小学生汉语拼音字母练习而设计的系统,手写汉语拼音大写字母的设计是本课题设计的重点,也是整个系统设计的重点和难点。设计的关键点是在规定格式的基础上进行大写字母识别,因为是规定格式这就要求系统在对字母书写正确性判断的同时,还要对字母笔画的位置进行判断,比如大写字母只能写在四线格的上两格,这给系统设计增添了难度。根据其针对性,有必要对小学生字母书写状况做一个调查报告。通过对一定数量的小学生的汉语拼音字母练习本的字母书写情况进行调研后发现,大家在大写字母的书写过程中,对相同的一字母,其书写结构千奇百态,有很多书写形状用肉眼直观可判断是正确的,但书写的十分不规范,系统辨别十分困难。将调查结果分析后,可将字体的不规范分为以下几类:(1) 字母位置错。这种错误是指书写大写汉语拼音字母时,字母占错了四线格的位置或超出了四线格,如图4-1所示。(2) 字母形体不规范。这其中又可分为以下几类:a. 大小写混写,如“y”写成“Y”或“Y”写成“y”,“k”写成“K”或“K”写成“k”,如图4-2所示。b. 字母书写偏斜,这种错误是指书写的字母东倒西歪,如图4-3所示。c. 笔画不清晰,这种错误是指书写的字母笔画有重叠或笔画歪歪扭扭太潦草,如图4-4所示。d. 字母书写不紧凑,这种错误是指书写时太过随意,笔画不紧凑,该衔接的地方有空隙,如图4-5所示。e. 字母笔画位置错误,这种错误是指字母书写时,虽然字符整体书写正确,但字母有笔画在四线格的位置不正确,如图4-6所示。以上都是本课题设计时应该注意的地方,也是本科题的设计难点。图4-1字母位置错误图4-2大小写混写图4-3字母书写偏斜图4-4字母笔画不清晰图4-5字母书写不紧凑图4-6字母笔画位置错误4.2 系统功能分析 汉语拼音字母大小写共有52个,在本章节中将介绍对26个大写字母的识别设计。系统能够识别随机书写在四线格上的任一个字母,要求系统能够对字母笔画的正确性和位置的正确性(大写字母应都写在四线格的上中两格)同时给出判断,当两者都规范正确时,系统会给出书写正确的提示,当其中有一项不符合要求时,系统会给出无法识别的提示。系统对字母的识别过程如图4-7所示。结束开始字母写入无法识别书写正确字母笔画是否正确字母位置是否正确NNYY图4-7系统识别过程4.3 手写大写拼音字母识别方案设计4.3.1 BP神经网络模型分析本课题采用人工智能中的BP神经网络来对26个大写字母分别进行特征选择与提取。BP神经网络采用三层网络结构:输入层、隐含层、输出层,其网络结构模型如图4-8所示。输出层神经元隐含层输入层神经元. X1 X2 X3 Xm 输 入 模 式 输 出 模 式 Y1 Y2 Y3 Yn输出层隐含层神经元输入层图4-8 三层BP神经网络设输入节点为Xi,隐层节点为Yj,输出节点为Zk,对应节点的阈值为O。输入节点与隐层节点的网络权值为Wji,隐层节点与输出节点间的网络权值为Vkj。当输出节点的期望值为Tk时,则输出节点的误差计算公式如下:隐层节点的输出 Yj = f(Wji Xi - Oj) ;输出节点的输出 Zk= f(Wkj Yj - Ok) ;则输出节点的误差为 E=1/2(Tk-Zk)2基于BP人工神经网络的字母特征选择与提取的整个算法流程图如图4-9所示。开始结束计算正确诊断率数据预处理,形成训练样本集输出与最小正确诊断率对应的特征参数训练神经网络,获得连接权值根据输入输出设计前向神经网络恢复删除前的特征参数形成新的训练样本集上次特征删除不合理根据检测样本判断网络合理性合理不合理 图4-9 特征选择流程图4.3.2 数据预处理当给训练过的网络一个表示某一字母的输人时,要求网络能够正确地在输出端指出该字母,也就是要求网络记住所有26个字母。但神经网络仅能够处理数据,所以设计一个神经网络能够识别26个大写拼音字母,须先将其转化成神经网络所能够接收的输入输出数据,即需要有个预处理过程。根据字母的网格图(如图4-10字母“A”的网格图和图4-11字母“Z”的网格图),考虑用“57”矩阵的布尔值可以清楚地表示出每个字母,即用26组数据矩阵分别表示字母“A”到“Z”的数组,例如字母“A”和“Z”分别可以用“0”、“l”矩阵表示为:Letter A=0 0 1 0 0, 0 1 0 1 0, 0 1 0 1 0, 1 0 0 0 1 , 1 1 1 1 1 , 1 0 0 0 1 , 1 0 0 0 1 图4-10 字母A的网格图Letter Z=1 1 1 1 1 , 0 0 0 0 1 , 0 0 0 1 0 , 0 0 1 0 0 , 0 1 0 0 0 , 1 0 0 0 0, 1 1 1 1 1 图4-11 字母Z的网格图这样26个字母均被定义成输入向量,每个代表字母的输入向量均有35个元素,这样就组成一个输入向量矩阵。期望输出向量被定义成一个变量targets,期望输出向量含有26个元素,字母在字母表中所占位置处元素为1,其他位置为0。例如,因为A在字母表中为第一个字母,所以其期望输出向量为(1,0,.,0)。4.3.3 神经网络的建立(1)网络结构网络输入向量具有35个元素,网络输出就是反映字母所在位置的具有26个元素的输出向量。如果网络设计正确,那么输入一个字母,网络就能输出一个向量,它对应位置的元素值为1,其他位置的元素值为0.因为针对手写汉语大写拼音字母的书写不可能十分标准,所以网络不可能接收到一个理想的布尔向量作为输入,所以网络还必须具有容错能力。对于辨识字母的要求,所设计的三层BP神经网络采取35-10-26的结构,即输入层具有35个输人节点,输出层有26个输出神经元,网络隐含层有10个神经元(隐含层神经元数越多,网络的辨识精度越高)。隐层和输出层的神经元传递函数均为logsigmoid(),这是因为logsigmoid()函数输出量在(0,1)区间内,恰好满足输出布尔值的要求。(2)初始化利用结构体构造一个三层BP神经网络,并对其进行初始化,部分源代码如下所示:#define OUT_COUT 26 /输出向量维数#define IN_COUT 35 /输入向量维数#define COUT 10 /样本数量typedef struct /bp人工神经网络结构int h; /实际使用隐层数量double vIN_COUT10; /隐藏层权矩阵idouble w10OUT_COUT; /输出层权矩阵double a; /学习率double b; /精度控制参数int LoopCout; /最大循环次数 bp_nn;int InitBp(bp_nn *bp) /初始化bp网络 int i, j , a=0.7 ,b=0.1, LoopCout=300; srand(unsigned)time(NULL); for (i = 0; i IN_COUT; i+) for (j = 0; j (*bp).h; j+) (*bp).vij = rand() / (double)(RAND_MAX); for (i = 0; i (*bp).h; i+) for (j = 0; j f & n LoopCout; n+) /对每个样本训练网络 e = 0; for (j = 0; j OUT_COUT; j+) ChgOj = 0; for (j = 0; j h; j+) ChgHj = 0; for (j = 0; j h; j+) for (k = 0; k OUT_COUT; k+) Ch_wjk = 0; for (j = 0; j IN_COUT; j+) for (k = 0; k h; k+) Ch_vjk = 0; for (i= 0; i COUT; i+) for (k= 0; k h; k+) /计算隐层输出向量 temp = 0; for (j = 0; j IN_COUT; j+) temp = temp + xij * vjk; O1k = fnet(temp); for (k = 0; k OUT_COUT; k+) /计算输出层输出向量 temp = 0; for (j = 0; j h; j+) temp = temp + O1j * wjk; O2k = fnet(temp); for (j = 0; j GetWindow()-GetClientRect(&clientRect);writableRect.left=clientRect.left+paddingRect.left;writableRect.top=clientRect.top+paddingRect.top;writableRect.right=clientRect.right-paddingRect.right;writableRect.bottom=clientRect.bottom-paddingRect.bottom;operatRect.left=writableRect.right+paddingRect.left;operatRect.right=clientRect.right;operatRect.bottom=clientRect.bottom;operatRect.top=clientRect.top;dc-SelectObject(borderPen);dc-Rectangle(writableRect);/画出可写方框 CBrush brush(COLORREF(RGB(239,237,221);dc-FillRect(&operatRect,&brush);CPoint beginPt,endPt;/画线的起点和终点beginPt.x=writableRect.left;/第一条线的起点和终点beginPt.y=writableRect.top+outSpacing;endPt.x=writableRect.right;endPt.y=beginPt.y;for(int i=0;icount;i+)/画出count 个四线格for(int j=0;jSelectObject(outLinePen);else dc-SelectObject(inLinePen);dc-MoveTo(beginPt);dc-LineTo(endPt);if(j!=3) beginPt.y+=inSpacing; endPt.y+=inSpacing;beginPt.y+=outSpacing;endPt.y+=outSpacing;BOOL Draw:pointInRect(CPoint pt,CRect rt)if(pt.xrt.right|pt.xrt.bottom|pt.ywritableRect;VOID Draw:onWrite(CClientDC *dc,CPoint org,CPoint dest)/笔迹的输出与书写点的记录if(!compatDc.m_hDC)compatDc.CreateCompatibleDC(dc);CRect dcRect;dc-GetWindow()-GetClientRect(&dcRect);CBitmap bitmap;bitmap.CreateCompatibleBitmap(dc,dcRect.Width(),dcRect.Height();compatDc.SelectObject(&bitmap);compatDc.BitBlt(0,0,dcRect.Width(),dcRect.Height(),dc,0,0,SRCCOPY);CBrush brush(COLORREF(RGB(0,0,0);compatDc.SelectObject(&brush);CPen *oldPen=dc-SelectObject(&writePen);compatDc.SelectObject(&writePen);compatDc.MoveTo(org);compatDc.LineTo(dest);dc-MoveTo(org);dc-LineTo(dest);dc-SelectObject(oldPen);CDC *Draw:getComdc()return &compatDc;/ LetterRecDoc.cpp : implementation file#include LetterRecDoc.h #include stdafx.h#include LetterRec.h#include Draw.h#include #include LetterRecView.husing namespace std;/typedef deque CRectLink;#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/DECLARE_HANDLE(HDIB);/CRectLink m_charRectCopy;CRect m_charRect;int num,Time;/ 建立保存特征向量的二维数组int xx,yy;int shu100;void show(HDIB hDIB);HDIB AutoAlign(HDIB hDIB);HDIB WINAPI NewDIB(long width, long height,unsigned short biBitCount) ;WORD WINAPI PaletteSize(LPSTR lpbi);void GradientSharp(HDIB hDIB);LPBYTE BmpToDIB(HDC hDC, HBITMAP hBitmap, int nBits);void ConvertGrayToWhiteBlack(HDIB hDIB);WORD WINAPI DIBNumColors(LPSTR lpbi);void Convert256toGray(HDIB hDIB);CRect CharSegment(HDIB hDIB);void DisplayDIB(CDC* pDC,HDIB hDIB);void StdDIBbyRect(HDIB hDIB, int tarWidth, int tarHeight);LPSTR WINAPI FindDIBBits(LPSTR lpbi);DWORD WINAPI DIBHeight(LPSTR lpDIB);DWORD WINAPI DIBWidth(LPSTR lpDIB);void ClearAll(CDC *pDC);void DrawFrame(CDC* pDC,HDIB hDIB, CRect charRect,unsigned int linewidth,COLORREF color);BOOL WINAPI PaintDIB(HDC hDC,LPRECT lpDCRect,HDIB hDIB,LPRECT lpDIBRect,CPalette* pPal);#define IS_WIN30_DIB(lpbi) (*(LPDWORD)(lpbi) = sizeof(BITMAPINFOHEADER)/ 计算矩形区域的宽度#define RECTWIDTH(lpRect) (lpRect)-right - (lpRect)-left)/ 计算矩形区域的高度#define RECTHEIGHT(lpRect) (lpRect)-bottom - (lpRect)-top)/ 在计算图像大小时,采用公式:biSizeImage = biWidth biHeight。/ 是biWidth,而不是biWidth,这里的biWidth必须是4的整倍数,表示/ 大于或等于biWidth的,离4最近的整倍数。WIDTHBYTES就是用来计算/ biWidth#define WIDTHBYTES(bits) (bits) + 31) / 32 * 4)int w_sample=36,h_sample=40;int xmax,ymax,xmin,ymin,k; /随时纪录书写过程中的书写范围int digicount=10;/存储书写笔迹的坐标序列,按笔划存储,每个笔划最多300个点/每个字最多15个笔划struct int x;int y;store10100;LPBYTE h1DIB;HDIB KK;/ CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialogpublic: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/ Implementationprotected:/AFX_MSG(CAboutDlg)/AFX_MSGDECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)/AFX_DATA_INIT(CAboutDlg)/AFX_DATA_INITvoid CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CAboutDlg)/AFX_DATA_MAPBEGIN_MESSAGE_MAP(CAboutDlg, CDialog)/AFX_MSG_MAP(CAboutDlg)/ No message handlers/AFX_MSG_MAPEND_MESSAGE_MAP()/ Recognize.cpp: implementation of the Recognize class.#include stdafx.h#include LetterRec.h#include Recognize.h#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE=_FILE_;#define new DEBUG_NEW#endif/ Construction/Destruction#include “stdlib.h”#include “math.h”#include “stdio.h”#include “time.h”#define OUT_COUT 26 /输出向量维数#define IN_COUT 35 /输入向量维数#define COUT 10 /样本数量typedef struct /bp人工神经网络结构int h; /实际使用隐层数量double vIN_COUT10; /隐藏层权矩阵idouble w10OUT_COUT; /输出层权矩阵double a; /学习率double b; /精度控制参数int LoopCout; /最大循环次数 bp_nn;int InitBp(bp_nn *bp) /初始化bp网络 int i, j , a=0.7 ,b=0.1, LoopCout=300; srand(unsigned)time(NULL); for (i = 0; i IN_COUT; i+) for (j = 0; j (*bp).h; j+) (*bp).vij = rand() / (double)(RAND_MAX); for (i = 0; i (*bp).h; i+) for (j = 0; j OUT_COUT; j+) (*bp).wij = rand() / (double)(RAND_MAX); return 1;int TrainBp(bp_nn *bp, float xCOUTIN_COUT, int yCOUTOUT_COUT) /训练bp网络,样本为x,理想输出为y double f = (*bp).b; /精度控制参数 double a = (*bp).a; /学习率 int h = (*bp).h; /隐层节点数 double vIN_COUT50, w50OUT_COUT; /权矩阵 double Ch_vIN_COUT50, Ch_w50OUT_COUT; /权矩阵修改量 double ChgH50, ChgOOUT_COUT; /修改量矩阵 double O150, O2OUT_COUT; /隐层和输出层输出量 int LoopCout = (*bp).LoopCout; /最大循环次数 int i, j, k, n; double temp; for (i = 0; i IN_COUT; i+) / 复制结构体中的权矩阵 for (j = 0; j h; j+) vij = (*bp).vij; for (i = 0; i h; i+) for (j = 0; j f & n LoopCout; n+) /对每个样本训练网络 e = 0; for (j = 0; j OUT_COUT; j+) ChgOj = 0; for (j = 0; j h; j+) ChgHj = 0; for (j = 0; j h; j+) for (k = 0; k OUT_COUT; k+) Ch_wjk = 0; for (j = 0; j IN_COUT; j+) for (k = 0; k h; k+) Ch_vjk = 0; for (i= 0; i COUT; i+) for (k= 0; k h; k+) /计算隐层输出向量 temp = 0; for (j = 0; j IN_COUT; j+) temp = temp + xij * vjk; O1k = fnet(temp); for (k = 0; k OUT_COUT; k+) /计算输出层输出向量 temp = 0; for (j = 0; j h; j+) temp = temp + O1j * wjk; O2k = fnet(temp); for (j = 0; j OUT_COUT ; j+) /计算输出误差 e = e + (yij - O2j) * (yij - O2j); for (j = 0; j OUT_COUT; j+) ChgOj = O2j * (1 - O2j) * (yij - O2j); for (j = 0; j h; j+) for (k = 0; k OUT_COUT; k+) Ch_wjk += a * O1j * ChgOk; /累加所有样本训练后的改变量 for (j = 0; j h; j+) temp = 0; for (k = 0; k OUT_COUT; k+) temp = temp + wjk * ChgOk; ChgHj = temp * O1j * (1 - O1j); for (j = 0; j IN_COUT; j+) for (k = 0; k h; k+) Ch_vjk += a * xij * ChgHk; /累加所有样本训练后的改变量,消除样本顺序影响 for (j = 0; j h; j+) /修改输出层权矩阵 for (k = 0; k OUT_COUT; k+) wjk = wjk + Ch_wjk; for (j = 0; j IN_COUT; j+) /修改隐藏层权矩阵 for (k = 0; k h; k+) vjk = vjk + Ch_vjk; for (i = 0; i IN_COUT; i+) /把结果复制回结构体 for (j = 0; j h; j+) (*bp).vij = vij; for (i = 0; i h; i+) for (j = 0; j OUT_COUT; j+) (*bp).wij = wij; return 1;int UseBp(bp_nn *bp, float xCOUTIN_COUT, int yCOUTOUT_COUT) /使用bp网络 float InputIN_COUT; double O150; double O2OUT_COUT; /O1为隐层输出,O2为输出层输出 while (1) /持续执行,除非中断程序 int i, j; for (i = 0; i IN_COUT; i+)for (j = 0; j COUT; j+) Inputi=xCOUTIN_COUT); double temp; for (i = 0; i (*bp).h; i+) temp = 0; for (j = 0; j IN_COUT; j+) temp += Inputj * (*bp).vji; O1i = fnet(temp); for (i = 0; i OUT_COUT; i+) temp = 0; for (j = 0; j (*bp).h; j+) temp += O1j * (*bp).wji; O2i = fnet(temp); return 1;int main() float xCOUTIN_COUT = 0 0 1 0 0,0 1 0 1 0,0 1 0 1 0,1 0 0 0 1 , 1 1 1 1 1 ,1 0 0 0 1 ,1 0 0 01, 1 1 1 1 1 ,0 0 0 0 1 ,0 0 0 1 0 ,0 0 1 0 0 ,0 1 0 0 0 ,1 0 0 0 0,1 1 1 1 1,.; /训练样本 int yCOUTOUT_COUT = 1,0,0,0,.0,0,.,0,1; /理想输出 bp_nn bp; InitBp(&bp); /初始化bp网络结构 TrainBp(&bp, x, y); /训练bp神经网络 UseBp(&bp, x, y); /测试bp神经网络 return 1;Recognize:Recognize()yu=3;yu1=5;yu2=4;Clear();OnOpenMenu();Recognize:Recognize()void Recognize:OnRecg() int j1,k1,m1,n1,x,y,xmod,ymod;/xmod,ymod;int flagok2=0;char s20;DealData();/安次序检验,有点下标数for(j1=0;j1=0&flagok2=0;j1+) if(tezj1.total=test.total) /如果总条数相等 for(k1=0;k1test.total) /每条得点数相同 for(m1=0;m1=test.total;m1+) /每条 for(n1=0;n1=test.dianm1;n1+) /每点xmod=2*(tezj1.detailm1n1.region % 8); /8等分ymod=2*(int)tezj1.detailm1n1.region/8);x=test.detailm1n1.region % 16;y=(int)test.detailm1n1.region/16; / 5/16if( test.detailm1n1.relate!=tezj1.detailm1n1.relate&(test.detailm1n1.relate-10*(int)(test.detailm1n1.relate/10)!=tezj1.detailm1n1.relate&(int)(test.detailm1n1.relate/10)!=tezj1.detailm1n1.relate)|(tezj1.detailm1n1.arc!=test.detailm1n1.arc)&(test.total4)&(test.dianm14)|(xxmod+3)|(yymod+3)/shi为total+1break;if(n1test.total)flagok2=1;AfxMessageBox(s); if(flagok2=0) AfxMessageBox(书写正确,当前所写字母为“ %s”,小乖乖继续哦!); void Recognize:DealData() int i,j,k,num1,Time1;Inorder();for(num1=0;storenum10.x-1;num1+) /第几条线for(Time1=0,j=0;storenum1Time1.x-1;Time1+) if(Time1=0)queuej=Time1;j+;if(Time10&storenum1Time1+1.x=-1)queuej=Time1;j+;if(Time10&storenum1Time1+1.x!=-1)if(storenum1Time1+1.x-storenum1Time1.x)*(storenum1Time1-1.x-storenum1Time1.x)0|(storenum1Time1+1.y-storenum1Time1.y)*(storenum1Time1-1.y-storenum1Time1.y)0)queuej=Time1;j+;if (storenum1Time1-1.x-storenum1Time1.x=0)/&(storenum1Time1+1.x-storenum1Time1.x!0)for(i=1;storenum1Time1-1-i.x=storenum1Time1-1.x&(Time1-1-i)=0;i+);if(storenum1Time1+1.x-storenum1Time1.x)*(storenum1Time1-1-i.x-storenum1Time1.x)0)queuej=Time1;j+;if (storenum1Time1-1.y-storenum1Time1.y=0)/&(storenum1Time1+1.y-storenum1Time1.y)=0;i+);if(storenum1Time1+1.y-storenum1Time1.y)*(storenum1Time1-1-i.y-storenum1Time1.y)0)queuej=Time1;j+;k=Ridnoise(j); /共j点,0到j-1Save(k);int Recognize:Ridnoise(int j) /返回k+1个特征点int i,k,ff;k=0;ff=test.total+1; /ff,当前的处理条数,total为已存条数的最大下标queue1

温馨提示

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

评论

0/150

提交评论