
前一天下午我没事做. 我的朋友有需要,说他想在上标识号. 空闲时,他帮助他解决了问题,更不用说它有多完美了,但至少这是对需求的一种解决方案. 不再闲话.
让我们先来看看我的演示

Paste_Image.png
它也来自其他人的演示,它实际上是其他人使用的界面,但是当我看它时,它应该被视为“异常呼叫”(这意味着每个人都可以自己理解). 让我们分析这种方法的优缺点.
优点: 上传照片非常快,将返回上的所有信息,包括姓名,地址,出生等.

缺点: “异常”呼叫具有一定程度的可靠性. 如果有人关闭或更改此界面,将更加尴尬. 当然,您可以选择购买其他版本的官方版本.

Paste_Image.png
基于Tess_two的识别,您可以放心使用它. 首先看看如何使用它!
第一句:
compile 'com.rmtheis:tess-two:6.0.0'

然后使用它. 实际上,它非常简单易用,但要注意一些要点
1. 要在SD卡上拥有他的识别库,可以将该库理解为字典,可以自己训练该字典,因为我已经被他人训练过(只包含英文和数字),所以不说如何训练,百度会有很多.
2. 请注意,其他字典的路径文件夹名称必须为“ tessdata”,否则将报告错误
好的android 验证号码,准备工作已经完成. 接下来,我将介绍如何使用它. 我直接粘贴核心代码. 代码中有注释,无法阅读的消息或发给我的私人消息
//训练数据路径,tessdata
static final String TESSBASE_PATH = Environment.getExternalStorageDirectory() + "/";
//识别语言英文
static final String DEFAULT_LANGUAGE = "eng";
/**
* 传SD卡图片路径(当然你们也可以传Bitmap)
* @param url
*/
private void localre(String url) {
//把图片转为Bitmap
Bitmap bmp = BitmapFactory.decodeFile(url);
//创建Tess
final TessBaseAPI baseApi = new TessBaseAPI();
//下面这一块代码为裁取号码区域(否则识别乱码,不准确)
int x, y, w, h;
x = (int) (bmp.getWidth() * 0.340);
y = (int) (bmp.getHeight() * 0.800);
w = (int) (bmp.getWidth() * 0.6 + 0.5f);
h = (int) (bmp.getHeight() * 0.12 + 0.5f);
Bitmap bit_hm = Bitmap.createBitmap(bmp, x, y, w, h);
//这个只是我将裁取的号码区展示在了一个ImageView上,这个可以没有
iv_number.setImageBitmap(bit_hm);
//初始化OCR的训练数据路径与语言
baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE);
//设置识别模式
baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_LINE);
//设置要识别的图片
baseApi.setImage(bit_hm);
//设置字典白名单
baseApi.setVariable("tessedit_char_whitelist", "0123456789Xx");
//把识别内容设置到EditText里
tv_result.setText(baseApi.getUTF8Text());
//收尾
baseApi.clear();
baseApi.end();
}
好android 验证号码,就是这么简单. 当图片被清楚地切割并且区域正确时,精度几乎达到100%;
为您提供照的示例,否则编号将不正确

Paste_Image.png
上一个结果图

Paste_Image.png
实际上,它是本地识别的扩展版本. 将相机数据转换为位图以进行识别,或者坚持使用核心代码. 了解演示研究.
/**
* 数据回调
* @param data
* @param camera
*/
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
camera.addCallbackBuffer(data);
//将byte数组转为Bitmap
ByteArrayOutputStream baos;
byte[] rawImage;
Bitmap bitmap;
Camera.Size previewSize = camera.getParameters().getPreviewSize();//获取尺寸,格式转换的时候要用到
BitmapFactory.Options newOpts = new BitmapFactory.Options();
newOpts.inJustDecodeBounds = true;
YuvImage yuvimage = new YuvImage(
data,
ImageFormat.NV21,
previewSize.width,
previewSize.height,
null);
baos = new ByteArrayOutputStream();
yuvimage.compressToJpeg(new Rect(0, 0, previewSize.width, previewSize.height), 100, baos);// 80--JPG图片的质量[0-100],100最高
rawImage = baos.toByteArray();
//将rawImage转换成bitmap
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;
bitmap = BitmapFactory.decodeByteArray(rawImage, 0, rawImage.length, options);
if (bitmap == null) {
Log.d("zka", "bitmap is nlll");
return;
} else {
//裁取图片中央区域
int height = bitmap.getHeight();
int width = bitmap.getWidth();
final Bitmap bitmap1 = Bitmap.createBitmap(bitmap, width/2 - dip2px(150),height / 2 - dip2px(92), dip2px(300), dip2px(185));
//截取号码区域
int x, y, w, h;
x = (int) (bitmap1.getWidth() * 0.340);
y = (int) (bitmap1.getHeight() * 0.800);
w = (int) (bitmap1.getWidth() * 0.6 + 0.5f);
h = (int) (bitmap1.getHeight() * 0.12 + 0.5f);
Bitmap bit_hm = Bitmap.createBitmap(bitmap1, x, y, w, h);
// 识别
if(bit_hm != null){
String localre = localre(bit_hm);
if (localre.length() == 18) {
Log.e(TAG, "onPreviewFrame: "+localre );
Toast.makeText(getApplicationContext(),localre,Toast.LENGTH_SHORT).show();
}
}
}
}
/**
* 识别
* @param bm
* @return
*/
private String localre(Bitmap bm) {
String content = "";
bm = bm.copy(Bitmap.Config.ARGB_8888, true);
iv_result.setImageBitmap(bm);
TessBaseAPI baseApi = new TessBaseAPI();
baseApi.init(TESSBASE_PATH, DEFAULT_LANGUAGE);
//设置识别模式
baseApi.setPageSegMode(TessBaseAPI.PageSegMode.PSM_SINGLE_LINE);
//设置要识别的图片
baseApi.setImage(bm);
baseApi.setVariable("tessedit_char_whitelist", "0123456789Xx");
Log.e(TAG, "localre: "+ baseApi.getUTF8Text());
content = baseApi.getUTF8Text();
baseApi.clear();
baseApi.end();
return content;
}

Paste_Image.png
GitHub直接:
2019.10.21提示: 全屏手机需要调整切割参数,否则实时识别无效! ! !
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-198776-1.html
只要不是军用目的或者长期停靠
就是行贿的最典型代表啊
不就是个死吗