Android OCR 한글 및 영문 인식 Tesseract 샘플 프로젝트 테스트

2016. 4. 6. 13:42mobile/android

 

 

환경 : Win7, Android studio, minSdkVersion 16, xompileSdkVersion 22

 

 

 

필자는 Android studio 에서 빌드 하는 내용을 설명한다.

소스에 대한 설명은 없고 단순히 샘플 프로젝트를 빌드해서 핸드폰으로 실행해서 테스트해보는 것 까지이다.

 

 

읽기전에...

이 글을 읽는 사람은 기초적인 Android 개발 지식이 있다고 생각하고 상세한 설명은 생략한다.

PC에 android studio 및 andorid 개발 셋팅이 완료되어 있으며 스마트폰으로 RUN 할 준비를 하고 따라해야 이상없이 동작한다.

 

 


 

오류나 궁금증은 일단 이 정리된 포스팅 참고

Android OCR 한글 및 영문 인식 Tesseract 오류 정리, 질문, QNA

 


 



 

광학 문자 인식(Optical character recognition; OCR)은 사람이 쓰거나 기계로 인쇄한 문자의 영상을 이미지 스캐너로 획득하여 기계가 읽을 수 있는 문자로 변환하는 뭐 그런거라고 한다.

지금부터 안드로이드 앱으로 만들어 테스트 해 볼 수 있도록 설명한다.

 

 

요약

 

1. Sample Project 다운로드 및 프로젝스 생성

2. traineddata 파일 다운로드 및 셋팅

3. tess-two 모듈 다운로드 및 Import하고 jar 설정

4. 설정 파일 ( build.gradle ) 수정

5. 실행

 

 

1. Sample Project 다운로드 및 Import

주소 : https://github.com/GautamGupta/Simple-Android-OCR

위 주소에서 Simple-Android-OCR-master 프로젝트 파일을 다운받는다.

Import 하면 좋은데 분명히 SimpleAndroidOCRActivity.java 파일의 TessBaseAPI  제외한 부분에서 에러가 엄청 날 것이다. 또는 Import 자체가 안될 수 있다.

 

필자는 프로젝트를 하나 생성했다. 그리고 나서 다운받은 Sample Project 의 JAVA, XML, Manifest 의 퍼미션 등을 모두 가져와서 붙혀넣기 했다. 새로운 프로젝트에 기존 샘플을 입힌다고 생각하자.

Java 파일에서 TessBaseAPI 에 관련한 에러가 나는 것은 정상이다. 무시하고 지나간다. 3번에서 해결된다.

 

 

 

 

2. traineddata 파일 다운로드 및 셋팅

traineddata 파일은 일종의 분석 언어 팩? 정도라고 가볍게 생각하고 넘어간다. 어차피 해야 할 것은 다운받고 붙혀넣기가 전부다.

주소 : https://github.com/tesseract-ocr/tessdata

위 주소에서 eng.traineddata, kor.traineddata 파일을 다운받는다. 다운 받고 assets/tessdata 폴더에 붙혀넣기 한다.

assets 폴더가 없을 수 있다. app/src/main 경로 아래에 그냥 assets 폴더를 생성하면 된다.

 

 

 

 

3. tess-two 모듈 다운로드 및 Import하고 jar 설정

주소 : https://github.com/rmtheis/tess-two

위 주소에서 tess-two 모듈을 받는다. 전체 다 받아도 되고 tess-two 폴더만 받아도 된다. 필요한건 tess-two 폴더와 내부 파일이다.

 

다운 받은 후 아래처럼 모듈을 Import 한다. 그림 빠져먹지말고 모두 따라한다.

 

 

4. 설정 파일 ( tess-two 의 build.gradle ) 수정

주의사항 : compileSdkVersion 이나 buildToolsVersion, dependencies 내용에 있는 버전 등은 최대한 app의 build.gradle 파일과 맞추도록 한다. 아니면 에러 폭풍에 걷잡을 수 없다.

 

필자는 아래 부분은 완벽히 동일하게 작성했다. (생성한 프로젝트의 build.gradle 중 일부)

1
2
3
4
5
6
7
8
9
10
11
 compileSdkVersion 22
    buildToolsVersion "23.0.2"
 
    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
 
compile 'com.android.support:appcompat-v7:22.2.1'
cs

 

위 설명에 주의하며 아래 소스를 그대로 tess-two 의 build.gradle 파일에 아래 내용을 붙혀넣기 한다. 다시한번 말하지만 위 부분은 필히 생성한 프로젝트와 동일시 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import org.apache.tools.ant.taskdefs.condition.Os
 
apply plugin: 'com.android.library'
 
android {
    compileSdkVersion 22
    buildToolsVersion "23.0.2"
 
    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
 
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
 
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            res.srcDirs = ['res']
            jni.srcDirs = []
            jniLibs.srcDirs = ['libs']
        }
    }
 
    // Call external ndk-build(.cmd) script to build the native code
    task ndkBuild(type: Exec) {
        def ndkBuildExt = Os.isFamily(Os.FAMILY_WINDOWS) ? ".cmd" : ""
        commandLine "ndk-build${ndkBuildExt}", '-C', file('.').absolutePath,
                '-j', Runtime.runtime.availableProcessors()
    }
 
    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn ndkBuild
    }
 
    // Cleanup task to remove previously generated binaries
    task ndkClean(type: Exec) {
        def ndkBuildExt = Os.isFamily(Os.FAMILY_WINDOWS) ? ".cmd" : ""
        commandLine "ndk-build${ndkBuildExt}", '-C', file('.').absolutePath, 'clean'
    }
 
    tasks.withType(Delete) {
        cleanTask -> cleanTask.dependsOn ndkClean
    } 
}
 
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.2.1'
}
 
 
// Settings for uploading module AAR to Bintray for library distribution
 
task sourcesJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    classifier = 'sources'
}
 
task javadoc(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
    options {
        links "http://docs.oracle.com/javase/7/docs/api/"
        linksOffline "http://d.android.com/reference","${android.sdkDirectory}/docs/reference"
    }
}
 
task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}
 
 
 
cs

 

 



 

 

5. 실행

앱을 실행(run)하면 끝이다.

기본으로 영어를 인식하도록 설정되어 있다.

한글을 인식하고 싶으면 SimpleAndroidOCRActivity.java 에서 lang 변수를 kor 로 바꾸기만 하면 된다. 조금만 소스를 분석해보면 왜인지 알 수 있을 것이다.

 

 

자세한 설명은 없고 단순히 앱을 실행할 수 있도록만 설명했다.

방금 직접 다 만들어 본 내용을 작성해서 안될 수 가 없다.

시간이 지나 버전이 바뀌면 안될 수 도 있다는 점 참고하도록.