当前位置:   article > 正文

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

android tesseract

前言

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

演示效果

format,png

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

代码实现

首先下载tess-two和字体库

format,png

format,png

下载完成到我们的目录中

format,png

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

format,png

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

format,png

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

  1. buildscript {
  2. repositories {
  3. jcenter()
  4. }
  5. dependencies {
  6. classpath 'com.android.tools.build:gradle:2.1.2'
  7. classpath 'org.codehaus.groovy:groovy-backports-compat23:2.3.5'
  8. classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'
  9. classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
  10. }
  11. }
  12. apply plugin: 'com.android.library'
  13. apply plugin: 'com.github.dcendents.android-maven'
  14. apply plugin: 'com.jfrog.bintray'

如下图:

format,png

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

拷贝字库文件进Android设备

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

format,png

AndroidManifest.xml

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

  1. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  2. <uses-permission android:name="android.permission.READ_PHONE_STATE" />

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

format,png

activity_main.xml布局文件

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

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:orientation="vertical"
  6. android:layout_width="match_parent"
  7. android:layout_height="match_parent"
  8. tools:context=".MainActivity">
  9. <ImageView
  10. android:layout_width="match_parent"
  11. android:layout_height="300dp"
  12. android:id="@+id/imgv"/>
  13. <Button
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:id="@+id/btnOcr"
  17. android:text="识别"/>
  18. <TextView
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:text="Hello World!"
  22. android:id="@+id/tvshow" />
  23. </LinearLayout>

MainActivity.java

  1. public class MainActivity extends AppCompatActivity {
  2. private ImageView imgv;
  3. private TextView tvshow;
  4. private Button btnocr;
  5. private Bitmap bmp;
  6. //如果Android的版本大于23,路径取根目录下的tesserart,小于的话是
  7. //在mnt/sdcard下面
  8. private String DATAPATH=Environment.getExternalStorageDirectory().getAbsolutePath() +
  9. File.separator + "tesserart";
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.activity_main);
  14. requestPermission();
  15. imgv=findViewById(R.id.imgv);
  16. //获取自己的图片,这里是自己放在项目里面的。
  17. bmp=BitmapFactory.decodeResource(this.getResources(), R.drawable.tiddmg);
  18. imgv.setImageBitmap(bmp);
  19. imgv.setScaleType(ImageView.ScaleType.FIT_XY);
  20. tvshow=findViewById(R.id.tvshow);
  21. btnocr=findViewById(R.id.btnOcr);
  22. btnocr.setOnClickListener(new View.OnClickListener() {
  23. @Override
  24. public void onClick(View view) {
  25. try {
  26. TessBaseAPI mTess=new TessBaseAPI();
  27. //存放tessdata的文件路径 就是chi_sim.traineddata文件的位置chi_sim.traineddata
  28. //选择语言 chi_sim 简体中文 eng 英文
  29. String language="chi_sim";
  30. File dirdatapath=new File(DATAPATH);
  31. if (!dirdatapath.exists()) {
  32. dirdatapath.mkdirs();
  33. }
  34. File dir=new File(DATAPATH,"tessdata");
  35. if (!dir.exists())
  36. dir.mkdirs();
  37. tvshow.append(DATAPATH+"\r\n");
  38. mTess.init(DATAPATH, language);
  39. //将图片设置到mTess进行识别
  40. mTess.setImage(bmp);
  41. //获取识别的文字(这里会等一段时间,这里的代码是在主线程的,建议将这部分代码放到子线程)
  42. String result=mTess.getUTF8Text();
  43. tvshow.append("结果为:" + result);
  44. } catch (Exception e) {
  45. e.printStackTrace();
  46. tvshow.append(e.getMessage());
  47. }
  48. }
  49. });
  50. }
  51. void requestPermission() {
  52. final int REQUEST_CODE=1;
  53. if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
  54. ActivityCompat.requestPermissions(this, new String[]{
  55. Manifest.permission.WRITE_EXTERNAL_STORAGE,
  56. Manifest.permission.READ_EXTERNAL_STORAGE},
  57. REQUEST_CODE);
  58. }
  59. }
  60. }

重点说明:

format,png

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



format,png

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

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

format,png

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

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

-END-

Vaccae的往期经典


OpenCV

《C++ OpenCV案例实战---卡号获取

《C++ OpenCV案例实战---卡片截取(附代码)

《C++ OpenCV透视变换---切换手机正面图片》

《C++ OpenCV实战---获取数量

《C++ OpenCV实战---利用颜色分割获取数量》

《OpenCV4Android NDK方式进行Canny边缘检测》


Android

《Android利用SurfaceView结合科大讯飞修改语音实别UI

《Android关于语音识别的功能实现分析(一)---结构化思维》

《Android关于语音识别的功能实现分析(二)---语义解析》

《Android根据类生成签名字符串

《Android碎片化布局fragment的实战应用

《Android中RecyclerView嵌套RecyclerView

《Android里用AsyncTask后的接口回调


.Net C#

《C#自定义特性(Attribute)讲解与实际应用

《C#根据类生成签名字符串(附DEMO下载地址)

《C++创建动态库C#调用》

《C#与三菱PLC(型号FX2N)串口通讯类


数据库及其它

《Oracel存储过程写报表实战》

《Delphi轮播视频和图片程序(用于双屏显示程序)

《SQL随机增加销售数据的脚本编写(附脚本下载地址)

SQL Server中With As的介绍与应用(三)--递归的实战应用

《Oracle通过ODBC连接SQL Server数据库

Oracle利用row_number()over()方式解决插入数据时重复键的问题


长按下方二维码关注微卡智享

format,png

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/368675
推荐阅读
相关标签
  

闽ICP备14008679号