【问题标题】:Android Shape Recognition on Screen屏幕上的 Android 形状识别
【发布时间】:2013-07-03 00:30:03
【问题描述】:

我想识别在屏幕上绘制的圆形、三角形和矩形等形状。我的主要目标是用户在屏幕上绘制一个形状,我需要一个代码来识别这个形状。我应该如何解决这个问题?

【问题讨论】:

标签: android shape-recognition


【解决方案1】:

您要实现的目标可能非常棘手,但我不久前碰巧实现了类似的东西,这是我使用的方法:

  • 坚持黑白图纸
  • 有一个小型的(黑白)图纸数据库(大约 50 个),具有固定的分辨率,比如说 256x256(如果您愿意,可以将它们作为二进制 blob 存储在 sqlite 中)。确保为这些绘图使用相当粗的线条(10 px 应该可以,或者大约是用户输入绘图的两倍粗)。此外,图纸应进行规范化,这意味着它们必须至少有一个尺寸与图像本身一样大。
  • 提取用户绘制的形状并进行处理:

a) 如果它的纵横比接近正方形,则只需裁剪其周围的空白区域并将其放大,使其与您的数据库图像具有相同的大小

b) 否则,它很可能有一个尺寸大约是另一个尺寸的两倍,在这种情况下,您裁剪空白区域,旋转它以使其高度成为最大尺寸,将其放大到 256x128,然后添加两边有 64 像素的空白。

  • 您必须逐个像素地将绘图与每个数据库图像进行比较,并确定每个数据库图像重叠的黑色像素数量。然后你对这些数字进行排序,你会得到最好的匹配。即使最佳匹配的重叠像素少于 20%,结果通常也不错。
  • 因为某些形状可以被认为是相同的,即使它们被旋转(想象在图像中放置三角形的各种方式:一个尖端指向上、下或朝向一侧等),您可能想要将您的输入图形旋转 12 - 24 次(每一步旋转 15 - 30 度),并将每次旋转与数据库中的每个图像进行比较。鉴于此步骤很可能需要大量处理能力,您可能会考虑将初始数据库图形的所有旋转存储在数据库中,作为不同的图片,从而使数据库更大,但节省旋转输入图像的工作,这很昂贵。

鉴于上述算法有点耗费资源,您可能会考虑在某处安装一台服务器,它可以进行实际比较,尤其是如果您想将许多图像添加到您的数据库中。因为我已经为演示应用程序实现了这个算法,所以我已经可以告诉你,你将不得不做很多像素操作。此外,使用 Android SDK 旋转图像可能很烦人,因为它会改变图像尺寸...

如果您喜欢冒险,这里有几篇论文描述了解决这个问题的最先进算法:Greg Mori、Serge Belongie 和 Jitendra Malik (2001) 的“Shape contexts enable efficient retrieval of similar shapes”和“Shape Matching: Similarity Measures and Algorithms” Remco C. Veltkamp (2001)。不过,数学可能有点重。

【讨论】:

    【解决方案2】:

    您应该查看 GestureOverlayView。 一个不错的教程是:http://www.vogella.com/articles/AndroidGestures/article.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 2017-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多