此次和你们聊聊文字识别相关的话题。 你们在平时确定对各类扫描类的 APP 不陌生。 拿着手机摄像头对着任何文字,直接将摄像头中的文字内容转换成手机上可编辑的字符串。c++
文字识别,缩写叫作 OCR,全称 Optical character recognition,译为光学字符识别。 关于他的完整定义能够在 Wikipedia 上面找到: en.wikipedia.org/wiki/Optica…。git
完整的 OCR 算法,并不简单。 涉及到图像识别算法,以及将从图片中识别出来的文字转换成咱们程序中可使用的二进制形式。这其中还包括不一样语言的字符如何识别,怎样更精准的识别等等。github
设想一下,若是做为开发者,让你本身从头开发这样一套算法,恐怕要花掉很大力气。 不过好消息是,咱们生活在这个开源时代,早已经有不少前辈们为咱们趟好了道路。 这也是咱们今天要聊的主题, Tesseract 就是这样一个开源库,给定任意一张图片,它能够识别出里面全部的文字内容,而且 API 接口使用很是简单。算法
Tesseract 是 Google 发布的一款 OCR 开源库,它支持多个变成语言环境,以及运行环境,其中包括咱们这里将要介绍的 iOS 环境。 今天就用它带领你们开发一个属于你本身的 OCR 应用。swift
首先,须要安装 Tesseract, 最简单的方式是用过 Cocoapods, 进入你的项目根目录,输入:bash
pod init
复制代码
而后,编辑生成的 Podfile 配置文件:微信
target 'ocrSamples' do
use_frameworks!
pod 'TesseractOCRiOS'
end
复制代码
将 TesseractOCRiOS
加入配置列表中, 最后输入:ide
pod install
复制代码
就完成了 TesseractOCRiOS
的安装。若是你以前没有接触过 Cocoapods 能够参看咱们以前的文章 swiftcafe.io/2015/02/10/…。学习
安装完成后, 咱们还须要进行一下简单的配置, 首先要在 Build Phases -> Link Binary With Libraries 中配置, 项目须要的依赖库, CoreImage, libstdc++, 以及 TesseractOCRiOS 自身:字体
配置好依赖库以后, 咱们还须要将文字识别训练数据添加进来, 训练数据是什么呢, TesseractOCRiOS
识别图片的时候,会依照这个训练数据的规则来识别文字。好比中文,英文等,都有对应的训练数据,这能够理解为深度学习预先为咱们训练好的模型。用它来进行核心的识别算法。
训练数据是须要按照不一样语言来区分的,Tesseract 有专门的页面列出了全部可用的训练数据:github.com/tesseract-o…。
好比咱们这里须要识别简体中文,就能够下载 chi-sim 这个训练数据:
而后将训练数据拖放到工程中:
上图中的 chi_sim.traineddata 是咱们下载的训练数据, 这里面有一点要注意的是, 这个文件必需要在 testdata 这个文件夹中。 而且这个文件夹要以 "Create Folder Reference" 的方式拖放进来:
这种引用方式和另一种 "Create Groups" 的方式有什么区别呢? 主要区别在于, 使用引用方式拖放进来的目录, 在最后生成 APP 包的时候, Main Bunlde 中是以 testdata/chi_sim.traineddata 这样的路径形式保存咱们训练数据资源的, 若是使用 "Create Groups" 方式,最终存储的时候是会忽略文件夹名的,最后存储在 Main Bundle 中的文件是以 /chi_sim.traineddata 这个路径存放的。
而 TesseractOCRiOS, 默认状况下是会在 testdata/chi_sim.traineddata 这个路径查找训练数据的, 因此若是使用 "Create Groups" 方式拖入,会形成运行时找不到训练数据,而报错。 这点细节须要格外注意。
最后,为了让 TesseractOCRiOS 可以正确运行, 咱们还须要关掉 BitCode, 不然会报编译错误,咱们须要在两处都要关掉它,一个是至工程,另一个是 Pods 模块, 以下图:
作完上述的准备工做后, 咱们就能够开始编码了, 这里只给你们展现最精简的代码。 首先咱们须要在主界面上显示两个控件,一个是咱们预先存储好的带有文字的照片, 另一个是用于展现识别结果的文本框:
override func viewDidLoad() {
super.viewDidLoad()
self.imageView = UIImageView(frame: CGRect(x: 0, y: 80, width: self.view.frame.size.width, height: self.view.frame.size.width * 0.7))
self.imageView?.image = UIImage(named: "textimg")
self.view.addSubview(self.imageView!)
self.textView = UITextView(frame: CGRect(x: 0, y: labelResult.frame.origin.y + labelResult.frame.size.height + 20, width: self.view.frame.size.width, height: 200))
self.view.addSubview(self.textView!)
}
复制代码
这里面咱们只将两个控件的初始化关键代码写出来,其余不重要的代码都略去。 而后就能够调用 TesseractOCRiOS 来进行文字识别了:
func recognizeText(image: UIImage) {
if let tesseract = G8Tesseract(language: "chi_sim") {
tesseract.engineMode = .tesseractOnly
tesseract.pageSegmentationMode = .auto
tesseract.image = image
tesseract.recognize()
self.textView?.text = tesseract.recognizedText
}
}
复制代码
全部识别相关的代码就都在这里了。首先调用 G8Tesseract 进行初始化, 咱们传入训练数据的名称,这里是 "chi_sim" 表明简体中文。 engineMode
有三种能够选择的模式, tesseractOnly,tesseractCubeCombined 和 cubeOnly。 咱们使用第一种模式,采用训练数据的方式。 cubeOnly 的意识就是使用更精准的 cube 方式, tesseractCubeCombined 就是两种模式的结合使用。
cube 模式须要额外的模型数据, 大体样例是这样:
上图是英文的 cube 识别模型。 简体中文的模型我暂时没有找到,因此咱们这个实例中只是用到了 tesseractOnly 模式。 而且在没有 cube 模型数据的状况下,咱们是不用使用 tesseractCubeCombined 和 cubeOnly 的,不然会由于模型数据不存在而报错。 你们若是可以找到中文的 cube 模型,也欢迎在留言中反馈,这样会让这个文字识别更加精准。
其余的调用就不须要多讲了, 将要识别的 image 对象设置给 Tesseract。 而后调用它的 recognize 方法进行识别, 最后将识别结果 tesseract.recognizedText 设置给 TextView。
最终的运行效果以下:
上面的图片是我拍的 SwiftCafe 网站上一篇文章的照片, 从识别结果上看,还算比较准确。
你们从上面的代码中应该也感觉到了, Tesseract 虽然提供了本质上算是比较复杂的文字识别算法, 但它提供给开发者的接口能够说得上是很是简单。 OCR 文字识别从总体上来讲,也能够算得上是 AI 的一个应用分支,在这个 AI 大行其道的时代,即使掌握一些应用技术,对咱们开发者来讲也能够很大的拓宽咱们的视野。 发挥你的创意,也许相似 Tesseract 这些组件可以帮助你创造 AI 时代的新锐应用。
固然, Tesseract 目前自身还有一些缺陷,好比它只能识别印刷字体,而不能精准的识别手写字体。 不过那又怎么样呢,原本至关复杂的 OCR 算法,可让咱们用很是少的代价应用起来,仍是一件对开发者很是幸福的事情。
照例,本文中的示例工程代码已经放到 Github 中,你们有须要能够直接下载:github.com/swiftcafex/…。
**若是你以为这篇文章有帮助,还能够关注微信公众号 swift-cafe,会有更多个人原创内容分享给你~ **