Repository: 465857721/IDCardOCR_China
Branch: master
Commit: c93231a20ae0
Files: 35
Total size: 55.5 KB
Directory structure:
gitextract_pqg52avl/
├── .idea/
│ ├── compiler.xml
│ ├── copyright/
│ │ └── profiles_settings.xml
│ ├── encodings.xml
│ ├── gradle.xml
│ ├── misc.xml
│ ├── modules.xml
│ ├── runConfigurations.xml
│ └── vcs.xml
├── README.md
├── app/
│ ├── assets/
│ │ └── eng.traineddata
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ ├── androidTest/
│ │ └── java/
│ │ └── com/
│ │ └── kingsoft/
│ │ └── idcardocr_china/
│ │ └── ExampleInstrumentedTest.java
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── kingsoft/
│ │ │ └── idcardocr_china/
│ │ │ ├── MainActivity.java
│ │ │ └── idcardocr/
│ │ │ ├── AutoFocusManager.java
│ │ │ ├── CameraActivity.java
│ │ │ ├── CameraManager.java
│ │ │ └── PreviewBorderView.java
│ │ └── res/
│ │ ├── layout/
│ │ │ ├── activity_camera.xml
│ │ │ └── activity_main.xml
│ │ ├── values/
│ │ │ ├── attrs.xml
│ │ │ ├── colors.xml
│ │ │ ├── dimens.xml
│ │ │ ├── strings.xml
│ │ │ └── styles.xml
│ │ └── values-w820dp/
│ │ └── dimens.xml
│ └── test/
│ └── java/
│ └── com/
│ └── kingsoft/
│ └── idcardocr_china/
│ └── ExampleUnitTest.java
├── build.gradle
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
================================================
FILE CONTENTS
================================================
================================================
FILE: .idea/compiler.xml
================================================
================================================
FILE: .idea/copyright/profiles_settings.xml
================================================
================================================
FILE: .idea/encodings.xml
================================================
================================================
FILE: .idea/gradle.xml
================================================
================================================
FILE: .idea/misc.xml
================================================
Abstraction issuesJava
Android > Lint > Correctness
Android > Lint > Correctness > Messages
Android > Lint > Performance
Android > Lint > Security
Android > Lint > Usability > Icons
Internationalization issuesJava
J2ME issuesJava
Java
Java language level issuesJava
Logging issuesJava
Numeric issuesJava
Portability issuesJava
Security issuesJava
Serialization issuesJava
Android
C:\Users\周康\AppData\Roaming\Subversion
1.8
================================================
FILE: .idea/modules.xml
================================================
================================================
FILE: .idea/runConfigurations.xml
================================================
================================================
FILE: .idea/vcs.xml
================================================
================================================
FILE: README.md
================================================
# IDCardOCR_China
基于tesseract,实现摄像头扫描识别中国二代身份证
# Usage
demo主要提供思路,通过摄像头取景,预览裁剪,ocr识别.
# ScreenShots

