当前位置:   article > 正文

Android光学字体识别 -- Android OCR demo_com.googlecode.tesseract.android.tessbaseapi

com.googlecode.tesseract.android.tessbaseapi

最近因为工作的原因,好久没有写博客了。(看到有很多评论和留言,都不能一一回复啦~)


 过年之前Oracle组织过一次内部的编程马拉松,当时选择的题目是OCR相关的,但是但是做出来的效果不是很好,就一直想着把代码重新整理一下,优化一下效果。


目前随着国内互联网火的一塌糊涂,似乎也带动了图像处理的发展与引用,以前一直觉得图像处理很难找到合适的工作,所以找工作的时候就换了自然语言处理,然后现在发现互联网招聘图像处理工程师也很多。。。


废话不多说,来看OCR on Android .


作OCR的话,需要使用一些已有的sdk, 例如tesseract,这个是Google的一个开源项目貌似国内访问这个比较费劲。

tesseract是C语言开发的,如果想要使用的Android平台上,需要通过Android平台的JNI调用机制,有兴趣的朋友可以参考:http://blog.csdn.net/watkinsong/article/details/9849973


对于大部分朋友来说,完全不需要直接操作底层的c语言,毕竟通过JNI调用非常难调试。 为了便于使用tesseract,github上有个叫tess-two的项目,把tesseract的底层API封装为Android平台可以直接使用的java API, 这样直接引用这个项目就可以直接进行OCR开发了。 


如果不想看下面的罗嗦,直接下载我的Demo项目,直接看代码就可以了,下载地址: https://github.com/weixsong/libra, 注意,这是一个项目的集合,找到OCRDemo文件夹就是相应的项目。


第一步: 到 https://github.com/weixsong/tess-two 下载最新的tess-two项目,通过eclipse导入该羡慕

第二部:创建你自己的OCR项目,然后引用tess-two项目,这样就可以使用tess-two项目提供的API以及.so文件了。




第三步:到https://code.google.com/p/tesseract-ocr/, 下载你需要的对应的语言的已经训练好的训练数据(至于这个数据是模板,还是个神经网络,还是分类器。。。我不知道), 然后把训练数据放入Android 项目的 asset文件目录中,


需要注意的是,在写Android程序时,需要把训练好的分类文件拷贝到Android存储中:

  1. private void checkAndCopyFiles() {
  2. String[] paths = new String[] { DATA_PATH, DATA_PATH_TESSDATA };
  3. for (String path : paths) {
  4. File dir = new File(path);
  5. if (!dir.exists()) {
  6. if (!dir.mkdirs()) {
  7. Log.v(TAG, "ERROR: Creation of directory " + path
  8. + " on sdcard failed");
  9. return;
  10. } else {
  11. Log.v(TAG, "Created directory " + path + " on sdcard");
  12. }
  13. }
  14. }
  15. for (String lang : langs) {
  16. String traineddata_path = DATA_PATH_TESSDATA + lang
  17. + ".traineddata";
  18. String asset_tessdata = "tessdata/" + lang + ".traineddata";
  19. if (!(new File(traineddata_path)).exists()) {
  20. try {
  21. AssetManager assetManager = getAssets();
  22. InputStream in = assetManager.open(asset_tessdata);
  23. OutputStream os = new FileOutputStream(traineddata_path);
  24. // Transfer bytes from in to out
  25. byte[] buf = new byte[1024];
  26. int len;
  27. while ((len = in.read(buf)) > 0) {
  28. os.write(buf, 0, len);
  29. }
  30. in.close();
  31. os.close();
  32. Log.v(TAG, "Copied " + lang + " traineddata");
  33. } catch (IOException e) {
  34. Log.e(TAG,
  35. "unable to copy " + lang + " traineddata "
  36. + e.toString());
  37. }
  38. }
  39. }
  40. }


第四步:就可以使用tess-two进行OCR识别了,当然,你需要提供一张照片。。。


  1. package com.example.homework;
  2. import android.graphics.Bitmap;
  3. import android.util.Log;
  4. import com.googlecode.tesseract.android.TessBaseAPI;
  5. public class TesstwoOCR {
  6. private static final String TAG = "TesstwoOCR";
  7. private TessBaseAPI ocr_eng;
  8. private TessBaseAPI ocr_chi;
  9. public TesstwoOCR() {
  10. Log.v(TAG, "BaseApi initializing...");
  11. ocr_eng = new TessBaseAPI();
  12. ocr_eng.setDebug(true);
  13. ocr_eng.init(MainActivity.DATA_PATH, MainActivity.LANG_EN);
  14. ocr_chi = new TessBaseAPI();
  15. ocr_chi.setDebug(true);
  16. ocr_chi.init(MainActivity.DATA_PATH, MainActivity.LANG_ZH);
  17. }
  18. public String doOCR(Bitmap bitmap, String lang) {
  19. String result = "";
  20. if (lang.equals(MainActivity.LANG_EN)) {
  21. ocr_eng.setImage(bitmap);
  22. result = ocr_eng.getUTF8Text();
  23. } else if (lang.equals(MainActivity.LANG_ZH)) {
  24. ocr_chi.setImage(bitmap);
  25. result = ocr_chi.getUTF8Text();
  26. } else {
  27. //nothing
  28. }
  29. return result.trim();
  30. }
  31. }

上面的代码我分别使用了中文和英文的OCR识别,因为再我的Demo中可以进行中英文识别的切换。



因为这里给出了Demo的源代码, 所以整个过程描述的比较简单。大家还是尽量参考Demo代码进行对应的OCR识别的开发。 Demo 下载地址:https://github.com/weixsong/libra, 在源代码中,也有详细的如何使用该项目的说明。


下面是OCR识别的效果截图, 总体来说,目前的效果还是相当不错的:

Screenshot_2015-04-29-16-34-36.png


Screenshot_2015-04-29-16-37-24.png


Screenshot_2015-04-30-09-40-17.png


Screenshot_2015-04-30-09-42-08.png


Screenshot_2015-04-30-09-43-30.png

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

闽ICP备14008679号