JavaでOCR

今日はJavaOCRを用いて画像から文字列を取得し、先日インストールしたMeCabを用いて形態素解析してみたいと思います。
OCR用ライブラリは、下記のライブラリを使用させていただきました。
Asprise Java OCR SDK - royalty-free API library with source code examples converting images to word or searchable PDF by extracting text

環境

CentOS 5.5 final (VMware Fusion)
jdk-1.6.0_17

OCR-Javaライブラリを取得

まずはOCR用ライブラリを取得します。
最近では、検索さえ出来れば偉人達が作成した良ライブラリがすぐに見つかる良い時代になりました。w
ちなみにcompat-libstdc++-33.i386に関して、既にインストール済みのかたは必要ありません。

# yum install compat-libstdc++-33.i386
# mkdir /usr/local/src/asprise
# cd /usr/local/src/asprise
# wget http://download.asprise.net/software/ocr-v4/Asprise-OCR-Java-Linux_x86_32bit-4.0.zip

まずはサンプルを実行

OCR-Javaを展開すると、サンプルスクリプトが複数用意されていますので、何はともあれまずはサンプルが実行出来るかを確認します。
コンソール上に下記が出力されればOKです。

# unzip Asprise-OCR-Java-Linux_x86_32bit-4.0.zip
# sh runDemo1.sh 
--- A general sample with both characters and barcodes ---

Welcome to Asprise OCR v4.0 Demo!

Trying to perform OCR on image: /usr/local/src/asprise/sample-images/ocr.gif

---- RESULTS: ------- 
=== ASPRISE OCR SDK EVALUATION ===

1) For licensing information, visit: http://asprise.com/product/ocr
2) This evaluation version replaces all recognized 'q' and 'x' occurrences with stars ('*'). 

[123456789012]
Asprise OCR
Speed. Accuracy.

画像からOCRで読み取った文字列をMeCabを使用して形態素解析してみる

それでは本日の本題です。まずはじめに、下記を参考にJavaからMeCabが使用出来る環境を用意してください。
JavaでMeCab - akiiiiiiiioの日記

環境が用意出来たら、次はJavaクラスを作成します。

# cd /home/akiiiiiiiio
# vi OcrToMecab.java

今回は以下のようなクラスを作成しました。

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import com.asprise.util.ocr.OCR;
import org.chasen.mecab.MeCab;
import org.chasen.mecab.Tagger;
import org.chasen.mecab.Node;

public class OcrToMecab {
    static {
        try {
            System.loadLibrary("MeCab");
        } catch (UnsatisfiedLinkError e) {
            System.exit(1);
        }
    }
    public static void main(String[] args) throws IOException {
        File file = new File(args[0]);
        BufferedImage img = ImageIO.read(file);
        String str = new OCR().recognizeEverything(img);
        System.out.println(new Tagger().parse(str));
    }
}

それではコンパイル、実行してみたいと思います。今回は、OCR-Javaライブラリのサンプル画像をそのまま引数に指定しています。

