zoukankan      html  css  js  c++  java
  • Android OCR 之 tesseract

    OCR属于CV的范畴,也就是计算机视觉,目前来看,除了opencv这个龙头老大,也就是hp开发的tesseract比较好用,虽然年头比较长了,但现在归google维护并托管在google code上了。

    现在有android版本的
    地址:http://code.google.com/p/tesseract-android-tools/

    这个版本得自己git 三个库 leptonica  tesseract  libjpeg ,我自己是编译成功了,但测试的时候native层总是crash。

    于是发现了tess的android的另一个分支 tess-two

    推荐linux上编译

    一、下载&编译

    1、首先下载tess-two

    git clone git://github.com/rmtheis/tess-two tess


    2、进入 tess目录,里面有三个项目,我们只需要进入tess-two就可以直接编译了

    cd tess/tess-two
    ndk-build


     3、编译好后,将src下的两个包以及libs导入到自己的项目就可以用啦

    这里把我我把编译好后的东西放出来,用的话不用再编译了

    下载:tess-two.zip

    二、使用

    tesseract 使用了 leptonica的图像处理库,对于图像处理还是比较强大的

    Android官方地址:tesseract-android-tools

    但它必须要一个匹配库,即tessdata,我们可以从官方拷贝,在前面git的项目里面tesseract源码目录有现成的tessdata可以用,对于中文,google code上也有下载,当然也可以自己训练不同语言的tessdata。

    包leptonica的类我们不必使用,只要使用tess包的类就行了

    TessBaseAPI

    使用时,首先创建TessBaseAPI对象

    TessBaseAPI baseApi=new TessBaseAPI();

    //初始化tess
    //android下面,tessdata肯定得放到sd卡里了
    //如果tessdata这个目录放在sd卡的根目录
    //那么path直接传入sd卡的目录
    //eng就是英文,关于语言,按ISO 639-3标准的代码就行,具体请移步wiki
    baseApi.init("tessdata文件夹的父级目录", "eng");

    //options是为了缩放图片,这个酌情缩放,图片小的话可以不缩放
    BitmapFactory.Options options=new BitmapFactory.Options();
    //缩小为原来的1/2
    options.inSampleSize=2;

    //bitmap,我这里是以流的形式,只要能形成Bitmap就行
    Bitmap bitmap = BitmapFactory.decodeStream(instream,null,options);
    instream.close();


    //如果图片有Alpha值,那么最好设置一下
    /*
    ExifInterface exif = new ExifInterface(filename)
    int exifOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);


    int rotate = 0;
    switch (exifOrientation) {
    case ExifInterface.ORIENTATION_ROTATE_90:
    rotate = 90;
    break;
    case ExifInterface.ORIENTATION_ROTATE_180:
    rotate = 180;
    break;
    case ExifInterface.ORIENTATION_ROTATE_270:
    rotate = 270;
    break;
    }


    if (rotate != 0) {

    // Getting width & height of the given image.
    int w = bitmap.getWidth();
    int h = bitmap.getHeight();

    // Setting pre rotate
    Matrix mtx = new Matrix();
    mtx.preRotate(rotate);

    // Rotating Bitmap
    bitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, false);
    // tesseract req. ARGB_8888
    bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
    }
    */

    //设置要ocr的图片bitmap
    baseApi.setImage(bitmap);
    //根据Init的语言,获得ocr后的字符串
    String text= baseApi.getUTF8Text();
    //释放bitmap
    baseApi.clear();

    //如果连续ocr多张图片,这个end可以不调用,但每次ocr之后,必须调用clear来对bitmap进行释放
    //释放native内存
    baseApi.end();

    ///////////////////////////其它方法//////////////////////////////////


    //获取字符边框

    Pixa pixa= baseApi.getCharacters();

    //同上,这个是整段文字的边框
    baseApi.getRegions();

    //同上,只不过这里是条线
    baseApi.getTextlines();

    //剩下的自己测试吧。

    //转为rect数组 ,之后,可以很方便的在图片上框出方框
    //怎么框由你
    ArrayList<Rect> rects=pixa.getBoxRects();


    结束。

    android下ocr就这么简单,好好使用第三方库就行了。

    ps:在使用这套库对12306的验证码进行ocr时,耗时50ms左右。

  • 相关阅读:
    Android自定义drawable(Shape)详解
    如何设置对话框的宽度和高度
    Android资料之-EditText中的inputType
    android4.0 禁止横竖屏切换使用 android:configChanges="orientation|keyboardHidden"无效的解决方法
    android ScrollView 充满屏幕
    治疗神经衰弱最有效的方法和药物是什么
    交换机和路由器的区别
    小众编程语言同样值得你关注
    RotateAnimation详解
    你可能没听过的 Java 8 中的 10 个特性
  • 原文地址:https://www.cnblogs.com/hangxin1940/p/2321507.html
Copyright © 2011-2022 走看看