3

我需要实现一个简单的 Android 应用程序,允许用户在他们的手机上绘制一个“简单”的形状(圆形、三角形等),然后询问服务器绘制的形状是否与其数据库中的一个形状匹配,该数据库由一个低形状的数量(假设 < 100,但可以更多)。为了使这个应用程序工作,我正在考虑使用以下步骤(我们假设输入图像仅包含黑白像素);

A. 重新调整大小并裁剪输入图像,使其与数据库中的图像具有相同的比例

B. 将输入图像旋转一个小角度(比如说 15 度)x 次(在本例中为 24),并尝试将这些旋转中的每一个与 DB 中的每个形状进行匹配。

问题:

  1. 对于 A,最好的方法是什么?在将数据发送到服务器之前,我正在考虑在 Android 应用程序中实现这一步。
  2. 对于 B,比较仅包含一个形状的 2 个黑白像素图像的体面算法是什么?
  3. 有没有更好/更简单的方法来实现这个?一个也有实现的解决方案是可取的。

PS:我可以看到很多人在这里讨论过类似的话题,但我似乎无法找到足够符合我要求的东西。

4

3 回答 3

3

机器学习方法

您选择一些描述轮廓的特征,选择一些分类方法,准备一组标记轮廓的训练集,训练分类器,在程序中使用它。

轮廓特征。给定一个轮廓(在图像中检测到或从用户输入构建),您可以计算旋转不变矩。最古老,最广为人知的是一组胡时刻

您还可以考虑轮廓的特征,例如偏心率、面积、凸度缺陷、质心距离函数的 FFT 变换等。

分类器。现在你需要训练一个分类器。支持向量机、神经网络、决策树、贝叶斯分类器是一些流行的方法。有很多方法可供选择。如果您选择 SVM,LIBSVM是一个免费的 SVM 库,它也适用于 Java,也适用于 Android。

临时规则方法

您还可以使用多边形曲线近似轮廓(请参阅Ramer-Douglas-Peucker 算法,OpenCV 库中有一个免费实现,现在可在 Android 上使用)。对于某些简单的形式,如三角形或矩形,您可以轻松发明一些特别的启发式规则来“识别”它们(例如,如果闭合轮廓可以仅用三段和小误差来近似,那么它很可能是三角形;如果质心距离函数几乎是恒定的,并且凸度缺陷为零,那么它很可能是一个圆)。

于 2012-07-27T21:11:21.197 回答
1

由于这与手写识别非常相关,因此您可以使用简单的 hmm 算法将形状与预学习的 db 进行比较。

但是对于更简单的方法,您可以检测图像中的角点,然后计算角点以检测形状。

第一种方法可用于任何复杂的形状,而第二种方法仅适用于基本形状。

于 2012-07-26T17:44:10.493 回答
1

您可以使用监督学习方法。对于您要解决的问题,我认为简单的分类器,如Naive BayesKNN等应该会给您带来好的结果。

您需要从每个图像中提取特征。对于每个图像,您可以将它们保存在矢量中。让我们称之为特征向量。对于数据库中的图像,您已经知道形状的类型,因此您可以在特征向量中包含类型的 id。这将作为训练集。

一旦你有了训练集,你就可以训练你的分类器,每次你想对一个新的形状进行分类时,你只需要得到它的特征向量并用它来查询分类器。

我建议您使用比例和大小不变的功能,这样您就不必重新调整每个图像的大小,您只需要比较一次而不是旋转它。

您可以快速搜索缩放/旋转不变特征并尝试它们。

于 2012-07-26T20:05:38.057 回答