【Java】 画像から文字列を取得する [2] ~ Tesseract-OCR / Tess4J 編 ~

はじめに

http://blogs.yahoo.co.jp/dk521123/36626927.html
のつづき。[2] Tesseract-OCR / Tess4J を使用する。

個人的見解

 * 英語なら十分に使える

準備

以下の環境で行った環境構築手順を記す。

 * OS:Windows10 (Linuxの場合、「dllファイル」を「isoファイル」にするだけらしい)
 * java : JDK1.8
 * Eclipse : Neon.1a Release (4.6.1)

[1] ファイルのダウンロード

[1-1] 以下のサイトから、「Tess4J-X.X.X-src.zip(今回は「Tess4J-3.2.1-src.zip」)」をダウンロードする
https://sourceforge.net/projects/tess4j/?source=typ_redirect
日本語や多言語をサポートするなら...

[1-2] 以下のサイトから、自分がサポートしたい言語のファイルをダウンロードする

# 日本語の場合、「jpn.traineddata」リンクを押下し、「Download」ボタンを押下し、
#「jpn.traineddata」ファイルをダウンロードする
# ※ 補足:「xxx.traineddata」の言語部分「xxx」は「ISO 639-3」で記載
https://github.com/tesseract-ocr/tessdata

[2] ファイルの配置・インポート

[2-1] [1-1] でダウンロードしたZIPファイルを解凍し、
       Jarファイルおよび「tessdata」フォルダを自分のプロジェクト内に配置する

[2-2] [1-1] でダウンロードした「xxx.traineddata(今回は「jpn.traineddata」)」を
      自分のプロジェクト内にある「tessdata」フォルダ配下に置く

[2-3] 環境変数「TESSDATA_PREFIX」を定義し、値を、自分のプロジェクトがあるパスにする
~~~
  + 環境変数名 : TESSDATA_PREFIX
  + 環境変数値 : 自分のプロジェクトがあるパス(例「C:\workspace\SampleProject」)
~~~

■解凍したファイルのフォルダ構造

Tess4J-3.2.1-src
 + Tess4J
    + dist ... jarファイル「tess4j-3.2.1.jar」をインポート
    + lib ... 「commons-beanutils-1.9.2.jar」等、全てのjarファイルをインポート
       + win32-x86-64 ... 「libtesseract304.dll」「gsdll64.dll」をコピーし、自分のプロジェクト内に配置する
    + src ... ソース(jarファイル「tess4j-3.2.1.jar」をインポートしない場合は、配下の「com」「net」をコピーし配置)
    + tessdata ... フォルダ「tessdata」ごとコピーし、自分のプロジェクト内に配置する

■ファイル移行先(自分のプロジェクト=「SampleProject」)

C:\workspace\SampleProject
 + src
 + lib
    + commons-beanutils-1.9.2.jar
    + ...その他多数のjarファイル
    + tess4j-3.2.1.jar
 + dll
    + libtesseract304.dll
    + gsdll64.dll
 + tessdata
    + jpn.traineddata

サンプル

* 簡単なサンプル画像「/etc/hello.png(ペイント「こんにちは。」と書いて保存)」を用意しておく
import java.io.File;

import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;

public class Main {

  public static void main(String[] args) {
    File imageFile = new File("./etc/hello.png");
    ITesseract instance = new Tesseract();

    try {
      long start = System.currentTimeMillis();
      instance.setLanguage("jpn"); // ★英語だけならここをコメントアウト★
      String result = instance.doOCR(imageFile);
      
      long end = System.currentTimeMillis();
      System.out.println(result);
      
      System.out.println((end - start) / 1000  + "[sec]");
    } catch (TesseractException ex) {
      ex.printStackTrace();
    }
  }
}

出力結果

* 結果1:「こんにちは。」と書かれた画像
・・・略・・・
ParamsModel::Incomplete line 申?
ParamsModel::Incomplete line 
ParamsModel::Incomplete line 
Paraこんにちは〟 <== 出力結果


15[sec] <== 掛かった時間
msModel::Incomplete line Pス
ParamsModel::Incomplete line 
ParamsModel::Incomplete line `<E
ParamsModel::Incomplete line ?
ParamsModel::Incomplete line 
ParamsModel::Incomplete line ?,ュ
ParamsModel::Incomplete line 
* 結果2:「山田 太郎」と書かれた画像
・・・略・・・
ParamsModel::Incomplete line 申?
ParamsModel::Incomplete line 
ParamsModel::Incomplete line 
Para山田鮑 <== 出力結果


16[sec] <== 掛かった時間
msModel::Incomplete line Pス
ParamsModel::Incomplete line 
ParamsModel::Incomplete line `<E
ParamsModel::Incomplete line ?
ParamsModel::Incomplete line 
ParamsModel::Incomplete line ?,ュ
ParamsModel::Incomplete line 
* 結果3:「ABC...XYZ」と書かれた画像
ABCDEFGHIJKLMNOPQRSTUVWXVZ


1[sec]

関連記事

画像から文字列を取得する [1] ~ 光学文字認識 / OCRライブラリ・基本編 ~

http://blogs.yahoo.co.jp/dk521123/36626927.html

Eclipse】DLLファイルを取り込む方法

http://blogs.yahoo.co.jp/dk521123/6843885.html