Android studio ocr初級app開發問題匯總(含工程代碼)


  博客第一篇文章,稍作修改,增加文字介紹


 

  開發目的

    最近由於某些需求,需要在Android手機端實現OCR功能,大致為通過手機照相,識別出相片中的中文信息字段。但是由於新手光環+流程不熟悉,遇到了各種各樣的問題,准備在本文中敘述一下,最好能派上用場。

  開發環境

    Android studio 2.3.3  Windows下,測試手機Android4.4版本

  環境搭建

    搭建安卓OCR開發環境.   

    使用的google提供的OCR識別引擎,可以選擇多種語言。

    參考上述鏈接可以實現,最開始的搭建。這里需要注意的是:由於GitHub上的工程與當前新建的Gradle版本不匹配,導致android-maven錯誤,注意添加依賴。

  大文件拷貝

    由於OCR訓練好的文件比較大,以中文識別為例,50MB左右大小,需要將文件放置於手機的SD卡中,便於TessBaseApi對象初始化。(init()函數需要文件路徑,目前沒想到更好的方式)。

  本文提出的解決方式:首先將chi_sim.traineddata文件放入asset文件夾中。在程序首次運行的時候,將文件拷貝到SD卡中,注意獲取SD卡讀寫權限。拷貝函數如下:

  加入相機

  以上步驟順利的話,可以實現對圖片的文字進行識別功能。為了實現對照相機得到的相片進行識別,需要打開攝像機。

Intent getImageByCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(getImageByCamera,REQUST_ORIGINAL);

  REQUST_ORIGINAL是自己定義的常量值,用於接收時,與requestcode值比對,判斷是否為需要的數據。

  

 1 @Override
 2     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 3         super.onActivityResult(requestCode, resultCode, data);
 4          if (resultCode == Activity.RESULT_OK && requestCode == REQUST_ORIGINAL){
 5           Bundle bdl = data.getExtras();
 6             Bitmap bmp = (Bitmap) bdl.get("data");
 7             ImageView im_camera = (ImageView)findViewById(R.id.img_camera);
 8             im_camera.setImageBitmap(bmp);
 9             mTess.clear();
10             mTess.setImage(bmp);
11             String result = mTess.getUTF8Text();
12             TextView txtget = (TextView)findViewById(R.id.txt_get);
13             txtget.setText(result);
14         }
15 }

   在回調函數里,處理返回的圖片數據,就可以實現初步的圖片文字識別。但是這樣返回的圖片數據為縮略圖,清晰的很低。如果想要對原始圖片進行處理的話,需要換一種圖片獲取的方式。

首先,調用相機的時候,添加圖片為文件存儲的路徑。

 1  Intent getImageByCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
 2         Uri uri;
 3         if(Build.VERSION.SDK_INT>=24)
 4         {
 5             File g= new File(picPath);//測試錯誤
 6             try {
 7                 g.createNewFile();
 8             } catch (IOException e) {
 9                 e.printStackTrace();
10             }
11             uri = FileProvider.getUriForFile(this,"xueyu404",g);
12         }else{
13             uri = Uri.fromFile(new File(picPath));
14         }
15 
16         getImageByCamera.putExtra(MediaStore.EXTRA_OUTPUT,uri);
17         startActivityForResult(getImageByCamera,REQUST_ORIGINAL);

  PicPath為String變量,意義為相機圖片在sd卡上的存儲路徑。然后在回調函數里對圖片進行處理。

由於Android 7.0在跨應用數據調用增加了限制,需要使用FileProvider獲取uri,具體FileProvider配置參考一下鏈接

http://blog.csdn.net/hehe26/article/details/52921056

 1 if (resultCode == Activity.RESULT_OK && requestCode == REQUST_ORIGINAL){
 2             FileInputStream fis = null;
 3             try{
 4                 Log.e("sdpath2",picPath);
 5                 fis = new FileInputStream(picPath);
 6                 Bitmap bm = BitmapFactory.decodeStream(fis);
 7                 ImageView im_camera = (ImageView)findViewById(R.id.img_camera);
 8                 im_camera.setImageBitmap(bm);
 9                 mTess.setImage(bm );
10                 String result = mTess.getUTF8Text();
11                 TextView txtget = (TextView)findViewById(R.id.txt_get);
12                 txtget.setText(result);
13             }catch (FileNotFoundException e){
14                 e.printStackTrace();
15             }finally {
16                 try {
17                     fis.close();
18                 } catch (IOException e) {
19                     e.printStackTrace();
20                 }
21             }
22         }
23         else {
24             Toast.makeText(this,"沒有拍到照片",Toast.LENGTH_SHORT).show();
25         }

    運行效率

    通過上述的過程,可以完成,基本的文字識別的功能。但仍然存在着不能忽略的問題。

    一,使用縮略圖進行識別的時候,運行速率可以接受,對於特別大的文字識別還可以。但是由於圖片被壓縮過,如果圖片中存在比較小的文字基本不能識別。

    二,使用后面提到的原始圖片進行識別的話,由於手機的計算能力有限,識別的計算過程相當耗時。識別過程要放到另外的線程中單獨運行,否則會卡死UI線程,假死。但是即使新建線程,需要的時間也遠超用戶的忍耐限度。

    改進優化

    由於圖片原圖比較大的原因,對整個圖片進行識別的效果也不理想。所以本文建議在拍攝照片之后,用戶用手指圈定識別區域文字。圈定區域 的控件,見我的另外一篇博客

    Android 通過觸摸動態地在屏幕上畫矩形

    此外,識別過程,控件初始化過程比較耗時,放置在UI線程中卡頓不可忍耐。本文采用線程池的方式,處理上述兩個過程。

    最終效果圖

    

      先點擊相機拍照按鈕,拍要識別的照片,再點擊選取區域按鈕,用手指畫一個矩形框,圈好識別區域(如果矩形沒畫好可以再點擊選取區域重新畫),

最后點擊文字識別等待結果顯示。

工程代碼鏈接:https://github.com/dutxueyu/Android_ocr_app

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM