我需要实现一个简单的Android应用程序,允许用户在手机上绘制“简单”形状(圆形,三角形等),然后询问服务器绘制的形状是否与其数据库中的某个形状匹配,其中包括形状数量较少(比方说< 100,但可以更多)。为了使这个应用程序工作,我想使用以下步骤(我们假设输入图像只包含黑色和白色像素);
一个。重新调整大小裁剪输入图像,使其与DB
中的图像相同B中。将输入图像旋转一个小角度(比如15度)x次(在这种情况下为24)并尝试将这些旋转中的每一个与DB中的每个形状相匹配。
问题:
答案 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 Bayes,KNN等简单的分类器应该会给您带来好的结果。
您需要从每个图像中提取要素。对于每个图像,您可以将它们保存在矢量中。让我们称之为特征向量。对于数据库中的图像,您已经知道了形状的类型,因此可以在特征向量中包含类型的ID。这将作为训练集。
训练集完成后,您可以训练分类器,每次想要对新形状进行分类时,只需获取其特征向量,并使用它来查询分类器。
我建议您使用缩放和大小不变的功能,这样您就不必重新调整每个图像的大小,只需要比较一次而不是旋转它。
您可以快速搜索缩放/旋转不变特征并尝试它们。