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