Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android使用Tesseract-ocr进行文字识别

Android使用Tesseract-ocr进行文字识别

作者头像
Vaccae
发布于 2019-07-25 06:25:17
发布于 2019-07-25 06:25:17
10.3K00
代码可运行
举报
文章被收录于专栏:微卡智享微卡智享
运行总次数:0
代码可运行

前言

Tessseract是一款由HP实验室开发由 Google 维护的开源 OCR(Optical Character Recognition , 光学字符识别)引擎。能够支持中文十分难得。虽然其识别效果不是很理想,但是对于要求不高的中小型项目来说,已经足够用了。

Tesseract-OCR下载地址

文字识别一般都用的tesseract-ocr。 GitHub:https://github.com/tesseract-ocr/tesseract

我们今天在Android上应用推荐的有个tess-two

GitHub:https://github.com/rmtheis/tess-two

还有一个字体识别库Tessdata(chi_sim.traineddata中文简体,chi_tra.traineddata中文繁体,eng.traineddata 英文库)

GitHub: https://github.com/tesseract-ocr/tessdata

演示效果

上图中,整张图进行识别,我感觉效果还可以,如果前置用OPENCV做图像的预处理后,可能效果会更好。

代码实现

首先下载tess-two和字体库

下载完成到我们的目录中

新建一个TesserartDemo的项目,导入tess-two

建好项目后,我们通过Import Module导入tess-two,由于tess-two是个ndk的项目,所以我们必须要在SDK Tools里面加入CMake和NDK,如下图,具体NDK可以看看以前的文章《Android NDK编程(一)---NDK介绍及环境搭建

导入完tess-two后,我们进行编译,结果发现编译不过去,提示android-maven的错误。网上找了找资料,发现了解决办法。在tess-two的build.gradle的文件中配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
        classpath 'org.codehaus.groovy:groovy-backports-compat23:2.3.5'
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
    }
}

apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'

如下图:

重新编译,这次时间较长,我自己的电话大概花了十几分钟才编译完成。

拷贝字库文件进Android设备

我们利用Device File Explorer打开我们的虚拟机,将chi_sim.traineddata的字库文件拷贝到mnt/sdcard/tesserart/tessdata下,没有这个目录可以自己创建一下,后面会说到为什么拷贝到这里

AndroidManifest.xml

在这里面加入读取内存卡和写入内存卡的权限

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

在res/drawable里面把我们的图片文件复制进来

activity_main.xml布局文件

在布局文件中加入一个imageview,一个button和一个TextView

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:id="@+id/imgv"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btnOcr"
        android:text="识别"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:id="@+id/tvshow" />

</LinearLayout>

MainActivity.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MainActivity extends AppCompatActivity {

    private ImageView imgv;
    private TextView tvshow;
    private Button btnocr;
    private Bitmap bmp;

    //如果Android的版本大于23,路径取根目录下的tesserart,小于的话是
    //在mnt/sdcard下面
    private String DATAPATH=Environment.getExternalStorageDirectory().getAbsolutePath() +
            File.separator + "tesserart";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        requestPermission();


        imgv=findViewById(R.id.imgv);
        //获取自己的图片,这里是自己放在项目里面的。
        bmp=BitmapFactory.decodeResource(this.getResources(), R.drawable.tiddmg);
        imgv.setImageBitmap(bmp);
        imgv.setScaleType(ImageView.ScaleType.FIT_XY);

        tvshow=findViewById(R.id.tvshow);
        btnocr=findViewById(R.id.btnOcr);

        btnocr.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                try {
                    TessBaseAPI mTess=new TessBaseAPI();
                    //存放tessdata的文件路径 就是chi_sim.traineddata文件的位置chi_sim.traineddata
                    //选择语言 chi_sim 简体中文  eng 英文
                    String language="chi_sim";

                    File dirdatapath=new File(DATAPATH);
                    if (!dirdatapath.exists()) {
                        dirdatapath.mkdirs();
                    }
                    File dir=new File(DATAPATH,"tessdata");
                    if (!dir.exists())
                        dir.mkdirs();
                    tvshow.append(DATAPATH+"\r\n");
                    mTess.init(DATAPATH, language);
                    //将图片设置到mTess进行识别
                    mTess.setImage(bmp);
                    //获取识别的文字(这里会等一段时间,这里的代码是在主线程的,建议将这部分代码放到子线程)
                    String result=mTess.getUTF8Text();
                    tvshow.append("结果为:" + result);
                } catch (Exception e) {
                    e.printStackTrace();
                    tvshow.append(e.getMessage());
                }
            }
        });

    }

    void requestPermission() {
        final int REQUEST_CODE=1;
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{
                            Manifest.permission.WRITE_EXTERNAL_STORAGE,
                            Manifest.permission.READ_EXTERNAL_STORAGE},
                    REQUEST_CODE);
        }
    }

}

