由于项目需要识别某个数字,然后在网上搜索半天,几乎都是tess-two。用法我就不讲了,https://blog.csdn.net/qq_17766199/article/details/77963278#comments,这里讲的很清楚了
我直接识别本地的一张图片,主要用detectText 方法:
public String detectText(Bitmap bitmap) {
Log.d(TAG, "Initialization of TessBaseApi");
TessDataManager.initTessTrainedData(MyApplication.sAppContext);
TessBaseAPI tessBaseAPI = new TessBaseAPI();
String path = TessDataManager.getTesseractFolder();
Log.d(TAG, "Tess folder: " + path);
tessBaseAPI.setDebug(true);
tessBaseAPI.init(path, "eng");
// 白名单
tessBaseAPI.setVariable(TessBaseAPI.VAR_CHAR_WHITELIST, "0123456789");
// 黑名单
// tessBaseAPI.setVariable(TessBaseAPI.VAR_CHAR_BLACKLIST, "!@#$%^&*()_+=-[]}{;:'\"\\|~`,./<>?");
tessBaseAPI.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_WORD);
Log.d(TAG, "Ended initialization of TessEngine");
Log.d(TAG, "Running inspection on bitmap");
tessBaseAPI.setImage(bitmap);
String inspection = tessBaseAPI.getUTF8Text();
Log.d(TAG, "Confidence values: " + tessBaseAPI.meanConfidence());
tessBaseAPI.end();
System.gc();
Log.e("syso",inspection);
return Tools.getTelNum(inspection);
}
这就不多说了,我就说注意的几点:
一、如果你想放你的识别库,你可以在TessDataManager类中找到readRawTrainingData方法,将你的识别库改为eng_traineddata这个名字替换,是最简单的。
private static byte[] readRawTrainingData(Context context){
try {
InputStream fileInputStream = context.getResources()
.openRawResource(R.raw.eng_traineddata);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] b = new byte[1024];
int bytesRead;
while (( bytesRead = fileInputStream.read(b))!=-1){
bos.write(b, 0, bytesRead);
}
fileInputStream.close();
return bos.toByteArray();
} catch (FileNotFoundException e) {
Log.e(TAG, "Error reading raw training data file\n"+e.getMessage());
return null;
} catch (IOException e) {
Log.e(TAG, "Error reading raw training data file\n" + e.getMessage());
}
return null;
}
二、如果你是要识别单个数字或者一行数字一列数字,你可以尝试改变一下
tessBaseAPI.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_WORD);
这个方法。setPageSegMode里面有很多模式,默认是PSM_AUTO_OSD,应该是自动识别的意思。
其他模式:PSM_OSD_ONLY, PSM_AUTO_OSD, PSM_AUTO_ONLY, PSM_AUTO, PSM_SINGLE_COLUMN, PSM_SINGLE_BLOCK_VERT_TEXT, PSM_SINGLE_BLOCK, PSM_SINGLE_LINE, PSM_SINGLE_WORD, PSM_CIRCLE_WORD, PSM_SINGLE_CHAR, PSM_SPARSE_TEXT, PSM_SPARSE_TEXT_OSD, PSM_RAW_LINE。
属性是啥意思就不解释了,英文名解释的差不多清楚。
三、关于 String inspection = tessBaseAPI.getUTF8Text();
我见很多文章都是写着String inspection = tessBaseAPI.getHOCRText(0);
然后还得需要正则去筛选你想要的结果,但是给我感觉还是getUTF8Text比较方便,直接识别。
最后上一下截图:
项目地址:
链接:https://pan.baidu.com/s/1M0sPxBcN6LiIynYRKYnHsA
提取码:vigr