首页 > Egret引擎 > 进阶系列 > 仿Magic Touch中的手写识别算法
2016
09-29

仿Magic Touch中的手写识别算法

转自:http://www.ashan.org/archives/685     可以参考例子:http://edn.egret.com/cn/article/index/id/709

仿Magic Touch中的手写识别算法 - 第1张  | u3d8技术分享

这个算法是我在传媒大学授课时候给学生们讲过的一种识别算法。由于它的原理非常简单,计算也并不复杂非常适合学习练手。与此同时,在终端手写识别算法中,我所讲解的算法在计算上也非常节约性能,但识别精度却不是很高。

由于是游戏中使用,其实我们不需要对复杂的汉字,或者文字字符进行识别,有的仅仅是非常简单的符号。下图中所示的符号,则是游戏中出现的一些常见符号。

我们可以将这些基本的符号总结为“|—V^ZC”等。这对于我们学习手写识别的算法试验也更加简单一些。我们来看一下具体的实现思路与方法(实例中的代码采用Egret编写)。

第一步:设置一个八方向坐标

仿Magic Touch中的手写识别算法 - 第2张  | u3d8技术分享

第二步:将八个风向平均分为八个区域
仿Magic Touch中的手写识别算法 - 第3张  | u3d8技术分享

第三步:将八个区域进行编号

仿Magic Touch中的手写识别算法 - 第4张  | u3d8技术分享

第四步:对应每个编号,计算出它的旋转角度范围

仿Magic Touch中的手写识别算法 - 第5张  | u3d8技术分享

第五步:采集用户对于屏幕触摸时候的数据

代码如下:

第六步:数据降噪操作

我们看到,不同的手机屏幕响应和游戏FPS都会影响到我们采样的数据。现在我们拥有了很多坐标点信息,这些坐标点都是用户手指划过的地方。我们需要对一些较为密集的点进行降噪操作。具体的数值需要进行反复试验。我这里将两个采样数据点的间距设置为大于30px。

第七步:将采样数据转换为方向序列

两个点练成一条线段肯定会有方向,也会有角度。在第四步中,我们已经计算出每个角度范围内所代表的方向编号。现在我们需要将这个方向编号序列计算出来

第八步:方向数据去重操作

我们在第七步生成了方向序列,但是这个数据中可能会出现这样的现象。例如:2,3,1,4,5,3,3,3,3。

不难发现,最后是4个3相连。对于我们后续的步骤来说,用户所绘制的线路方向,每两个相邻的方向都应不同。所以这里我们需要做去重操作。代码如下:

第九步:识别对比

第八步中我们得到了一个字符串,事实上字符串内容也就是我们所解析出来的方向数据。这一步我们要和已经定义好的数据进行对比。最终会得出一个相似率。如果相似率超过一定百分比,我们就认为用户书写是正确的。

对于两个字符串比较相似度,我们直接使用Levenshtein Distance算法。

下面是我们预先定义的答案的数据。需要注意的是笔顺有正有反,两种都要考虑到。

对比代码如下:

我将对比数据设置为40%,当相似率大于40%的时候,就认为用户书写正确。通过这种方式来调整游戏的难易度。

最后编辑:
作者:网虫虫
网虫虫
分享是一种快乐; 分享是一种美德; 分享是一种幸福!

0 0 votes
Article Rating
Subscribe
提醒
guest
1 评论
Inline Feedbacks
View all comments
手势识别图形算法 | Unity3d技术分享

[…] 最后编辑:2017-07-19作者:网虫虫 分享是一种快乐; 分享是一种美德; 分享是一种幸福! 站内专栏 站点 QQ交谈 unity 手势,手势算法,unity 算法,手势识别算法 统一管理项目中的弹窗 仿Magic Touch中的手写识别算法 […]