重点说明:

上图中DATAPATH的文件路径,用Environment.getExternalStorageDirectory().getAbsolutePath(),在API23以下的时候,路径就是我们拷贝的mnt\sdcard\,如果在API23或以上直接就是我们的根目录,我自己的模拟器是Android 4.1的也就是API18,所以这里直接拷文件拷到mnt\sdcard下了。刚才测试时用了自己手机(Android9.0),发现在mnt的sdcard下也有,可能我自己研究错了这里,先划掉吧。



上图中mTess.init这个要重点说一下,我们开始的DATAPATH的路径是mnt/sdcard/tesserart,在拷贝字库文件时我们下面还创建了一个tessdata的文件夹才拷进去了,如果你这里设置为mnt/sdcard/tesserart/tessdata的路径,就会报错了。

点开init这个函数我们看一下里面的写法

上图中标红色的就是它自己会根据输入的路径查找tessdata的文件夹,所以这里我们格外注意一下。

这样整个DEMO程序就可以运行起来如文章开始的效果了,如果是android6.0开始,要记得自己申请动态的权限读取内存。

-END-

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Tesseract OCR初探
Refer from http://hellosure.github.io/ocr/2014/10/11/tesseract-ocr/
全栈程序员站长
2022/07/25
7.8K0
Tesseract OCR初探
Java使用Tesseract-OCR实战
tesseract-ocr-w64-setup-v5.3.0.20221214.exe 选择安装目录,下一步,下一步默认安装
九转成圣
2024/04/10
6850
Tesseract-OCR 4.1.0 安装和使用— windows及CentOS
 OCR(Optical character recognition) —— 光学文字识别,是图像处理的一个重要分支,中文的识别具有一定挑战性,特别是手写体和草书的识别,是重要和热门的科学研究方向
