download
download
출처 : http://www.androidpub.com/1359474
막상 오픈소스로 된것을 컴파일 하였는데 인식율이 완전 꽝이네요. 갤럭시 S2라 그런지 인식율 0 ㅡㅡ; 뭐가 잘 못 된건지.
해당 앱은 시간 날때 좀 들여다 보고 다른 API 찾아봐야겠네요.
숫자를 인식하고 싶은데 인식 잘 되는 API 아시고 계신분 지나가다가 코멘트 하나 부탁드립니다.
출처에 나와 있는것을 토대로 윈도우즈 개발 환경에서 실행 하였습니다.
1. 개발환경 구축
개발환경은 윈도으즈 이고, 안드로이드 NDK (r5b), SDK, JDK 등이 이미 설치되어 있어야 합니다.
2. mezzofanti 설치
mezzofanti 홈페이지 (http://code.google.com/p/mezzofanti/downloads/list) 로부터 Mezzofanti_java_code_1_0_3.zip 파일을 다운로드받습니다.
mezzofanti 라는 디렉토리로 압축을 풉니다.
download
download
download
막상 오픈소스로 된것을 컴파일 하였는데 인식율이 완전 꽝이네요. 갤럭시 S2라 그런지 인식율 0 ㅡㅡ; 뭐가 잘 못 된건지.
해당 앱은 시간 날때 좀 들여다 보고 다른 API 찾아봐야겠네요.
숫자를 인식하고 싶은데 인식 잘 되는 API 아시고 계신분 지나가다가 코멘트 하나 부탁드립니다.
출처에 나와 있는것을 토대로 윈도우즈 개발 환경에서 실행 하였습니다.
1. 개발환경 구축
개발환경은 윈도으즈 이고, 안드로이드 NDK (r5b), SDK, JDK 등이 이미 설치되어 있어야 합니다.
2. mezzofanti 설치
mezzofanti 홈페이지 (http://code.google.com/p/mezzofanti/downloads/list) 로부터 Mezzofanti_java_code_1_0_3.zip 파일을 다운로드받습니다.
mezzofanti 라는 디렉토리로 압축을 풉니다.
3. tesseract 및 jpeg 라이브러리의 ndk 빌드
다음은 tesseract 3.0 소스를 가져와서 ndk 로 빌드하여야 합니다. 그런데, 이미 AOSP 내에 이 소스 패키지가 포함되어 있으므로 이 소스를 활용하도록 합니다. 그래서, 다음 명령을 사용하여 tesseract 와 관련된 패키지의 소스코드를 다운받습니다.
다음은 tesseract 3.0 소스를 가져와서 ndk 로 빌드하여야 합니다. 그런데, 이미 AOSP 내에 이 소스 패키지가 포함되어 있으므로 이 소스를 활용하도록 합니다. 그래서, 다음 명령을 사용하여 tesseract 와 관련된 패키지의 소스코드를 다운받습니다.
2.
$ git clone git://android.git.kernel.org/platform/external/jpeg.git
3.
$ git clone git://android.git.kernel.org/platform/system/core.git
이부분은 cygwin에서 위에 명령어를 입력하여 다운 받았습니다.
다음 파일 이동이나 디렉토리 이동은 탐색기에서 해 줍니다.
mezzofanti 디렉토리 아래 jni 서브디렉토리, 그 아래 include 서브디렉토리를 만듭니다.
1.
$
mkdir
-p mezzofanti/jni/include
tesseract 와 jpeg 소스를 통째로 mezzofanti/jni 디렉토리로 복사 또는 옮깁니다.
1.
$
cp
-r tesseract mezzofanti/jni
2.
$
cp
-r jpeg mezzofanti/jni
core/include/cutils 디렉토리를 통째로 mezzofanti/jni/include 로 복사 또는 옮깁니다.
1.
$
cp
-r core/include/cutils mezzofanti/jni/include
core/libcutils/ashmem-dev.c 파일을 mezzofanti/jni/jpeg 로 복사 또는 옮깁니다.
1.
$
cp
core/libcutils/ashmem-dev.c mezzofanti/jni/jpeg
make 파일을 만들어 주고
mezzofanti/jni/Android.mk 파일을 만듭니다.
1.
LOCAL_PATH := $(my-dir)
2.
3.
include $(addprefix $(LOCAL_PATH)/,$(addsuffix /Android.mk, \
4.
jpeg \
5.
tesseract \
6.
))
mezzofanti/jni/tesseract/Android.mk 와 mezzofanti/jni/jpeg/Android.mk 파일을 수정합니다.
01.
$ diff tesseract/Android.mk mezzofanti/jni/tesseract/Android.mk
02.
406c406,407
03.
< external/jpeg
04.
---
05.
> $(LOCAL_PATH)/../jpeg \
06.
> $(LOCAL_PATH)/../include
07.
433c434
08.
< LOCAL_STATIC_LIBRARIES:=$(LOCAL_STATIC_LIBRARIES_)
09.
---
10.
> #LOCAL_STATIC_LIBRARIES:=$(LOCAL_STATIC_LIBRARIES_)
11.
436c437,439
12.
< liblog
13.
---
14.
> libjpeg
15.
> # liblog
16.
> LOCAL_LDLIBS := -llog
1.
$ diff jpeg/Android.mk mezzofanti/jni/jpeg/Android.mk
2.
14c14
3.
< jquant2.c jutils.c jmemmgr.c \
4.
---
5.
> jquant2.c jutils.c jmemmgr.c ashmem-dev.c \
6.
16a17
7.
> LOCAL_C_INCLUDES := $(LOCAL_PATH)/../include
mezzofanti/jni/tesseract/api/jni.cpp 파일에서는 mezzofanti 에서 활용하는 추가적인 함수를 위해 많은 부분을 수정해야 합니다. 이 부분은 첨부파일을 다운로드해서 덮어쓰면 되겠습니다.
(jni.cpp 파일의 DEBUG 매크로를 1로 하면 인식된 결과가 /sdcard/out.txt 에 저장됩니다)
이제 mezzofanti 디렉토리에서 ndk-build 를 하면 tesseract 빌드과정이 끝납니다.
1.
$
cd
mezzofanti; ndk-build
2.
…
3.
SharedLibrary : libjpeg.so
4.
Install : libjpeg.so =&
gt
; libs/armeabi/libjpeg.so
5.
...
6.
SharedLibrary : libocr.so
7.
Install : libocr.so =&
gt
; libs/armeabi/libocr.so
4. mezzofanti 소스 수정
이제 tesseract 및 jpeg 라이브러리가 준비되었으니 이클립스 또는 ant 로 mezzofanti 를 빌드하면 됩니다. 그런데, 업그레이드된 tesseract 버전과도 잘 동작하도록 하기 위해 소스코드의 일부를 수정하여야 합니다. 이클립스 또는 리눅스에서 다음 부분들을 수정합니다.
먼저 mezzofanti/AndroidManifest.xml 파일에서 외부 메모리 장치(sd 카드)에 대한 쓰기 권한을 추가해 줍니다.
1.
<
uses-permission
android:name
=
"android.permission.WRITE_EXTERNAL_STORAGE"
></
uses-permission
>
다음은 mezzofanti/src/com/itwizard/mezzofanti/OCR.java 파일을 수정해 줍니다.
OCR.java 의 OCR 클래스는 JNI 를 통해 tesseract 라이브러리와 연동되는 객체이며, 각종 native 메소드와 변수를 정의하고 있습니다.
01.
diff mezzofanti-orig/src/com/itwizard/mezzofanti/OCR.java mezzofanti/src/com/itwizard/mezzofanti/OCR.java
02.
278a279,280
03.
> if ( lang.compareTo("kor") == 0 )
04.
> return "Korean";
05.
384c386
06.
< closeDebug(); // clean close debug
07.
---
08.
> // closeDebug(); // clean close debug
09.
735a738
10.
> /*
11.
836a840
12.
> */
13.
1006c1010
14.
< public native void setVariableNative( // set a lib variable
15.
---
16.
> public native boolean setVariableNative( // set a lib variable
17.
1017a1022,1025
18.
> // aux functions for liblept
19.
> public native void setEncodedNative(byte[] image);
20.
> public native void normalizeBgNative(int reduction, int size, int bgval);
21.
>
22.
1043c1051
23.
< public native String getBoxText(); // get the box for each letter
24.
---
25.
> // public native String getBoxText(); // get the box for each letter
26.
1047c1055
27.
< public native void closeDebug(); // clean close the debug (if any)
28.
---
29.
> // public native void closeDebug(); // clean close the debug (if any)
각각의 부분에 대한 설명은 다음과 같습니다.
- 한글데이터 추가를 위해 OCR.java 파일의 LanguageMore() 메소드에서 278라인쯤에 내용을 추가했습니다. 기타 원하는 언어(중국어 번체, 간체, 일본어 등) 를 추가할 수도 있습니다.
- 735 라인부터 836라인까지 주석으로 막은 이유는 이 부분은 인식된 결과를 결과 액티비티로 보내기 전에 한번 가공해 주는 부분인데, 가공하지 않고 바로 결과로 보여주어야 한글 등이 제대로 보이더군요. 더욱 검토가 필요한 부분입니다.
- 나머지 부분은 native 메소드들과 관련하여 제거하거나 수정하거나 추가하는 부분들입니다.
5. mezzofanti 앱과 사전/학습 데이터파일 설치
이제 mezzofanti 를 이클립스 또는 ant 로 빌드하고, 안드로이드 스마트폰에 설치합니다.
앱을 설치하고 난 후에 곧바로 실행하면 제대로 동작하지 않는데, 사전/학습 데이터파일을 설치하지 않았기 때문입니다. 그래서 새로 빌드한 tesseract 3.0 버전에 맞는 영어, 한글 등의 사전/학습 데이터파일들(eng.traineddata.gz, kor.traineddata.gz 등)을 다음 링크들로부터 가져와서 /sdcard/tessdata 디렉토리에 넣고 압축을 풀어줍니다.
(근데, 갤럭시 s 같은 경우에는 아스트로 파일 매니저로 풀 때 확장자가 없어져버리더군요. 확장자가 반드시 .traineddata 이 되도록 고쳐주어야 합니다.)
6. mezzofanti 앱 실행
mezzofanti 를 실행하면 초기화면을 거쳐 카메라 화면이 나타납니다.
여기서 메뉴버튼을 눌러 Menu->Settings 메뉴의 "Set OCR dictionary language" 항목을 선택하면 영어와 한글 항목이 나타납니다. (내부 “Download new languages” 메뉴는 예전 버전의 데이터 파일이 다운되므로 활용하면 안됩니다.)
원하는 언어를 선택한 다음 다시 카메라 화면으로 되돌아가서 사진을 찍으면 이미지파일이 만들어지고 이것을 tesseract 를 통해 인식하게 됩니다. 찍는 모드는 전체 화면과 한줄라인 모드 2가지가 있습니다. 다음은 인식된 결과를 보여주는 예입니다.