C#で文字認識を行う

Microsoft Office をインストールすると、実は OCR ソフトがついてきます。C# からの利用も簡単です。下記のコードを、Visual C# Express 2005 または 2008 で作成し、参照設定に、 Microsoft Office Document Imaging 11.0 Type Library (MDIVWCTL.DLL) を追加してビルドしてください。

ボックス1 ソースコードのダウンロード (Visual C# Express 2008 用)
v1.0 (2008/07/21)

using System;
using System.Text;

/// <summary>
/// OCR with MicrosoftR Office By Martin Welker (CodeProject)
/// に基づく Office 2003 に依存したOCR処理。
/// Microsoft Office Document Imaging 11.0 Type Library
/// (MDIVWCTL.DLL) が別途必要
/// Office 2007 ではこのライブラリはデフォルトではインストールされない
/// ので、インストール時に、
/// Microsoft Office Document Imaging
///  + Microsoft Office Document Imaging Writer 
/// を追加選択しておく必要がある。
/// <seealso cref="http://www.codeproject.com/KB/office/modi.aspx"/>
/// </summary>
namespace OfficeOCRTest
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length != 1)
            {
                Console.WriteLine("OfficeOCRTest [画像ファイル名]");
                return;
            }

            string filename = args[0];

            try
            {
                MODI.Document doc = new MODI.Document();
                doc.Create(filename);

                // 読み取り言語を指定してOCR処理。
                // 英数字のみとわかっている場合には、
                // miLANG_ENGLISH を指定したほうが精度が高い
                doc.OCR(MODI.MiLANGUAGES.miLANG_JAPANESE, false, false);

                // 複数ページを持つ画像フォーマットに対応
                for (int i = 0; i < doc.Images.Count; i++)
                {
                    MODI.Image img = (MODI.Image)doc.Images[i];
                    MODI.Layout layout = img.Layout;

                    Console.WriteLine("* 1ページ分のデータ *");
                    Console.WriteLine(layout.Text);
                    Console.WriteLine();

                    // 同じデータを単語ごとに分割して出力
                    StringBuilder str = new StringBuilder();
                    for (int j = 0; j < layout.Words.Count; j++)
                    {
                        MODI.Word word = (MODI.Word)layout.Words[j];
                        str.Append("[" + word.Text + "]");
                    }
                    Console.WriteLine("* 単語に分割して出力 *");
                    Console.WriteLine(str.ToString());
                    Console.WriteLine();
                }
            }
            catch(Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}


たとえば、下の画像をこのコードで読み込むと、
サンプル画像

F:\> OfficeOCRTest.exe modi.jpg
* 1ページ分のデータ *
これは、 Microsoft Office Document Imaging 11 , 0 TyPe Library ( MDIVWCTL . DLL ) の利用サンプルです。

* 単語に分割して出力 *
[こ][れ][は][、][Microsoft][Office][Document][Imaging][11][,][0][TyPe][Library][(][MDIVWCTL][.][DLL][)][の][利][用][サ][ン][プ][ル][で][す][。]

のように認識結果が出力されます。今回のサンプルでは文字そのもののみを対象としましたが、文字の画像上の位置やフォント名なども取得可能です。詳細については、
OCR with MicrosoftR Office By Martin Welker (CodeProject)
を参照してください。
 初出: 2008/07/21 01:04 ささお * 内容は随時追記・更新しています。
| 技術メモ::ソフトウェア | comments (15) | trackback (1) |このエントリーを含むはてなブックマーク このエントリーをはてなブックマークする
この記事のトラックバックURL
http://tmp.junkbox.info/tb.php/48
新着トラックバック
[C#]Microsoft OfficeにOCRが付属していたらしい
ここ最近フリーのOCRライブラリを探してて、smartOCRのDLLはライセンス的にまずいよなぁとかうんうん唸っていたら発見 http://tmp.junkbox.info/tb.php/48 これでC#でOCRが使える!まだそんなに試...
| だらだらやるよ。 | 08/07/22 21:08 |

  
AMAZON
CALENDAR
S M T W T F S
    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   
<<   07 - 2008   >>
TRACBACK
PROFILE
LOGIN
現在のモード: ゲストモード
USER ID:
PASS:
OTHERS
LINK
POWERED BY
POWERED BY
ぶろぐん
SKIN BY
ゲットネット...¥