前提:突發(fā)情況下需要去了解下“文字的識(shí)別”的技術(shù)(android 平臺(tái)下)。然后立馬想到的方法有
1.利用現(xiàn)有的SDK.
2.查找開(kāi)源的技術(shù)的烁。
先說(shuō)說(shuō)現(xiàn)有的SDK吧。首先找到的是百度云:https://cloud.baidu.com/product/ocr.html
不過(guò)測(cè)試結(jié)果不太理想卵惦,他們的做法是拍照->截圖->圖片轉(zhuǎn)Base64 上傳到服務(wù)器識(shí)別歉备。大多數(shù)情況下對(duì)手寫(xiě)字體的識(shí)別率很低。機(jī)打字體還是有一定的成功率的咸灿。其他的證件識(shí)別就沒(méi)有測(cè)試過(guò)构订。另外提一句就是百度提供的是在一定的次數(shù)下是免費(fèi)的。
具體的實(shí)現(xiàn)方式看百度云的文檔說(shuō)明了,不過(guò)有一點(diǎn):在創(chuàng)建app的時(shí)候
這個(gè)(文字識(shí)別包名)是需要鉤上的?避矢。不然的話識(shí)別不了悼瘾。
其他的SDK 暫時(shí)沒(méi)有查找咯。
遵循做技術(shù)的嘛审胸,看看實(shí)現(xiàn)文字識(shí)別是用哪里技術(shù)實(shí)現(xiàn)的亥宿。最后發(fā)現(xiàn)實(shí)現(xiàn)的技術(shù)之一是用openCV 加上 google 提供的tess-two (其他的技術(shù)實(shí)現(xiàn)方式暫不討論了).大概的思路是
(ps:在這里感謝:shuishuige93? 如果提供代碼的話越好,可惜只是如果)
處理圖像這塊是 是由OpenCV-android(ps:http://opencv.org)擔(dān)任的.版本的話好像到了openCV3.3?∩芭妫可是我android studio 能下載的是3.1的版本
具體的android studio?(android studio 3.0 Beta5? buildToolsVersion:26.0.1)導(dǎo)入方式:
implementation 'org.opencv:OpenCV-Android:3.1.0'
大部分在網(wǎng)的找出的技術(shù)文檔 和教程 是openCV 的c++ 的 然后就是版本低的烫扼,openCv 還分opencv4android,opencvjava.(不過(guò)技術(shù)都是相同的)?,然而我還是不想用 .cpp 啥的 雖然
android studio 不知道在幾版本后提供了更好的NDK開(kāi)發(fā)套件(cmake).但總感覺(jué)人家提供了opencv4android 后還得去寫(xiě)c(如果是高手尺上,如要定制化的功能還是要寫(xiě)材蛛,咱是小白能最快實(shí)現(xiàn)目的就好了,雖然知識(shí)很重要).所以我嘗試去實(shí)現(xiàn)怎抛。
1.灰度化??卑吭,二值化
灰度圖(Gray Scale Image)又稱灰階圖,它是指把白色與灰色按對(duì)數(shù)關(guān)系分為若干等級(jí)马绝,稱作灰階豆赏。灰度分為256階富稻,用灰度表示的圖像稱為灰度圖
(感謝shuishuige93? )
詳細(xì)的描述 灰度化掷邦,二值化(http://blog.csdn.net/evsqiezi/article/details/7905436)
?實(shí)現(xiàn)灰度化方式是OpenCV里的cvtColor(Matsrc, Mat dst, int code); c 下的實(shí)現(xiàn)方式。所以百度了 android 灰度化椭赋。在這里提供了基于bitmap和opencv的很好的解決方式(http://blog.csdn.net/kazichs/article/details/52914406)?(不過(guò)這里使用opencv 對(duì)應(yīng)的不是open 3.1 至少我查看了open3.1的代碼沒(méi)有發(fā)現(xiàn)? OpenCVLoader.initAsync?抚岗,只有openCVLoader.initDebug,這句話肯定要寫(xiě)的,不然會(huì)報(bào)錯(cuò)滴)
2.膨脹和腐蝕
?通俗的說(shuō):
膨脹算法使圖像擴(kuò)大一圈。
腐蝕算法使二值圖像減小一圈哪怔。
腐蝕:刪除對(duì)象邊界的某些像素
膨脹:給圖像中的對(duì)象邊界添加像素
詳細(xì)的說(shuō)明?(ps: http://m.blog.csdn.net/u011028345/article/details/76152243?)
Dilate 使用任意結(jié)構(gòu)元素膨脹圖像,Erode 使用任意結(jié)構(gòu)元素腐蝕圖像.然后又得找宣蔚。
其實(shí)在灰度和二值化的時(shí)候 都是通過(guò) org.opencv.imgproc.Imgproc 下的方法進(jìn)行轉(zhuǎn)變的.其他的都是一些mat 和 bitmap的轉(zhuǎn)換向抢。所以 腐蝕是Imgproc.erode(Mat src, Mat dst, Mat kernel)
膨脹是dilate(Mat src, Mat dst, Mat kernel)
kernel:是一個(gè)腐蝕膨脹計(jì)算的核心
Mat kernel = Imgproc.getStructuringElement( Imgproc.MORPH_RECT,new Size(2, 2));
當(dāng)然具體的參數(shù)另行參考了。
3.還有一個(gè)圖形校正
輪廓提取技術(shù)
霍夫變換知識(shí)
ROI感興趣區(qū)域知識(shí)
這個(gè)就比較蛋疼.雖然參考
http://www.cnblogs.com/skyfsm/p/6902524.html?? 圖像矯正技術(shù)深入探討(這個(gè)應(yīng)該是個(gè)大牛)
http://www.cnblogs.com/panxiaochun/archive/2016/05/20/5512142.html?opencv直線檢測(cè)在c#胚委、Android和ios下的實(shí)現(xiàn)方法
https://github.com/johnhany/MOAAP?針對(duì)的Android版本從API 19到API 21不等挟鸠,同時(shí)使用的OpenCV庫(kù)版本也有2.4.9和2.4.10兩種。本文給出的代碼是在原書(shū)代碼的基礎(chǔ)上亩冬,針對(duì)Android 7.0(API 24)與OpenCV 3.2進(jìn)行了修改艘希,補(bǔ)充了一些注釋,適當(dāng)?shù)卦黾恿艘恍╊A(yù)處理操作硅急,以使代碼整體上更合理?(這里面也講到了霍夫變化)
到此 處理圖像 被亂棍打死了覆享。
文字的識(shí)別
android studio 中導(dǎo)入
implementation 'com.rmtheis:tess-two:8.0.0'
并且在這里 https://github.com/tesseract-ocr/tessdata?下載相應(yīng)的語(yǔ)言文字包(英文:eng.traineddata??? 中文:chi_sim.traineddata),但是一個(gè)個(gè)包不是30m,就是70 m。所以app在進(jìn)行文字識(shí)別的化 最好用tess 提供的套件自己訓(xùn)練簡(jiǎn)單的 語(yǔ)言包铜秆。
下載好后淹真,放到
當(dāng)然tessdata 你也可以寫(xiě)其他的名字,語(yǔ)音包首先要移動(dòng)到內(nèi)存中连茧,在初始化tess中會(huì)查找路徑
m_datapath 是指定的文件路徑核蘸,? m_zh_lang 是語(yǔ)言包的名字?,
并不需要后綴名啸驯。
針對(duì)識(shí)別的話 可以識(shí)別mat 或者bitmap
大概吧客扎,就這些。
最后識(shí)別的結(jié)果罚斗。手寫(xiě)文字 差評(píng)徙鱼,整頁(yè)文字差評(píng),單行截圖(寥寥幾個(gè)文字的)還好的针姿。
所有啊任重而道遠(yuǎn)啊