Android實現(xiàn)掃一掃識別數(shù)字功能
1.準(zhǔn)備工作
- 首先實現(xiàn)識別數(shù)字等字符,我們要知道需要采用OCR (Optical Character Recognition,光學(xué)字符識別)來實現(xiàn)。而tesseract是非常不錯的開源OCR工具,但是要在Android中直接使用可能要費點功夫。不過不用擔(dān)心,tess-two拯救了我們。
- 其次是掃一掃識別,那么很快聯(lián)想到的就是常見的二維碼掃描這類的項目。通過掃一掃實時拿到圖像,來做識別。
- 接下來在Github上找到了QrCodeScanner項目,作者通過一定的優(yōu)化,使得識別的效率有所提升。那么我們用它來掃描數(shù)字,也會有效率上的提升。
2.實現(xiàn)細節(jié)
1.首先是tess-two的用法。
app下的build.gradle的配置如下
android {
defaultConfig {
....
ndk {
abiFilters 'armeabi' //自行選擇添加
}
}
}
dependencies {
compile 'com.rmtheis:tess-two:8.0.0'
}
識別方法:
public String detectText(Bitmap bitmap) {
TessBaseAPI tessBaseAPI = new TessBaseAPI();
String path = ""; //訓(xùn)練數(shù)據(jù)路徑
tessBaseAPI.setDebug(true);
tessBaseAPI.init(path, "eng"); //eng為識別語言
tessBaseAPI.setVariable(TessBaseAPI.VAR_CHAR_WHITELIST, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"); // 識別白名單
tessBaseAPI.setVariable(TessBaseAPI.VAR_CHAR_BLACKLIST, "!@#$%^&*()_+=-[]}{;:'\"\\|~`,./<>?"); // 識別黑名單
tessBaseAPI.setPageSegMode(TessBaseAPI.PageSegMode.PSM_AUTO_OSD);//設(shè)置識別模式
tessBaseAPI.setImage(bitmap); //設(shè)置需要識別圖片的bitmap
String inspection = tessBaseAPI.getHOCRText(0);
tessBaseAPI.end();
return inspection ;
}
訓(xùn)練數(shù)據(jù)可以在tessdata下載,里面包含各種語言。當(dāng)然你自己也可以訓(xùn)練它,有興趣的可以學(xué)習(xí)一下相關(guān)內(nèi)容。
2.從tess-two的用法可以知道,我們最終需要的是識別圖片的Bitmap。在掃碼項目中我們找到在DecodeHandler類的decode方法中,我們會得到一個PlanarYUVLuminanceSource類的實例。在使用HybridBinarizer算法解析數(shù)據(jù)源,最終采用MultiFormatReader解析圖像出結(jié)果。代碼大致如下:
Result rawResult = null;
MultiFormatReader mMultiFormatReade = new MultiFormatReader();
try {
PlanarYUVLuminanceSource source =
new PlanarYUVLuminanceSource(```, false);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
rawResult = mMultiFormatReader.decode(bitmap, mHints);
} catch (ReaderException ignored) {
} finally {
mMultiFormatReader.reset();
}
看完后懵逼了,沒有Bitmap。經(jīng)過一番查找,找到了在舊版的zxing中PlanarYUVLuminanceSource類有renderCroppedGreyscaleBitmap方法,不知為何去除了。。。
3.之后修改了一些相機的參數(shù)信息,適配了部分設(shè)備的預(yù)覽效果?;镜捻撁嫘薷牧艘幌?。這里就不贅述了。
走一波,如下效果:

可以發(fā)現(xiàn)除了數(shù)字以外,它將中文識別為了字母。其實問題首先是我們使用了英文的訓(xùn)練數(shù)據(jù),同時白名單設(shè)置了a~z的字母。當(dāng)然你也不能將字母設(shè)置為黑名單,那樣只會讓識別不出的字符識別為亂七八糟的數(shù)字。
這里我給出的建議是利用正則去篩選,這樣你可以識別你想要的各種格式數(shù)據(jù)。我這里只是做了手機號的簡單識別,大家可以舉一反三去處理。
public static String getTelNum(String sParam){
if(TextUtils.isEmpty(sParam)){
return "";
}
Pattern pattern = Pattern.compile("(1|861)(3|5|7|8)\\d{9}$*");
Matcher matcher = pattern.matcher(sParam);
StringBuilder bf = new StringBuilder();
while (matcher.find()) {
bf.append(matcher.group()).append(",");
}
int len = bf.length();
if (len > 0) {
bf.deleteCharAt(len - 1);
}
return bf.toString();
}
修改后如下:(同時支持多個號碼)

當(dāng)然本項目也保留了掃碼功能(可在DecodeHandler中自己添加條碼格式):

細心的同學(xué)可以從圖中看到掃描框的大小都不一樣,這里我是改成了可以手動調(diào)節(jié)大小的掃描框。畢竟掃碼模式下,框大一點還是比較好識別(將二維碼放入框中有時就費時間)。掃數(shù)字這些文字時,框小一點會好識別。具體可以下載自行體驗。
最后我將代碼已經(jīng)上傳至Github:Tesseract-OCR-Scanner
總結(jié)
以上所述是小編給大家介紹的Android實現(xiàn)掃一掃識別數(shù)字功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Android 超詳細講解fitsSystemWindows屬性的使用
fitsSystemWindows屬性可以讓view根據(jù)系統(tǒng)窗口來調(diào)整自己的布局;簡單點說就是我們在設(shè)置應(yīng)用布局時是否考慮系統(tǒng)窗口布局,這里系統(tǒng)窗口包括系統(tǒng)狀態(tài)欄、導(dǎo)航欄、輸入法等,包括一些手機系統(tǒng)帶有的底部虛擬按鍵2022-03-03
Android使用Canvas?2D實現(xiàn)循環(huán)菜單效果
循環(huán)菜單有很多種自定義方式,我們可以利用ViewPager或者RecyclerView?+?CarouselLayoutManager?或者RecyclerView?+?PageSnapHelper來實現(xiàn)這種效果,今天我們使用Canvas?2D來實現(xiàn)這種效果,感興趣的朋友可以參考下2024-01-01
直接應(yīng)用項目中的Android圖片緩存技術(shù)
這篇文章主要為大家詳細介紹了直接應(yīng)用項目中的Android圖片緩存技術(shù),簡單、方便、高效,感興趣的小伙伴們可以參考一下2016-04-04
Android編程之DatePicker和TimePicke簡單時間監(jiān)聽用法分析
這篇文章主要介紹了Android編程之DatePicker和TimePicke簡單時間監(jiān)聽用法,結(jié)合具體實例形式分析了時間控件DatePicker和TimePicke布局與具體功能實現(xiàn)技巧,需要的朋友可以參考下2017-02-02
淺談Android應(yīng)用的內(nèi)存優(yōu)化及Handler的內(nèi)存泄漏問題
這篇文章主要介紹了Android應(yīng)用的內(nèi)存優(yōu)化及Handler的內(nèi)存泄漏問題,文中對Activity無法被回收而造成的內(nèi)存泄漏給出了通常的解決方案,需要的朋友可以參考下2016-02-02
Android使用Intent傳大數(shù)據(jù)簡單實現(xiàn)詳解
這篇文章主要為大家介紹了Android使用Intent傳大數(shù)據(jù)簡單實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03
AndroidStudio 3.6 中 R.layout 找不到對應(yīng)的xml文件問題及解決方法
這篇文章主要介紹了AndroidStudio 3.6 中 R.layout 找不到對應(yīng)的xml文件問題,本文給出了解決方法對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03

