1

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

有没有简单的算法来做到这一点?或者任何开源库?

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

提前致谢!!

形状

4

3 回答 3

1

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

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

于 2011-04-15T02:37:26.687 回答
0

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

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

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

于 2011-04-15T02:45:24.560 回答
0

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

于 2011-04-15T02:58:45.850 回答