屏幕上的Android形状识别

时间:2013-07-05 01:06:48

标签: android shape-recognition

我想识别在屏幕上绘制的圆形,三角形和矩形等形状。我的主要目标是用户在屏幕上绘制形状,我需要一个代码来识别这个形状。我该怎样处理这个问题?< / p>

2 个答案:

答案 0 :(得分:1)

你想要实现的目标可能非常棘手,但我刚刚实现了类似的东西,这就是我使用的方法:

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

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

b)否则,它很可能只有一个尺寸大约是另一个尺寸的两倍,在这种情况下你裁剪白色空间,旋转它以获得高度作为它的最大尺寸,将其放大到256x128然后添加在两侧64 px的空白区域。

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

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

如果你有冒险精神,这里有几篇论文描述了解决这个问题的最先进算法:Greg Mori,Serge Belongie和Jitendra Malik(2001)的“Shape contexts enable efficient retrieval of similar shapes”和“{{3 “Remco C. Veltkamp(2001)。但数学可能有点沉重。

答案 1 :(得分:0)

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