基于微信小程序的可手写算式计算器设计

2020-07-25 04:41:02宋汝良施运渊
江苏科技信息 2020年16期
关键词:字符识别计算器手写

宋汝良,施运渊

(上海梦创双杨数据科技股份有限公司,上海 200333)

0 引言

随着人们越来越追求生活的便利,普通计算器已无法满足人们的需求。手写计算器允许用户像在纸上一样在自己的移动电话或平板电脑上写不同的公式,并获得计算结果。由于手写计算器学习成本低,操作简单,它为人们的学习、工作和生活带来了极大的便利。

1 项目背景

可手写算式计算器首先要求能对手写的文字、数字及符号进行识别。光学字符识别技术为这一需求提供了条件。光学字符识别(Optical Character Recognition,OCR)是指通过电子设备(例如扫描仪或数码相机)检查打印在纸上的字符,通过检测深色和明亮图案确定形状,然后将形状转换为使用字符识别方法的计算机文本[1]。手写字符识别一直是模式识别领域研究的前沿领域,在图像处理中对手写文档的OCR有很大的需求。研究人员已经提出了许多用于字符识别的方法,历史上字符识别系统已经发展了大致3个时代[8]。最早的字符识别器出现在20世纪40年代中期,直到1980年的研究都受到强大的计算机硬件和数据采集的推动。然而,字符识别研究主要集中在不使用任何语义信息的形状识别技术上。1990年后,字符识别系统的真正进步是在不断增长的信息技术的支持下使用新的方法和开发工具实现的。20世纪90年代初期,图像处理和模式识别技术与人工智能方法有效结合。如今,除了功能更强大的计算机和诸如照相机、扫描仪和电子平板电脑之类的精确电子设备外,研究人员还有效利用了诸如隐马尔可夫模型、神经网络等方法。市面上也出现了各种开源OCR库,其中的Tesseract非常强大,它可以支持包括中文在内的60多种语言的识别,并且可以由用户自定义字体。我们将手写字体作为一种自定义字体,便可以利用Tesseract库对手写文本进行识别。

在对图像中的文本进行识别前,使用阈值分割[2]等方法对图像进行处理时常用的手段。阈值化是最简单的图像分割方法,阈值可用于从灰度图像中创建二进制图像。二值图像还可通过分割方法由彩色图像生成。分割是将源图像中的每个像素分配给两个或更多类的过程。阈值分割技术中,常用的阈值选取方法包括灰度直方图峰谷法[3]、最小误差法[4]、Otsu法[5]、最大熵自动阈值法[6-7]等。其中Otsu法被认为是阈值选取的最优方法之一。

网络时代的来临为人们的生活带来了极大便利,手机等移动端产品越来越普及。微信作为智能终端下跨平台的即时通信工具,具有十分庞大的用户群体[9]。为了进一步方便用户体验手写计算器的便利,我们以微信小程序的形式呈现最终的程序。微信小程序是一种无须下载即可使用的应用程序,它基于微信这一广泛使用的应用程序,以类似于网页应用的形式呈现给用户。用户可以通过扫描二维码或在微信中进行搜索来打开应用程序。

2 项目介绍

本项目是一个微信小程序,可用于识别和计算手写数学公式。进入小程序后,有两个界面:识别界面和个人信息界面。在识别界面中,用户可以选择直接手写数学公式进行计算,也可以上传照片进行识别。编写公式时,如果输入有误,则可以使用“橡皮擦”功能擦除书写的部分或选择清空画布。上载照片将要求用户使用相机授予小程序并获得相册。用户选择照片后,单击“上载”按钮将照片上载到服务器。我们将使用Python脚本和Tesseract来处理,识别和计算用户上传的图像。识别结果和计算结果将返回给用户。用户可以选择收集此计算。在个人信息界面中,用户可以查看个人收藏夹和历史记录并管理收藏夹。项目具有如下具体功能:

