形状识别

时间:2012-07-26 17:07:31

标签: android image-processing shapes image-recognition

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

一个。重新调整大小裁剪输入图像,使其与DB

中的图像相同

B中。将输入图像旋转一个小角度(比如15度)x次(在这种情况下为24)并尝试将这些旋转中的每一个与DB中的每个形状相匹配。

问题:

  1. 对于A,最好的方法是什么?我想在将数据发送到服务器之前在Android应用程序中实现此步骤。
  2. 对于B来说,比较2 black& amp;仅包含形状的白色像素图像?
  3. 有没有更好/更简单的方法来实现这个?一个也有实现的解决方案是可取的。
  4. PS:我可以看到很多人在这里讨论过类似的话题,但我似乎找不到符合我要求的东西。

3 个答案:

答案 0 :(得分:2)

机器学习方法

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

轮廓特征。给定轮廓(在图像中检测到或从用户输入构造),您可以计算旋转不变矩。最古老和最知名的是一组Hu moments

您还可以将轮廓的这些特征视为偏心,面积,凸度缺陷,质心距离函数的FFT变换等等。

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

特别规则方法

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

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

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

训练集完成后,您可以训练分类器,每次想要对新形状进行分类时,只需获取其特征向量,并使用它来查询分类器。

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

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