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

前面文章《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的识别,具体代码如下:

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回调函数

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

public interface TesseratCallBack {

    void CallBackOver(String... msg);
}

MainActivity中加入回调函数操作

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

NDK中图片的预处理

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

加入了一个静态方法dealocrbmp

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

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

VaccaeSurfaceView修改

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

效果图片

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

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

本文分享自微信公众号 - 微卡智享(VaccaeShare)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程沉思录

C++智能指针的正确使用方式

C++11中推出了三种智能指针,unique_ptr、shared_ptr和weak_ptr,同时也将auto_ptr置为废弃(deprecated)。

34830
来自专栏小樱的经验随笔

C/C++ 中带空格字符串输入的一些小trick

上面这段代码并不能很好的统计字符串中每个英文字母在其中的出现频率,我苦思冥想了许久,才发现了一个曾经忽略过的一个问题,cin 标准输入字符串在遇到空格时候将会被...

12110
来自专栏Java架构筑基

Java研发面试题『八部曲』——从第一步开始

Java中主要有如下几种类型的变量 局部变量 类变量(静态变量)-- 属于类 成员变量(非静态变量)-- 属于对象

9800
来自专栏微信公众号【Java技术江湖】

一文搞懂抽象类和接口,从基础到面试题,揭秘其本质区别!

本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看

13420
来自专栏自学测试之道

记一次批量查看ffmpeg抽帧后的图片(格式为H264)

当前的公司刚好做一个抽帧的项目,具体是通过抽取本地已经录制保存的TF(SD)卡里的视频文件,以每秒/帧的方式抽取,生成的图片文件格式为H264,如下图所示

17140
来自专栏Linux知识积累

使用元对象编译器

元对象编译器读取一个C++源文件。如果它发现其中的一个或多个类的声明中含有Q_OBJECT宏,它就会给这个使用Q_OBJECT宏的类生成另外一个包含元对象代码的...

10640
来自专栏科技分享

中断处理“下半部”机制【转】

转自:https://blog.csdn.net/myarrow/article/details/9287169

9010
来自专栏诸葛青云的专栏

用C++模拟"奇怪"的手机计算器

风水轮流转,出道多年一向默默无闻的手机计算器突然成了网红,类似手机计算器“全线阵亡”这样的言论充斥各种媒体。问题的起源是网友发现手机计算器上计算10%+10%这...

6700
来自专栏梧雨北辰的开发录

Block原理探究(上篇)-Block本质及存储域问题

主要内容: 1.理解Block的本质 2.理解Block的存储域分类 3.理解Block的Copy原理

8220
来自专栏诸葛青云的专栏

零基础怎样学习好C/C++?

C++比C多了两个加号,C++比C语言难学吗?如何入门C++?C++基础入门学什么?后期开发学什么?

4900

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励