(1)识别手写算式。微信小程序提供了一个画布控件,可用于获取用户手指在控件范围内的移动。我们为画布设置浅色背景,并用黑色标记书写轨迹,可以有效增强前景背景的对比度,从而提高识别精度。

(2)识别图片中的算式。对于用户上传的图像,我们使用阈值分割等方法对图像进行处理,并将其转换为清晰的二进制图像以进行识别。

(3)计算结果。识别结果将首先转换为特定的格式字符串,以表示数学公式及其空间结构。然后使用python脚本来处理和计算字符串以获得最终结果。

(4)收藏与历史。用户可以选择在返回结果后收藏或取消收藏,或者在个人信息界面中查看历史记录和管理收藏。

3 技术细节

3.1 微信小程序的设计与实现

微信小程序基于MCCM框架的思想,网页与数据紧密结合。数据上的每次更改都会更改或重新呈现网页。在微信小程序中,这种操作是通过功能“setData”来实现的,在该功能中传递了重新渲染功能。

图1 可手写算式计算器微信小程序首页

本文所提出的可手写算式计算器的微信小程序首页设计如图1所示。首页分为3个主要模块,分别为图片识别(浅色区域)、手写识别(深色区域)和下方的任务栏。用户可以选择使用图片识别功能,来识别图片中的算式并获取计算结果。当选择手写识别功能时,用户可以在屏幕上手写算式并识别、计算。图片识别和手写识别模块如图2所示。

图2 图片识别(左)和手写识别(右)

我们也提供了收藏和查看计算历史的功能,帮助用户快速找到之前计算过的结果。收藏和历史功能的界面如图3所示。

图3 收藏功能(左)和历史功能(右)

3.2 后端模型

本项目后端使用Django框架。我们共设计了两个Django模型,分别为WeUser模型和RecognizeItem。WeUser用来保存用户信息以及和数据库交互。RecognizeItem模型用来保存每次的识别记录。本项目共包含9个视图,分别对应图片上传、识别、计算、收藏、取消收藏,以及识别记录、用户信息、识别历史、收藏的查询等。

3.3 Tesseract库的应用

3.3.1 Tesseract模型训练

我们选择数学字符集来训练模型,并生成了训练数据的标准模式。一个标准的训练数据集合示例如图4所示。

图4 Tesseract模型训练数据示例

我们将数学符号作为一种新的字体。这种新的字体被用于训练并被保存,之后我们使用了辅助工具(jTessBoxEditor.jar等)对训练结果进行更正,以获得更精准的结果。

3.3.2 识别

所有被捕获或者上传的图片将首先经过Python脚本的二值化处理,以获取更清晰的算式图像[10]。之后对于二值图像,程序将根据其空间结构对其进行分块,并分别对每一块进行识别。通过分块,程序将可以有效识别分数、根式、指数、对数、三角函数等复杂算式。分块的主要思想是在像素基本检测包含手写文本的区域是否存在空白行或者空白列,这些空白的行和列将作为分块的分割线。根据分块所在空间位置,程序将对结果进行组合,并得到最终结果。

4 结语

本项目是一个可识别并计算手写算式的微信小程序,使用Django作为服务后端,使用Python结合开源项目Tesseract的方式进行手写算式的识别。具有轻量级、界面清爽、功能全面、使用简单的优点。本项目也在持续更新中,后续本项目将支持更多算式的计算,并努力提升识别的精确度,为用户带来更好的体验。

猜你喜欢
字符识别计算器手写
手写比敲键盘更有助于学习和记忆
我手写我心
抓住身边事吾手写吾心
[计算器不是万能的]
基于集成学习的MINIST手写数字识别
电子制作(2018年18期)2018-11-14 01:48:08
一种改进深度学习网络结构的英文字符识别
仪表字符识别中的图像处理算法研究
基于CUDA和深度置信网络的手写字符识别
基于CUDA和深度置信网络的手写字符识别
一个损坏的计算器
读写算(中)(2015年10期)2015-11-07 07:24:10