29

当您使用设备摄像头兑换礼品卡时,有没有办法完成类似于 iTunes 和 App Store 应用程序所做的事情,在实时摄像头馈送之上实时识别短字符串?

iTunes 应用程序兑换礼品卡 UI

我知道在 iOS 7 中现在有一个AVMetadataMachineReadableCodeObject类,AFAIK,只代表条形码。我对检测和读取短字符串的内容更感兴趣。这是否可以使用公开可用的 API 方法或您可能知道的其他第三方 SDK?

还有一个过程的视频:

https://www.youtube.com/watch?v=c7swRRLlYEo

最好的,

4

5 回答 5

16

正如您提到的,我正在开发一个类似于 Apple 应用商店使用相机进行兑换的项目。

处理实时视频的一个很好的起点是我在 GitHub 上找到的一个项目。这是使用 AVFoundation 框架,并且您实现了 AVCaptureVideoDataOutputSampleBufferDelegate 方法。

一旦有了图像流(视频),就可以使用 OpenCV 来处理视频。在通过 Tesseract 运行之前,您需要确定图像中要进行 OCR 的区域。您必须使用过滤,但您使用 OpenCV 采取的主要步骤是:

  • 使用 cv::cvtColor(inputMat, outputMat, CV_RGBA2GRAY); 将图像转换为黑白
  • 阈值图像以消除不必要的元素。您指定要消除的阈值,然后将其他所有内容设置为黑色(或白色)。
  • 确定形成盒子边界的线条(或您正在处理的任何东西)。如果您已经消除了除所需区域之外的所有内容,则可以创建一个“边界框”,或者使用 HoughLines 算法(或概率版本,HoughLinesP)。使用它,您可以确定线的交点以找到拐角,并在 OCR 之前使用拐角扭曲所需区域以将其拉直为适当的矩形(如果您的应用程序中需要此步骤)。
  • 使用 Tesseract OCR 库处理图像的一部分以获得结果文本。可以在 OpenCV 中为字母创建训练文件,这样您就可以在没有 Tesseract 的情况下阅读文本。这可能会更快,但也可能需要更多的工作。在 App Store 案例中,他们正在执行类似的操作,以将读取的文本显示在原始图像之上。这增加了很酷的因素,所以它只取决于你需要什么。

其他一些提示:

  • 我使用“Instant OpenCV”一书快速入门。这很有帮助。
  • 从 OpenCV.org/downloads.html 下载适用于 iOS 的 OpenCV
  • 我发现自适应阈值非常有用,您可以通过搜索“OpenCV AdaptiveThreshold”来阅读所有相关信息。此外,如果您的图像在明暗元素之间很少,您可以使用Otsu 的二值化。这会根据灰度图像的直方图自动确定阈值。
于 2014-11-26T03:23:19.267 回答
11

这个问答主题似乎一直是 iOS 上 OCR 主题的热门搜索之一,但已经过时了,所以我想我会发布一些其他资源,这些资源可能对我来说是有用的写这篇文章的时间:

Vision Framework
https://developer.apple.com/documentation/vision
从 iOS 11 开始,您现在可以使用包含的基于 CoreML 的 Vision 框架来进行矩形或文本检测。我发现我不再需要将 OpenCV 与操作系统中包含的这些功能一起使用。但是,请注意,文本检测与文本识别或 OCR 不同,因此您仍需要另一个库,如 Tesseract(或您自己的 CoreML 模型)来将检测到的图像部分转换为实际文本。

SwiftOCR
https://github.com/garnele007/SwiftOCR
如果你只是对识别字母数字代码感兴趣,这个 OCR 库声称比 Tesseract 显着提高了速度、内存消耗和准确性(我自己没有尝试过)。

ML Kit
https://firebase.google.com/products/ml-kit/
Google 已发布 ML Kit 作为其 Firebase 开发人员工具套件的一部分,在撰写本文时处于测试阶段。与 Apple 的 CoreML 类似,它是一个机器学习框架,可以使用您自己训练过的模型,但也有预训练过的模型用于常见的图像处理任务,如 Vision Framework。Vision Framework 不同,它还包括一个用于在设备上识别拉丁字符的模型。目前,该库的使用是免费的用于设备上的功能,使用 Google 提供的云/SAAS API 产品需要付费。我选择在我的项目中使用它,因为识别的速度和准确性似乎相当不错,而且我还将创建一个具有相同功能的 Android 应用程序,因此拥有一个单一的跨平台解决方案对我来说是理想的。

ABBYY 实时识别 SDK
https://rtrsdk.com/
这个适用于 iOS 和 Android 的商业 SDK 可免费下载用于评估和有限的商业用途(截至撰写本文时最多 5000 个单位)。进一步的商业用途需要扩展许可。由于定价不透明,我没有评估此产品。

于 2018-06-20T17:55:26.310 回答
4

我会研究Tesseract。它是一个开源 OCR 库,可以获取图像数据并对其进行处理。您可以添加不同的正则表达式,也可以只查找特定字符。它并不完美,但根据我的经验,它运作良好。如果你喜欢这种东西,它也可以作为 CocoaPod 安装。

如果您想实时捕获它,您可以使用GPUImage捕获实时提要中的图像并对传入图像进行处理,以通过使用不同的过滤器或减小传入图像的大小或质量来加速 Tesseract。

于 2014-07-30T21:45:21.773 回答
4

github上有一个类似的项目:https ://github.com/Devxhkl/RealtimeOCR

于 2015-02-25T03:22:27.607 回答
4

“实时”只是一组图像。您甚至不需要考虑处理所有这些,只要足以广泛地表示设备的运动(或相机位置的变化)即可。iOS SDK 中没有内置任何东西来做你想做的事,但你可以使用第 3 方 OCR 库(如 Tesseract)来处理你从相机抓取的图像。

于 2013-09-30T18:52:56.933 回答