0

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

4

2 回答 2

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 Effective Retrieve of Similar Shapes”和“ Shape Matching:相似性度量和算法”,Remco C. Veltkamp (2001)。不过,数学可能有点重。

于 2013-07-05T02:01:51.613 回答
0

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

于 2013-07-05T01:30:13.570 回答