标签:
网上大多是eclipse的项目,因为我用的是AS,所以说一下怎么配置。
身份证图片资料来自百度。
一、导入相关文件
其实我们不用自己编译,可以把别人项目编译好的jar包和so库直接拿来用。因为识别的效果只与字库有关,要识别什么字体自己选用字库就行。
1、新建libs文件夹,导入jar包
2、在main文件夹下新建jniLibs文件夹,把armxxxx两个文件复制过去。
注意so库不能乱放,不然会出现java.lang.UnsatisfiedLinkError异常。
3、我已经在github上提供了so库和jar包的资源了,可以直接下载使用。
配置好的路径:

二、实例代码
1、要实现识别功能,手机下要放一个tessdata文件夹,这是我们的字库。我的github项目上提供了下载,包括中英文。
2、直接在代码中调用api,传入字库路径和字库名字
3、传入图片,获取结果
4、识别需要一点时间,为了不让app开启就卡死,我用了handler
5、因为要读取根目录下的tessdata文件,所以app得加上读取SD卡的权限,不然会报错
public class MainActivity extends AppCompatActivity {
    private Bitmap srcBitmap;
    EditText editText;
    String result;
    Handler handler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                editText.setText(result);
            }
        };
        editText = (EditText)findViewById(R.id.editText);
        srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test);
        new Thread(new Runnable() {
            @Override
            public void run() {
                result = doOcr(srcBitmap,"/chi_sim");
                Message msg = new Message();
                handler.sendMessage(msg);
            }
        }).start();
    }
    /**
     * 进行图片识别
     *
     * @param bitmap
     *            待识别图片
     * @param language
     *            识别语言
     * @return 识别结果字符串
     */
    public String doOcr(Bitmap bitmap, String language) {
        TessBaseAPI baseApi = new TessBaseAPI();
        baseApi.init(getSDPath(), language);
        // 必须加此行,tess-two要求BMP必须为此配置
        bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
        baseApi.setImage(bitmap);
        String text = baseApi.getUTF8Text();
        baseApi.clear();
        baseApi.end();
        return text;
    }
    /**
     * 获取sd卡的路径
     *
     * @return 路径的字符串
     */
    public static String getSDPath() {
        File sdDir = null;
        boolean sdCardExist = Environment.getExternalStorageState().equals(
                android.os.Environment.MEDIA_MOUNTED); // 判断sd卡是否存在
        if (sdCardExist) {
            sdDir = Environment.getExternalStorageDirectory();// 获取外存目录
        }
        return sdDir.toString();
    }
}
布局文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.binbin.tesseracttest.MainActivity">
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/test"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="103dp"
        android:id="@+id/imageView" />
    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="识别结果"
        android:id="@+id/editText"
        android:layout_below="@+id/imageView"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="99dp" />
</RelativeLayout>
权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
三、效果图

最后是Github上的项目地址:
https://github.com/wzb19960208/TesseractSample
标签:
原文地址:http://www.cnblogs.com/wzben/p/5932331.html