最近項目中需要實現(xiàn)拍照或從相冊中選圖,并截取圖片某部分信息讀取上面的數(shù)字和字母,耗了一天半才解決,也是醉了,現(xiàn)在寫個博客記錄一下解決過程,誰如果有該需求,也可做個參考。
一、我的項目是使用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“中文。?如果只需要用到英文和數(shù)字識別,tessdata文件夾中只需要留eng.traineddata這一個文件即可,其他的語言庫文件都可以刪除,將tessdata 文件夾從 Finder 中拖進 Xcode 項目中
注意:不要勾選Create groups,需要勾選Create folder reference,將文件夾路徑引入,確認在 Build Phases 的 Copy Bundlle Resources 下面有 tessdata 一項,否者運行時會報錯,說在 tessdata 的父目錄中未設置 TESSDATA_PREFIX 環(huán)境變量。
在 項目 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
實現(xiàn)代碼:在選擇圖片或拍照的代理方法中拿到image,并傳入到識別方法中(該方法自己定義,傳入UIImage類型的參數(shù),參考文章下面的博文鏈接,處理一下圖片尺寸)
// 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的問題描述和解決辦法截圖:


至此差不多就沒問題可以用了,我參考了好幾個博文,很有幫助,鏈接如下,如文章又不對的地方,煩請留言指正,謝謝!