使用智能手机相机识别字母

时间:2014-03-20 16:50:51

标签: javascript android ios html5

我将开发一个可以使用智能手机相机识别文本的网络应用程序。我在网上看到了很多可以识别图片/流视频中文本的解决方案,但所有这些解决方案都需要开发一个原生应用。我想通过创建一个小网站来识别文本,我可以在其中执行以下操作:

  1. 注册自己
  2. 访问智能手机相机
  3. 识别镜头中的文字
  4. 以简单标签
  5. 显示识别的字母
  6. 将此字母保存在与我的帐户关联的远程数据库中
  7. 任何人都知道一种方法来识别字母而不需要拍照而不使用原生应用程序? 在网络上我找到tesseract ocr,但我不确定我是否可以在HTML5,CSS3和javascript页面中使用。有人用这个图书馆吗?它适用于哪种移动浏览器(适用于iOS的Safari,适用于Android的浏览器和适用于Windows Phone 7/8的Internet Explorer)?

3 个答案:

答案 0 :(得分:2)

这是一个非常棘手的问题。我之前曾经有过一次拍摄,并且在相当基础的水平上工作。真正的困难在于使它变得多才多艺。

那里可能有一个图书馆,所以也许这是你最好的方法。但是,如果没有图书馆,我认为这是最好的方法(我只是概述它)。

1)在某种意义上,您需要拍照。我确信有很多方法可以从相机获得持续输入,但即便如此,您也无法将所有这些信息发送回服务器,因此您可能希望至少从中获取帧。

2)字母识别不一定(必然)需要颜色。设备方面,我建议将图像转换为黑白,甚至是整数数组,其值代表图像中不同点的亮度。您可能希望相对于图像亮度的整体差异采用亮度限制。我的意思是,找到最亮的像素和整数100,最暗的是整数0,所有其他数字1到99代表最大和最小之间不同的均匀间隔亮度。

3)现在您已经收到了一些较小的图片要发回和处理,请将其发送到您的服务器!

4)好了,现在是棘手的一点:我们需要处理那个图像。首先,我们需要将所有字母分开。问题是字母和背景可以是任何颜色。图像中可能很容易出现其他对象。我们现在需要弄清楚图像中的对象是字母和它们的位置。我解决这个问题的方法是寻找图像中最主要的类似亮度成分。我的意思是,计算每个不同亮度阈值之间的像素数量,并且很可能纸张是字母为第二个的最主要贡献。不一定,只是可能。

5)浏览图像并提取每个对象。您可以通过转到每个像素来执行此操作,如果它是您的代码认为字母的颜色,检查所有相邻像素,然后检查所有相邻像素,直到找不到相似颜色的边界像素。这是一封信。

6)因此,到目前为止,我们有一个数字数组代表原始图像,以及一些关于相同亮度的物体覆盖了多少图像的字母的概念。接下来我们将介绍对象的实际识别,但我建议使用与后面的相似的技术,以确保您的代码认为字母实际上是字母。从本质上讲,您希望从更可能是字母的每组对象中获取一些对象,然后在这些字母上尝试您的实际单独字母识别算法。可以确定字母集合,因为算法将(应该)输出对象比任何其他对象更可能是特定字母。

您可以做的另一项检查是每组中对象的大小。字母应该是一个非常统一的大小,或者几个相当统一的大小。

7)对,所以我们有一组对象(希望附加一些坐标,这样你就不会忘记这些对象来自图像的位置),这些对象可能是字母。我们如何识别它们?有两种主要方法"光学字符识别"。它们是:矩阵匹配和特征提取。特征提取涉及查找字母的循环和线条以及其他特征。这很难编程,因此我们仍然使用Matrix Matching。

依次取出每个对象,并将其与表示字母表中每个字母的对象进行比较。您应该尝试对齐两个图像并拉伸/缩小以适合两个图像(想想:如果相机倾斜,物体就不会匹配得太好。如果相机距离较近,则物体较大)然后减去另一个像素中的所有像素中的所有像素。剩余价值最小的那个可能是正确的字母。有可能。如果你必须处理截然不同的字体,这种技术就会失败。你可以比较一整套字体,但这需要很多计算能力。

你也可以为图像识别做一些奇特的特征向量分析,但我并不完全确定在这种情况下这是否合适。

现在获取所有最可能的字母并使用其相关对象的坐标来重建文本。

简而言之,这非常棘手。您可能最好使用某人建立的图书馆,但即使这样,它在很多时候也不会准确。

很抱歉,如果这不是您想要的答案。谢谢,如果你读到这么远。我发现这是一个非常有趣的问题。

答案 1 :(得分:1)

你试过这个吗?这是一个Javascript库

OCRAD

答案 2 :(得分:0)

为了刚刚遇到这个问题的用户的好处,在GitHub上有一个Tesseract的JS端口(问题本身提到的库):https://github.com/naptha/tesseract.js/所以要回答这部分问题,是的,实际上,您可以在您的浏览器端项目中使用Tesseract!

同样可用(通过相同的开发人员!)https://github.com/antimatter15/ocrad.js/(在上一个答案中提到)和https://github.com/antimatter15/gocr.js/ - 其中任何一个都可能适用于您的目的,但要记住的是在实际识别文本的能力方面,使用与Tesseract相近的任何东西。因此,您将牺牲一点(有时甚至是大量)的质量来换取更小的脚本。