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