這篇文章給大家介紹怎么在Android中利用orc實現(xiàn)一個文字識別功能,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
創(chuàng)新互聯(lián)建站專注于企業(yè)網(wǎng)絡(luò)營銷推廣、網(wǎng)站重做改版、柳城網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5、成都做商城網(wǎng)站、集團公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為柳城等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
一、什么是orc
orc是指利用光學(xué)字符識別(ORC全稱:Optical Character Recognition)技術(shù),將圖片、照片上的文字內(nèi)容,直接轉(zhuǎn)換為可編輯文本,支持JPG、PNG、GIF、BMP、DOC等圖片格式。簡單一句話,就是可以把圖片上的文字識別出來。應(yīng)用的場景有很多,比如說:身份證號碼識別,銀行卡號識別等等。
實現(xiàn):
1.下載中文簡體語言包
2.導(dǎo)入依賴
3.API的使用,獲取TessBaseAPI mBaseAPI = new TessBaseAPI();實例
4.API的使用,初始化TessBaseAPI設(shè)置,設(shè)置識別的語言和語言包所在文件路徑 mBaseAPI.init(path + File.separator, "chi_sim");
5.API的使用,設(shè)置Bitmap,mBaseAPI.setImage(bitmap);
6.API的使用,從Bitmap獲取文字信息,mBaseAPI.getUTF8Text();
1.下載中文簡體語言包
語言包下載地址
找到tessdata——>chi_sim.traineddata
下載好了之后,需要放到sd卡中,目錄不限,但是必須要放在tessdata目錄里面,如果沒有tessdata目錄需要手動創(chuàng)建,例如我是Demo中是放在sd卡根目錄中,就直接在sd卡根目錄創(chuàng)建tessdata目錄,然后把下載好的chi_sim.traineddata語言包丟進去,實際項目中,在識別時候最好坐下語言包是否復(fù)制到位的檢查,以免出現(xiàn)異常。Demo中僅僅是檢查了是否創(chuàng)建tessdata目錄,這里實際上仍然存在風(fēng)險的。
2.導(dǎo)入依賴
Gradle方式添加:https://github.com/rmtheis/tess-two
3.MainActivity代碼
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private TextView mTvInfo; private TessBaseAPI mBaseAPI; private ProgressBar mProbar; private String path; private RadioGroup mRadioGroup; private RadioButton mRbtnIdCard; private RadioButton mRbtnBankNumber; private RadioButton mRbtnTxt; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.btn_start).setOnClickListener(this); mProbar = (ProgressBar) findViewById(R.id.pb); mTvInfo = (TextView) findViewById(R.id.tv_info); mRadioGroup = (RadioGroup) findViewById(R.id.rg); mRbtnIdCard = (RadioButton) findViewById(R.id.rb_idCard); mRbtnBankNumber = (RadioButton) findViewById(R.id.rb_bankNumber); mRbtnTxt = (RadioButton) findViewById(R.id.rb_txt); mRadioGroup.check(0); path = Environment.getExternalStorageDirectory().getAbsoluteFile().getAbsolutePath(); } @Override public void onClick(View v) { mTvInfo.setText(""); switch (v.getId()) { case R.id.btn_start: if (Build.VERSION.SDK_INT >= 23) { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { // 沒有權(quán)限 if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CALL_PHONE)){ //如果沒勾選“不再詢問”,向用戶發(fā)起權(quán)限請求 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CALL_PHONE}, 0); }else{ Toast.makeText(this,"請前往設(shè)置——>存儲卡權(quán)限——>允許",Toast.LENGTH_SHORT).show(); } } else { // 有權(quán)限,接著你要干的活 startReadText(); } }else{ startReadText(); } break; } } private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case 0: String s = (String) msg.obj; if (!TextUtils.isEmpty(s)) { mProbar.setVisibility(View.GONE); mTvInfo.setText(s); //釋放bitmap mBaseAPI.clear(); } else { mProbar.setVisibility(View.GONE); Toast.makeText(MainActivity.this, "識別圖片內(nèi)容失敗", Toast.LENGTH_SHORT).show(); } break; case 1: Toast.makeText(MainActivity.this, "讀取圖片失敗", Toast.LENGTH_SHORT).show(); break; } } }; private Bitmap getBitmap(int id) { Bitmap bitmap = null; try { bitmap = BitmapFactory.decodeResource(getResources(), id); } catch (Exception e) { return null; } return bitmap; } /** * 開始識別文字 */ private void startReadText() { File f = new File(path+"/tessdata") ; if(!f.exists()){ Toast.makeText(this,"請先下載好語言包置于sd/tessdata目錄",Toast.LENGTH_SHORT).show(); return; } final int btnId = mRadioGroup.getCheckedRadioButtonId(); final int resId ; if(R.id.rb_idCard==btnId){ resId = R.drawable.idcard; }else if(R.id.rb_bankNumber==btnId){ resId = R.drawable.bank_number; }else{ resId = R.drawable.tet_info; } mProbar.setVisibility(View.VISIBLE); new Thread() { @Override public void run() { mBaseAPI = new TessBaseAPI();//初始化需要耗時,可以啟動時程序時,預(yù)初始化 mBaseAPI.init(path + File.separator, "chi_sim"); Bitmap bitmap = getBitmap(resId); if (bitmap == null) { mHandler.sendEmptyMessage(1); } else { mBaseAPI.setImage(bitmap); //根據(jù)Init的語言,獲得ocr后的字符串 String t = mBaseAPI.getUTF8Text();//耗時操作 Message obtain = Message.obtain(); obtain.what = 0; obtain.obj = t; mHandler.sendMessage(obtain); } } }.start(); } }
4.activity_main.xml代碼
四、提高識別率
Demo識別率其實不是很理想,比如把數(shù)字0識別成了字母O等,這是因為我們的根本沒有進行樣本訓(xùn)練。關(guān)于樣本的訓(xùn)練,我目前還沒實際操作過,因為公司的識別需求更為復(fù)雜,這個框架難以達到效果,公司買了第三方的一個識別框架。不過僅僅是實現(xiàn)身份證號,銀行卡號,和一些簡單的文字信息,用這個框架足以實現(xiàn)。
關(guān)于怎么在Android中利用orc實現(xiàn)一個文字識別功能就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。