# javac -cp /usr/local/src/mecab-java-0.97/MeCab.jar:/usr/local/src/asprise/aspriseOCR.jar OcrToMecab.java
# export LD_LIBRARY_PATH=/usr/local/src/mecab-java-0.97/:/usr/local/src/asprise/
# java -cp .:/usr/local/src/mecab-java-0.97/MeCab.jar:/usr/local/src/asprise/aspriseOCR.jar OcrToMecab \
> /usr/local/src/asprise/sample-images/ocr.gif
=	記号,一般,*,*,*,*,=,=,=,,
=	記号,一般,*,*,*,*,=,=,=,,
=	記号,一般,*,*,*,*,=,=,=,,
ASPRISE	名詞,固有名詞,組織,*,*,*,*
O	記号,アルファベット,*,*,*,*,O,オー,オー,,
C	記号,アルファベット,*,*,*,*,C,シー,シー,,
R	記号,アルファベット,*,*,*,*,R,アール,アール,,
SDK	名詞,固有名詞,組織,*,*,*,*
EVALUATION	名詞,一般,*,*,*,*,*
=	記号,一般,*,*,*,*,=,=,=,,
=	記号,一般,*,*,*,*,=,=,=,,
=	記号,一般,*,*,*,*,=,=,=,,
1	名詞,数,*,*,*,*,1,イチ,イチ,,
)	記号,括弧閉,*,*,*,*,")",")",")",,
For	感動詞,*,*,*,*,*,*
licensing	感動詞,*,*,*,*,*,*
information	感動詞,*,*,*,*,*,*
,	記号,読点,*,*,*,*,",",",",",",,
visit	名詞,固有名詞,組織,*,*,*,*
:	記号,一般,*,*,*,*,:,:,:,,
http	名詞,固有名詞,組織,*,*,*,*
:	記号,一般,*,*,*,*,:,:,:,,
/	記号,一般,*,*,*,*,/,/,/,,
/	記号,一般,*,*,*,*,/,/,/,,
asprise	名詞,固有名詞,組織,*,*,*,*
.	記号,句点,*,*,*,*,.,.,.,,
com	名詞,固有名詞,組織,*,*,*,*
/	記号,一般,*,*,*,*,/,/,/,,
product	名詞,固有名詞,組織,*,*,*,*
/	記号,一般,*,*,*,*,/,/,/,,
ocr	名詞,固有名詞,組織,*,*,*,*
2	名詞,数,*,*,*,*,2,ニ,ニ,,
)	記号,括弧閉,*,*,*,*,")",")",")",,
This	感動詞,*,*,*,*,*,*
evaluation	感動詞,*,*,*,*,*,*
version	感動詞,*,*,*,*,*,*
replaces	感動詞,*,*,*,*,*,*
all	感動詞,*,*,*,*,*,*
recognized	感動詞,*,*,*,*,*,*
'	記号,一般,*,*,*,*,"'","'","'",,
q	記号,アルファベット,*,*,*,*,q,キュー,キュー,,
'	記号,一般,*,*,*,*,"'","'","'",,
and	名詞,固有名詞,組織,*,*,*,*
'	記号,一般,*,*,*,*,"'","'","'",,
x	記号,アルファベット,*,*,*,*,x,エックス,エックス,,
'	記号,一般,*,*,*,*,"'","'","'",,
occurrences	名詞,固有名詞,組織,*,*,*,*
with	名詞,固有名詞,組織,*,*,*,*
stars	名詞,一般,*,*,*,*,*
(	記号,括弧開,*,*,*,*,"(","(","(",,
'	記号,一般,*,*,*,*,"'","'","'",,
*	記号,一般,*,*,*,*,*,*,*,,
'	記号,一般,*,*,*,*,"'","'","'",,
)	記号,括弧閉,*,*,*,*,")",")",")",,
.	記号,句点,*,*,*,*,.,.,.,,
[	記号,括弧開,*,*,*,*,[,[,[,,
1	名詞,数,*,*,*,*,1,イチ,イチ,,
2	名詞,数,*,*,*,*,2,ニ,ニ,,
3	名詞,数,*,*,*,*,3,サン,サン,,
4	名詞,数,*,*,*,*,4,ヨン,ヨン,,
5	名詞,数,*,*,*,*,5,ゴ,ゴ,,
6	名詞,数,*,*,*,*,6,ロク,ロク,,
7	名詞,数,*,*,*,*,7,ナナ,ナナ,,
8	名詞,数,*,*,*,*,8,ハチ,ハチ,,
9	名詞,数,*,*,*,*,9,キュウ,キュー,,
0	名詞,数,*,*,*,*,0,ゼロ,ゼロ,,
1	名詞,数,*,*,*,*,1,イチ,イチ,,
2	名詞,数,*,*,*,*,2,ニ,ニ,,
]	記号,括弧閉,*,*,*,*,],],],,
Asprise	名詞,固有名詞,組織,*,*,*,*
OCR	名詞,固有名詞,組織,*,*,*,*
Speed	名詞,一般,*,*,*,*,*
.	記号,句点,*,*,*,*,.,.,.,,
Accuracy	名詞,一般,*,*,*,*,*
.	記号,句点,*,*,*,*,.,.,.,,
EOS

つらつらと上記のように出力されれば今回の目的は完了です。
今回ご紹介したOCRライブラリを用いれば、画像の全文検索システムなんかもJavaのみで簡単に作成することが出来ると思います。
ただしOCR-Java付属のLICENSE-EVALUATION.txtにも記載がありますが、当ライブラリはあくまで個人の責任の範囲で使用されることをお勧めします。w