NaughtyCat
2020/10/09
4K1
Tesseract-OCR 4.1.0 安装和使用— windows及CentOS
tesseract-ocr识别英文和中文图片文字以及扫描图片实例讲解
本文参考http://blog.sina.com.cn/s/blog_4aa166780101cji7.html实现,在这里感谢该文章的作者。 OCR(Optical Character Recognition):光学字符识别,是指对图片文件中的文字进行分析识别,获取的过程。 Tesseract:开源的OCR识别引擎,初期Tesseract引擎由HP实验室研发,后来贡献给了开源软件业,后经由Google进行改进,消除bug,优化,重新发布。当前版本为3.02 项目下载地址为:http://jaist.dl.
朱晓霞
2018/04/18
8.9K1
tesseract-ocr识别英文和中文图片文字以及扫描图片实例讲解
tesseract-ocr 实现图片识别功能
http://blog.sina.com.cn/s/blog_56d988430102w37c.html
bear_fish
2018/09/19
6.2K0
tesseract-ocr 实现图片识别功能
Android上图片文字识别
最近做了一款Android应用需要输入大量的数据,为了提高体验我想了很多种输入数据的方式,最终采用了两种:二维码扫描和图片识别。前者顾名思义有个短板,就是需要生成二维码,下面就介绍下图片文字识别实现。
全栈程序员站长
2022/07/01
34.1K0
Android上图片文字识别
tesseract-ocr安装
语言包地址:https://github.com/tesseract-ocr/tessdata
jaychou
2022/12/26
1.2K0
Android OCR文字识别 实时扫描手机号(极速扫描单行文本方案)
AI时代已经到了,各位小伙伴如果还有类似的需求,现在已经有很成熟的免费OCR库了,不用再挖古董文章了,钻研精神要保持,但也不用处处自己造轮子了哦
全栈程序员站长
2022/06/29
10K0
Android OCR文字识别 实时扫描手机号(极速扫描单行文本方案)
图像文字识别(四):java调用tess4j识别图像文字
Tesseract-OCR支持中文识别,并且开源和提供全套的训练工具,是快速低成本开发的首选。前面记录过在java中调用tesseract-orc,该方法的原理是通过在java中调用cmd命令行,来执行tesseract,但是该方式需要下载软件,在电脑上安装环境,移植性不高。
全栈程序员站长
2022/06/29
5.7K0
图像文字识别(四):java调用tess4j识别图像文字
利用tess-two和cv4j实现简单的ocr功能、
Tesseract是Ray Smith于1985到1995年间在惠普布里斯托实验室开发的一个OCR引擎,曾经在1995 UNLV精确度测试中名列前茅。但1996年后基本停止了开发。2006年,Google邀请Smith加盟,重启该项目。目前项目的许可证是Apache 2.0。该项目目前支持Windows、Linux和Mac OS等主流平台。但作为一个引擎,它只提供命令行工具。 现阶段的Tesseract由Google负责维护,是最好的开源OCR Engine之一,并且支持中文。
fengzhizi715
2018/08/24
1.5K0
利用tess-two和cv4j实现简单的ocr功能、
JAVA使用Tess4J进行ocr识别,并切换中文
Mac上安装 tesseract_MR.骑士道-CSDN博客_mac tesseract
全栈程序员站长
2022/09/07
3.9K0
JAVA使用Tess4J进行ocr识别,并切换中文
JAVA——Tess4J简单的图像识别DEMO
2、在任意地方创建一个文件夹tessdata,将下载的chi_sim.traineddata 和 eng.traineddata语言包存放在该目录下,也可以直接存放到自己项目的resources/tessdata目录下。
全栈程序员站长
2022/09/05
2.2K0
JAVA——Tess4J简单的图像识别DEMO
图像识别 | 使用 Java 实现AI人工智能技术-图像识别功能
说到语音识别、语音翻译、图像识别、人脸识别等等,现在已经非常非常非常普及了,看过‘最强大脑’的朋友,也应该对‘小度’这个机器人有所了解,战胜国际顶尖的‘大脑’- 水哥,(PS:内幕不知),那么今天,我们来看下关于图像识别,是如何做到的,Java又是如何识别图像的?
码神联盟
2018/07/30
12.6K0
图像识别  | 使用 Java 实现AI人工智能技术-图像识别功能
Python 图片识别 OCR
文章目录 Python 图片识别 OCR #1 需求 #2 环境 #3 安装 #3.1 macOS #3.2 Linux(CentOS) #4 使用 #4.1 python安装pytesseract库 #4.2 Python代码 #5 在线案例 Python 图片识别 OCR #1 需求 识别图片中的信息,如二维码 #2 环境 macOS / Linux Python3.7.6 #3 安装 #3.1 macOS 安装 tesseract //只安装tesseract,不安装训练工具 brew install
Autooooooo
2020/11/07
18.3K0
tesseract-ocr的使用
——显示出tesseract的版本号则表示安装,及环境变量配置成功。否则根据提示检查安装失败原因
搁浅同学
2022/07/21
1.4K0
Android平台OCR工具之Tess-two的编译
Tesseract是Ray Smith于1985到1995年间在惠普布里斯托实验室开发的一个OCR引擎,曾经在1995 UNLV精确度测试中名列前茅。但1996年后基本停止了开发。2006年,Google邀请Smith加盟,重启该项目。目前项目的许可证是Apache 2.0。该项目目前支持Windows、Linux和Mac OS等主流平台。但作为一个引擎,它只提供命令行工具。 现阶段的Tesseract由Google负责维护,是最好的开源OCR Engine之一,并且支持中文。
前端皮皮
2020/11/26
9640
java tess4j mave_图片处理,Tess4j读取验证码、识别文字
https://tesseract-ocr.github.io/tessdoc/Home.html
全栈程序员站长
2022/09/05
1.3K0
OpenCV Python + Tesseract-OCR轻松实现中文识别
下载Tesseract-OCR 5.0.0-alpha.20201127安装包并安装!然后在环境变量中添加
小白学视觉
2021/01/06
10.7K0
OpenCV Python + Tesseract-OCR轻松实现中文识别
Tesseract-OCR识别中文与训练字库实例
关于中文的识别,效果比较好而且开源的应该就是Tesseract-OCR了,所以自己亲身试用一下,分享到博客让有同样兴趣的人少走弯路。 文中所用到的身份证图片资源是百度找的,如有侵权可联系我删除。
竹清
2019/01/23
4.7K0
提取图片内容的 Python 程序
要编写一个提取图片内容的 Python 程序,可以使用 OCR(光学字符识别)技术。常用的库是 pytesseract,它结合了 Tesseract OCR 引擎。本次需求是使用python程序读取指定文件夹中的图片,提取图片中的文字内容,并且将提取的内容生成txt档案,txt档案与识别的图片单独放在一个文件夹中。由于图片中的内容是中文,还需要下载安装chi_sim.traineddata文件
易辰君
2024/11/07
5930
相关推荐
Tesseract OCR初探
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验