最近项目中需要实现拍照或从相册中选图,并截取图片某部分信息读取上面的数字和字母,耗了一天半才解决,也是醉了,现在写个博客记录一下解决过程,谁如果有该需求,也可做个参考。
一、我的项目是使用cocopods管理第三方的,因此图片识别的第三方库TesseractOCRiOS(光学字符识别)也是通过cocopods导入的
在podFile中添加第三方库
pod 'TesseractOCRiOS'
如果在pod进来的第三方库文件夹中没看到这个framework,关掉工程重新打开就看到了
到项目的target中,进入General搜索 Linked Frameworks and Libraries ,在里面查看有无TesseractOCR.framework,没有就点击下方+号主动添加进来,并添加CoreImage.framework 和libc++.tbd依赖库, 如下如所示
第二步,导入语言库
下载Tesseract 的语言包,git地址:https://github.com/tesseract-ocr/tessdata,由于该语言库文件夹太大,当时我们常用的只有两种,一个是“eng“英文、一个是“chi_sim“中文。 如果只需要用到英文和数字识别,tessdata文件夹中只需要留eng.traineddata这一个文件即可,其他的语言库文件都可以删除,将tessdata 文件夹从 Finder 中拖进 Xcode 项目中
注意:不要勾选Create groups,需要勾选Create folder reference,将文件夹路径引入,确认在 Build Phases 的 Copy Bundlle Resources 下面有 tessdata 一项,否者运行时会报错,说在 tessdata 的父目录中未设置 TESSDATA_PREFIX 环境变量。
在 项目 target 的 Build Settings 中,找到 C++ Standard Library,将它设置为 Compiler Default。然后找到 Enable Bitcode,将它设置为 NO。
类似地,回到左边的项目导航器中,选择 Pods 项目,找到 TesseractOCRiOS target 的 Build Settings,找到 C++ Standard Library 将它设置为 Compiler Default。然后找到 Enable Bitcoe 将它设置为 NO。然后搜索Other Linker Flags,在所有已有的key后面添加-lstdc++
二、使用识别技术
由于项目是swift,而该framework是oc代码编写的,所以要使用需要桥接头文件,在桥接文件中添加头文件,引入第三方文件
#import <TesseractOCR/TesseractOCR.h>
在需要使用识别技术的ViewController里引入头文件
import TesseractOCR
实现代码:在选择图片或拍照的代理方法中拿到image,并传入到识别方法中(该方法自己定义,传入UIImage类型的参数,参考文章下面的博文链接,处理一下图片尺寸)
// 1if let tesseract = G8Tesseract(language: "eng") {
// 2 tesseract.engineMode = .tesseractCubeCombined
// 3 tesseract.pageSegmentationMode = .auto
// 4 tesseract.image = image.g8_blackAndWhite()
// 5 tesseract.recognize()
//拿到了识别到的文字,自己控制显示方式
// 6 let text = tesseract.recognizedText
}
上述代码运行会报错,代码崩溃在framework的文件中,大概崩溃原因提示是:unable to init CubeRecoContext object
查了Stack Overflow,解决方法是将 tesseract.engineMode改成.tesseractOnly,这样就可以运行了
Stack Overflow的问题描述和解决办法截图:
至此差不多就没问题可以用了,我参考了好几个博文,很有帮助,链接如下,如文章又不对的地方,烦请留言指正,谢谢!