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

2019-10-24 18:22:57 浏览数 (1)

前面文章《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还是会继续上传上去的。

0 人点赞