我正在尝试开发一款适用于儿童的iPhone应用程序,能够通过触摸屏幕绘制字符。我想知道如何将绘制的字符与字母表中的标准字符进行匹配。我该如何比较两个形状(绘制和已有的)呢? 有任何想法吗?
需要一些代码吗?
使用GLGestureRecognizer,您可以创建一个目录,并计算预定义的“字母表”与输入点数组之间的度量。
GLGestureRecognizer是$1 Unistroke Recognizer的Objective-C实现,是一种简单的手势识别算法(请参见下面的Credits)。它以iPhone应用程序项目的形式在此提供。它是由Adam Preble于2009年4月底的几个晚上实现的。
提供了演示iPhone项目(Gestures.xcodeproj);UIView子类接收触摸事件并将其发送到GLGestureRecognizer类,同时以白色绘制触摸路径。完成手势后,显示重新采样的手势为绿色,其中心为红点,以及最佳匹配的名称、分数(越低越好)和手势方向。在示例中使用了16个点的样本大小,这似乎对于非常基本的形状是足够的。
哇,这听起来是一项艰巨的任务。我脑海中想到的一个可能是使用支持向量机。
1.) 生成绘画的图像并通过附加矢量到用户所绘制的路径上“矢量化”它。
2.) 您需要支持向量进行比较。我会实现一个“训练应用程序”。让一些孩子画画(例如10次A,10次B等),将矢量放入数据库,并将它们用作支持向量。
3.) 您需要一个评分算法,通过将其与支持向量进行比较来评估用户绘图(这可能是其中最有趣的部分)。我可以考虑测量支持向量开始和结束点到绘制向量的距离。具有最小距离的SVM是您要采用的字母。然后,您可以引入一个距离作为“边界”,将所有在此边界之上的用户绘图视为未识别。
第二种方法可能是您生成带有字母的图像(例如白色背景和黑色字母(非反锯齿))。您再次生成用户绘图的图像,并将其调整大小以与要比较的图像完全“重叠”。然后计算两个图像中匹配的黑色像素,并采用匹配最多的字母。
但是,自从我实现了类似的东西后,我可以告诉你,SVM方法更令人满意,因为如果结果不够好,你可以添加支持向量。当然,精髓肯定是你的评分算法。
无论如何,听起来需要几周的工作。
编辑:由于这是一个有趣的领域,我进行了一些研究,并找到了一篇关于手写识别的论文。请看这个链接:http://risujin.org/cellwriter/。它基本上描述了我提到的SVM方法,并提供了一些可能对你有帮助的算法。