【问题标题】:how to recognize simple handwriting shapes? [closed]如何识别简单的笔迹形状? [关闭]
【发布时间】:2011-08-06 00:26:44
【问题描述】:

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

是否有任何简单的算法可以做到这一点?或者任何开源库?

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

谢谢,提前!!

【问题讨论】:

  • 这不是一个“简单的任务”,特别是如果你想编写自己的算法。吸一口,学用OpenCV,不难。

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


【解决方案1】:

这是一个旧项目,但this 可能与您正在寻找的内容相符。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 有开源库吗?
    【解决方案3】:

    我不知道如何在 C 或 C++ 中执行此操作,但算法很简单。请注意,成功率会随着形状中添加的每个角度而降低,因此它应该有助于识别您在上面给出的基本形状集,但其他方面则不然。

    1. 拐角识别。您需要识别各种拐角,这很容易。如果您不是在寻找一种令人惊叹的形状识别算法,而只是一种快速简便的算法,只需寻找一条线来自一侧且未在另一侧结束的像素组。您可能可以在大约 10 到 20 像素的块中执行此操作,如果某些形状可能具有非常草率的角(例如您的第二个手写形状的底角),则可能更多。但是,您使用的块尺寸越大,您检测到的小形状就越少。
    2. 错误检查。首先,如果您发现少于 3 个角但多于 0 个角,您就知道有错误。否则,如果您找到零,您可能会使用另一种算法来确定它是圆形还是椭圆形,并返回该结果。如果没有,请继续。
    3. 直线拉直。首先,我们确定连接角的顺序(简单)。然后通过比较 X 和 Y 坐标的差异来拉直直线,消除两个差异中的最小差异,或者,如果它们超过了某个阈值,则假设一条对角线。
    4. 角匹配。一旦你有了,就很容易通过匹配角度和距离等线条特征来识别形状(例如,从任意点开始,找到水平-垂直-水平-垂直,你就知道了有一个正方形或长方形,您可以通过比较长度来区分)。

    当然,完全准确匹配永远不可能。我什至无法判断您的第二个示例形状是倾斜的平行四边形还是倾斜的正方形(或菱形或矩形)。

    【讨论】:

    • 我感觉角点检测没那么简单。如果你有一条对角线(没有角),从左侧进入你的盒子,从底部出来怎么办?
    • 我承认这过于简单,但通常很容易区分对角线和角。
    猜你喜欢
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 2011-12-18
    • 2013-03-01
    • 1970-01-01
    • 2021-08-21
    相关资源
    最近更新 更多