背景
最近iOS15系統(tǒng)出了一個LiveText功能,功能非常好用,想在自己的APP里也實(shí)現(xiàn)該功能??上У氖悄壳癮pple官方還沒提供相應(yīng)的接口供開發(fā)者使用。LiveText本質(zhì)上是OCR技術(shù),所以想預(yù)研下,這類功能是如何實(shí)現(xiàn)。網(wǎng)上搜集相關(guān)資料,免費(fèi)的支持本地OCR功能,并且支持多個平臺的也就谷歌提供的Tesseract了,而且支持pod,所以先從這個下手。
Tesseract簡介
將圖片翻譯成文字一般被稱為光學(xué)文字識別(Optical Character Recognition,OCR)??梢詫?shí)現(xiàn)OCR 的底層庫并不多,目前很多庫都是使用共同的幾個底層OCR 庫,或者是在上面進(jìn)行定制。
Tesseract 是一個OCR 庫,目前由Google 贊助(Google 也是一家以O(shè)CR 和機(jī)器學(xué)習(xí)技術(shù)聞名于世的公司)。Tesseract 是目前公認(rèn)最優(yōu)秀、最精確的開源OCR 系統(tǒng)。
除了極高的精確度,Tesseract 也具有很高的靈活性。它可以通過訓(xùn)練識別出任何字體(只要這些字體的風(fēng)格保持不變就可以),也可以識別出任何Unicode 字符。
簡單來說,Tesseract采用機(jī)械學(xué)習(xí)的模式,先提取特征訓(xùn)練字符庫,然后根據(jù)字符庫來識別圖片中的文字。目前支持多個平臺。
開始安裝
Tesseract應(yīng)該是C++編寫,目前iOS的主要分支應(yīng)該是gali8分支。
github:https://github.com/gali8/Tesseract-OCR-iOS

截止目前為止最新版本是5.0.1并且支持swift,很不錯。下面就是簡單pod一下就好了。
我這里使用的是清華源,可以提升速度,也推薦給大家
source 'https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git'

開始測試
首先看來看看Tesseract對項(xiàng)目結(jié)構(gòu)的要求。使用Tesseract,我們需要將訓(xùn)練好的庫放到項(xiàng)目中去,必須是一個文件夾,并且以tessdata命名,注意這里要選folder references,tessdata里面就是訓(xùn)練好的模型。

然后再來看看代碼,發(fā)現(xiàn)意外的簡單。
首先生成一個G8Tesseract對象,使用多種語言文字用+號連接,然后再配置引擎以及識別參數(shù),最后就能將圖片的文字識別到recognizedText。
下面找一張圖片試試看:

這中文識別還行,但這英文嘛。。。。會不會是顏色干擾了識別?據(jù)我所知,圖像識別一般都要黑白化,這樣可以減少干擾因素。所以下面我們用GPUImage對圖像進(jìn)行處理試下(GPUImage剛才pod里面有)。改進(jìn)代碼:


問題更嚴(yán)重了。會不會是我用的字符庫沒經(jīng)過訓(xùn)練,或者訓(xùn)練較差呢?然后我就去Tesseract官網(wǎng)看看有沒有新的字符庫。地址:
https://github.com/tesseract-ocr/tessdata 下載新的字符庫發(fā)現(xiàn)跑不起來,原來TesseractOCRiOS 5.0.1 只適配到3.0.3的Tesseract,官方早就更新到4.0.0以上了。如果想要使用新的訓(xùn)練庫,就得升級Tesseract。TesseractOCRiOS多年沒維護(hù),issues上也有類似的問題沒有解決。所以只能找找看有沒有支持4.0.0以上的野分支了。經(jīng)過一番搜索,還真找到了一個分支,作者xwal。https://github.com/xwal/Tesseract-OCR-iOS
下面修改podFile重新拉代碼:

經(jīng)過測試,效果提升并不明顯。而且英文與英文如果黏連很近,還是很容易出錯。
總結(jié)
目前來看Tesseract方案和系統(tǒng)iOS自帶的文字識別還是有一定差距的,而且要攜帶訓(xùn)練好的字符特征包,會增大APP的體積。所以目前想在照片使用OCR,用webView去顯示圖片,然后用系統(tǒng)自帶功能可能更加合適一點(diǎn)。