前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android划矩形截屏并加入OCR识别

Android划矩形截屏并加入OCR识别

作者头像
Vaccae
发布2019-10-24 18:22:57
2.3K1
发布2019-10-24 18:22:57
举报
文章被收录于专栏:微卡智享微卡智享

前面文章《Android SurfaceVeiw划矩形截屏存放到RecyclerView中》已经通过手指划矩形把图片存入到RecyclerView中了,以前也加入过TeseractOCR的识别,因为截取的图像不理解 ,所以识别的效果也不好,所以这次利用截图方式再做一个简单的图像预处理来看看识别效果。

代码实现

每次重新搭新框架确实好麻烦,所以我们还在原来的那个DEMO上直接加入OCR的模块。

★ 实现方法 ★

01

在原DEMO上加入TesserartOCR

02

界面上加入一个TextView用于识别后显示出来

03

NDK中加入C++的类来做为图片的预处理

加入TesserartOCR配置

build.gradle中右侧红框的中的目录里原来已经存放了对应的OCR的动态库,这里我们就没再修改,动态库如下图

在dependencies中要加入api 'com.rmtheis:tess-two:8.0.0',这样我们才能使用OCR识别。

OCR相关的类

新建VaccaeTesserat的类

这个类中用AsyncTask来处理OCR的识别,具体代码如下:

代码语言:javascript
复制
public class VaccaeTesserat extends AsyncTask<Bitmap, String, String> {

    private Context mContext;
    private TesseratCallBack mCallBack;

    public VaccaeTesserat(Context context) { 
       mContext=context;
        mCallBack=(TesseratCallBack)mContext;
    }

    @Override
    protected String doInBackground(Bitmap... bitmaps) {
        TessBaseAPI tessAPI=null;
        try {

            StringBuilder sb=new StringBuilder();
            // 核心预设置代码
            tessAPI=new TessBaseAPI();
            //如果Android的版本大于23,路径取根目录下的tesserart,小于的话是
            //在mnt/sdcard下面
            String path=Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "tesserart";            
            tessAPI.setDebug(true);
            tessAPI.init(path , "chi_sim");
            //第一张为原图不取
            if (bitmaps.length > 1) {
                for (int i=1; i < bitmaps.length; i++) {
                    tessAPI.setImage(bitmaps[i])
;                    // 获取并显示识别结果
                    sb.append(tessAPI.getUTF8Text());
                }
            } else {
                tessAPI.setImage(bitmaps[0]);
                sb.append(tessAPI.getUTF8Text());
            }

            mCallBack.CallBackOver(sb.toString());
        } catch (Exception e) {
            Log.e("Tess", e.getMessage());
            mCallBack.CallBackOver(e.getMessage());
        } finally {
            tessAPI.clear();
            tessAPI.end();
        }

        return null;
    }
}

TesseratCallBack回调函数

再建一个接口回调函数,用于处理识别后返回的数据

代码语言:javascript
复制
public interface TesseratCallBack {

    void CallBackOver(String... msg);
}

MainActivity中加入回调函数操作

在MainActivity中加入回调函数的操作,用于接收到识别的文字后我们在TextView中显示出来。

NDK中图片的预处理

新建C++的类ocrpreprocess用于做图片的预处理

加入了一个静态方法dealocrbmp

预处理也很简单,我们直接就是转为灰度图,通过高斯模糊降燥,然后把图片二值化了,这样让识别字体的更方便一些

然后我们在native-lib.cpp中处理截图这里加入调用的这个方法,让其变成二值化的数据显示出来。

VaccaeSurfaceView修改

在VaccaeSurfaceView修改就比较简单了,直接在返回的图片中加入对TesserartOCR的调用即可。

效果图片

到这里我们的简单改造就算结束了,从视频中看识别的效果还可以,因为我用的是默认的字库,如果要好的效果就要自己训练数据了。

上面来说我们是一个简单的识别效果,后面我会找个时间继续更新,在截取后的图片预处里中加入分割和透视变换,目的就是让其不是在非常正的角度下截图也能加大识别的效果,等全部完成后,Demo还是会继续上传上去的。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微卡智享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代码实现
    • ★ 实现方法 ★
      • 加入TesserartOCR配置
        • OCR相关的类
          • 新建VaccaeTesserat的类
          • TesseratCallBack回调函数
          • MainActivity中加入回调函数操作
        • NDK中图片的预处理
          • VaccaeSurfaceView修改
            • 效果图片
            相关产品与服务
            文字识别
            文字识别(Optical Character Recognition,OCR)基于腾讯优图实验室的深度学习技术,将图片上的文字内容,智能识别成为可编辑的文本。OCR 支持身份证、名片等卡证类和票据类的印刷体识别,也支持运单等手写体识别,支持提供定制化服务,可以有效地代替人工录入信息。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档