# TODO
- 姓名ocr识别
- 民族识别
# 建议
1.对esseract进行训练,目前用的文件为eng数据,没有针对二代身份证进行优化,可以自己进行训练,只识别1-0和英文X。数据包也会相应减小。
( baseApi.setVariable("tessedit_char_whitelist", "0123456789Xx");)也可以设置白名单,代码里设置了,但是这样没有减少训练文件的大小.
2.目前demo仅仅识别了身份证号码,可以裁剪出来其他信息进行ocr,后续进行优化....
#Thanks
https://github.com/tdk-farkas/CameraSFZ 身份证裁剪
#Changelog
V0.0.2(2016/12/24)
- 6.0权限适配
- 识别单词设置白名单 增加识别率
V0.0.1(2016/12/01)
- 项目导入
================================================
FILE: app/build.gradle
================================================
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.kingsoft.idcardocr_china"
minSdkVersion 21
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.0.0'
testCompile 'junit:junit:4.12'
compile 'com.rmtheis:tess-two:6.1.1'
compile 'com.anthonycr.grant:permissions:1.0'
}
================================================
FILE: app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in C:\dev\android-sdk-windows/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
================================================
FILE: app/src/androidTest/java/com/kingsoft/idcardocr_china/ExampleInstrumentedTest.java
================================================
package com.kingsoft.idcardocr_china;
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumentation test, which will execute on an Android device.
*
* @see Testing documentation
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() throws Exception {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getTargetContext();
assertEquals("com.kingsoft.idcardocr_china", appContext.getPackageName());
}
}
================================================
FILE: app/src/main/AndroidManifest.xml
================================================
================================================
FILE: app/src/main/java/com/kingsoft/idcardocr_china/MainActivity.java
================================================
package com.kingsoft.idcardocr_china;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.anthonycr.grant.PermissionsManager;
import com.anthonycr.grant.PermissionsResultAction;
import com.kingsoft.idcardocr_china.idcardocr.CameraActivity;
public class MainActivity extends AppCompatActivity {
private static final int GETPERMISSION_SUCCESS = 1;//获取权限成功
private static final int GETPERMISSION_FAILER = 2;//获取权限失败
private TextView tv_id;
private int MY_SCAN_REQUEST_CODE = 100;
private Context mContext;
private MyHandler myHandler = new MyHandler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
tv_id = (TextView) findViewById(R.id.tv_id);
findViewById(R.id.btn_go).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// getPermissions();
requestAllPermission();
}
});
}
private void requestAllPermission() {
PermissionsManager.getInstance().requestAllManifestPermissionsIfNecessary(MainActivity.this,
new PermissionsResultAction() {
@Override
public void onGranted() {
myHandler.sendEmptyMessage(GETPERMISSION_SUCCESS);
}
@Override
public void onDenied(String permission) {
myHandler.sendEmptyMessage(GETPERMISSION_FAILER);
}
});
}
//因为权限管理类无法监听系统,所以需要重写onRequestPermissionResult方法,更新权限管理类,并回调结果。这个是必须要有的。
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
PermissionsManager.getInstance().notifyPermissionsChange(permissions, grantResults);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == MY_SCAN_REQUEST_CODE && resultCode == RESULT_OK && data != null) {
String id = data.getStringExtra("id");
Toast.makeText(this, id, Toast.LENGTH_LONG).show();
if (id != null && id.length() == 18) {
tv_id.setText(id);
}
}
}
private class MyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case GETPERMISSION_SUCCESS:
Intent scanIntent = new Intent(mContext, CameraActivity.class);
startActivityForResult(scanIntent, MY_SCAN_REQUEST_CODE);
break;
case GETPERMISSION_FAILER:
Toast.makeText(mContext, "此功能须获摄像头权限1111111", Toast.LENGTH_LONG).show();
break;
}
}
}
}
================================================
FILE: app/src/main/java/com/kingsoft/idcardocr_china/idcardocr/AutoFocusManager.java
================================================
package com.kingsoft.idcardocr_china.idcardocr;
import android.hardware.Camera;
import android.os.AsyncTask;
import android.util.Log;
import java.util.ArrayList;
import java.util.Collection;
import java.util.concurrent.RejectedExecutionException;
public class AutoFocusManager implements Camera.AutoFocusCallback{
private static final String TAG = AutoFocusManager.class.getSimpleName();
private static final long AUTO_FOCUS_INTERVAL_MS = 3000L;
private static final Collection FOCUS_MODES_CALLING_AF;
static {
FOCUS_MODES_CALLING_AF = new ArrayList(2);
FOCUS_MODES_CALLING_AF.add(Camera.Parameters.FOCUS_MODE_AUTO);
FOCUS_MODES_CALLING_AF.add(Camera.Parameters.FOCUS_MODE_MACRO);
}
private boolean stopped;
private boolean focusing;
private final boolean useAutoFocus;
private final Camera camera;
private AsyncTask,?,?> outstandingTask;
private Camera.PreviewCallback mp;
public AutoFocusManager(Camera camera, Camera.PreviewCallback mp) {
this.camera = camera;
String currentFocusMode = camera.getParameters().getFocusMode();
useAutoFocus = FOCUS_MODES_CALLING_AF.contains(currentFocusMode);
Log.e(TAG, "Current focus mode '" + currentFocusMode + "'; use auto focus? " + useAutoFocus);
this.mp = mp;
start();
}
@Override
public synchronized void onAutoFocus(final boolean success, Camera theCamera) {
// if(success){
// camera.takePicture(null, null, myjpegCallback);
// }
;
focusing = false;
autoFocusAgainLater();
}
private synchronized void autoFocusAgainLater() {
if (!stopped && outstandingTask == null) {
AutoFocusTask newTask = new AutoFocusTask();
try {
newTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
outstandingTask = newTask;
} catch (RejectedExecutionException ree) {
Log.e(TAG, "Could not request auto focus", ree);
}
}
}
/**
* 开始自动对焦
*/
public synchronized void start() {
// camera.setOneShotPreviewCallback(new Camera.PreviewCallback() {
// @Override
// public void onPreviewFrame(byte[] data, Camera camera)
// });
if (useAutoFocus) {
outstandingTask = null;
if (!stopped && !focusing) {
try {
camera.setOneShotPreviewCallback(mp);
camera.autoFocus(this);
focusing = true;
} catch (RuntimeException re) {
// Have heard RuntimeException reported in Android 4.0.x+; continue?
Log.e(TAG, "Unexpected exception while focusing", re);
// Try again later to keep cycle going
autoFocusAgainLater();
}
}
}
}
private synchronized void cancelOutstandingTask() {
if (outstandingTask != null) {
if (outstandingTask.getStatus() != AsyncTask.Status.FINISHED) {
outstandingTask.cancel(true);
}
outstandingTask = null;
}
}
/**
* 停止自动对焦
*/
public synchronized void stop() {
stopped = true;
if (useAutoFocus) {
cancelOutstandingTask();
// Doesn't hurt to call this even if not focusing
try {
camera.cancelAutoFocus();
} catch (RuntimeException re) {
// Have heard RuntimeException reported in Android 4.0.x+; continue?
Log.e(TAG, "Unexpected exception while cancelling focusing", re);
}
}
}
private final class AutoFocusTask extends AsyncTask