如何识别简单的手写形状?

时间:2011-04-15 02:23:32

标签: c++ c open-source image-recognition

我有一组简单的形状(见下图),我想识别手写形状并找出它在集合中的形状。

有没有简单的算法呢?还是任何开源的lib?

顺便说一下,我的任务很简单,所以我不会使用像OpenCV这样复杂的lib。

先谢谢!!

shapes

3 个答案:

答案 0 :(得分:1)

这是一个古老的项目,但this可能与您所寻找的一致。

This one需要OpenCV,但正如评论者指出的那样,学习它可能是值得的。

答案 1 :(得分:0)

我不知道如何在C或C ++中做到这一点,但算法是简单的。请注意,成功率随着每个角度添加到形状而减小,因此它应该有助于识别上面给出的基本形状集,但不是很多。

  1. 角落识别。您需要识别各种角落,这很容易。如果你不是在寻找一种惊人的形状识别算法,只需要一个快速简单的算法,只需寻找一组像素,其中一条线来自一侧,而不是在另一侧。您可以在大约10到20个像素的区块中执行此操作,如果某些形状可能具有非常松散的角落(如第二个手写形状的底角),则可能更多。但是,使用的块大小越大,检测到的小形状就越少。
  2. 错误检查。首先,如果您发现少于3个角但大于零,则表示存在错误。否则,如果找到零,则可以使用另一种算法来确定它是圆形还是椭圆形,并返回该结果。如果你没有,继续前进。
  3. 线条矫直。首先,我们确定角落连接的顺序(简单)。然后通过比较X和Y坐标的差异来拉直线条,消除两个差异中的最小值,或者,如果它们超过某个阈值,则采用对角线。
  4. 角点匹配。一旦有了这个,就可以通过匹配角度和距离等线条特征来轻松识别形状(例如,从任何点开始,找到水平 - 垂直 - 水平 - 垂直和你知道你有一个正方形或矩形,你可以通过比较长度来区分。
  5. 当然,完全准确匹配永远不可能。我甚至无法判断你的第二个示例形状是倾斜的平行四边形还是倾斜的正方形(或菱形或矩形)。

答案 2 :(得分:0)

这基本上是线路检测
它仅适用于直线形状,并不简单 假设你的数字中有k个线段,使用k-means算法将点聚合成线 首先将点随机分成簇 对于这些簇中的每一个,计算点近似的线。 (与点的所有距离之和最小的线)
应将异常值(距离线最远的点)重新分配给其他更适合的群集 重复最后一步,直到达到某个阈值 如果您没有达到所需的阈值,那么您可以尝试不同的K值 如果你到达那个,那么你可以计算这些线的交集,并提取你需要的不规则形状与常规形状匹配的其他属性。
你可以通过这种方式从正方形和平行四边形中分辨正方形和三角形,但它非常复杂 这种“算法”可用于波浪线,虚线或线条不相交的形状,因此它非常强大