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 (4) | 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 |

C#でPowerPointファイルを画像として保存する

Microsoft PowerPoint 11.0 Object Library を利用すると、PowerPointファイルの各スライドを画像として保存することが比較的容易に実現できます。画像形式としては、bmp, png jpg, gif, tif, wmf などが使えるようです。画像サイズも指定できます。なお、メタファイル(wmf)形式を指定するとベクトルデータとして出力が可能です。ただし、ファイルの画像サイズは無視されるようです。

サンプルコードは以下のような感じになります。エラー処理はあまりまじめにやっていないので、適宜追加してください。

 using System;
 using System.IO;
 using Microsoft.Office.Interop.PowerPoint;
 using Microsoft.Office.Core;
 
 namespace ppt2img
 {
     class Program
     {
         static void Main(string[] args)
         {
             if (args.Length != 4)
             {
                 Console.WriteLine("PowerPointファイルを画像に変換します");
                 Console.WriteLine();
                 Console.WriteLine("ppt2img [PowerPointファイル] [画像形式] [幅] [高さ]");
                 Console.WriteLine("例) ppt2img test.ppt png 640 480");
                 return;
             }
             // 引数を読み込む
             string filename = Path.GetFullPath(args[0]);
             string filetype = args[1];
             int width = Convert.ToInt32(args[2]);
             int height = Convert.ToInt32(args[3]);
 
             // PowerPointファイルを開く
             ApplicationClass app = new ApplicationClass();
             Presentation ppt = app.Presentations.Open(filename,
                 MsoTriState.msoFalse,
                 MsoTriState.msoFalse,
                 MsoTriState.msoFalse);
 
             // スライド枚数を取得
             int slides = ppt.Slides.Count;
 
             // 保存先作成
             string outputPath = Directory.GetCurrentDirectory() + @"output";
             Directory.CreateDirectory(outputPath);
 
             // 画像として出力
             for (int i = 1; i <= slides; i++)
             {
                 string outputName = outputPath + "p"
                     +i.ToString().PadLeft(5,'0') + "." + filetype;
                 ppt.Slides[i].Export(outputName, filetype, width, height);
             }
 
             // 後処理
             ppt.Close();
         }
     }
 }

PowerPoint 2003 での動作を確認していますが、他のバージョンでの動作は未確認です。

サンプルのダウンロード (Visual C# 2008 Express, サンプルの実行には .NET Framework 2.0, 3.0, 3.5 のいずれかが必要です)
ボックス1 (2008/06/30) ppt2img v1.0
 初出: 2008/06/30 00:11 ささお * 内容は随時追記・更新しています。
| 技術メモ::ソフトウェア | comments (1) | trackback (0) |このエントリーを含むはてなブックマーク このエントリーをはてなブックマークする

C#でPSDファイル読み込み

Adobe Photoshop の PSD 形式を C# で読み込みたくなったので、The Code Project を探していたら、

Yet Another PSD Parser
http://www.codeproject.com/KB/graphics/PSDParser.aspx

なる素敵なものがあったので、日本語対応を行いました。

修正後のソースコードをおいておきますので、ご利用ください。
なお、ビルドには、Visual Studio 2005 以降が必要です。実行には、.NET Framework 2.0 以降が必要です。一度ビルドしてしまえば当然ながら、VBでも利用可能です。

ボックス1 PSDパーサー
 初出: 2008/01/19 16:08 ささお * 内容は随時追記・更新しています。
| 技術メモ::ソフトウェア | comments (6) | trackback (0) |このエントリーを含むはてなブックマーク このエントリーをはてなブックマークする

C#でスクリーンセーバー

2ちゃんねるの時をかける少女スレでみかけた、速報ダム日和さんJavascriptで時かけクロックにグッときたので、勝手にWebページをスクリーンセーバー化するアプリケーションを作ってみました。URLはスクリーンセーバーの設定画面から変更できるので、天気予報の画像やYouTubeの動画のURLなどを設定するのもよいと思います。

ボックス1ダウンロード (ソースコード付き)
動作には .NET Framework 2.0 が必要です。

Visual C# 2005 Express Editionをインストールすると、スクリーンセーバーは比較的容易に作ることができます。本アプリケーションでやっていることは、

1. 普通にWindowsアプリケーションを作成する(全画面表示するように設定)
2. いくつかの決まった引数に対応できるようにする
3. 作成したexe の拡張子を .scr に変更して、%SystemRoot%system32 フォルダにコピーする

程度です。上記のコードでは、Visual Studio Express のサンプルプロジェクトをさらに削って、最小限のコードにしているので、独自の拡張は簡単だと思います。


さて、本ツールを利用して、Webサイトを指定すると、Webサイトによってはスクリーンの外周に枠が表示されます。これは、HTMLの最初の方の宣言の仕方に依存します。

例えば、
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

と宣言されている場合は枠が表示されてしまうのですが、

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

というように1行追加すると表示されなくなります。

IEの仕様ってやつですね...。

ダイヤ 参考
- DTDとブラウザの表示モード

それにしても、時をかける少女2006は良い映画ですね。何年か後には、かなりの人が知ることになる予感がします。私は、劇場には2度足を運んだ上、関連商品も結構買ってしまうほどはまっています。最近はNHKや朝日新聞などの大手マスコミにも取り上げられるようになったためか、都内の劇場はいつも満席のようです。
現時点では全国9箇所... orz の映画館で絶賛上映中ですので、見ていない人は是非この夏のうちに!

追記

劇中であまりにおいしそうに食べていたのでつい買ってきてしまいました。モロゾフのプリン。素材の味がしっかり出ていて確かにうまい!


写真は、時をかける少女 NOTEBOOK p.15 を参考に撮影。
 初出: 2006/08/06 06:54 ささお * 内容は随時追記・更新しています。
| 技術メモ::ソフトウェア | comments (6) | trackback (3) |このエントリーを含むはてなブックマーク このエントリーをはてなブックマークする
この記事のトラックバックURL
http://tmp.junkbox.info/tb.php/34
新着トラックバック
[cinema]時かけクロックスクリーンセーバーをマルチモニタ対応にしてみた
「時かけクロックスクリーンセーバー」というのがあるわけではないです。たぶん。 先日書いたように、ダム日和さん(id:dambiyori)の『時をかける少女』のタイムマシンのカウンタの字...
| thinkin’ in the brain | 06/10/23 23:26 |
[cinema]『時をかける少女』(アニメーション映画・細田守監督・2006年夏公開
『時をかける少女』を観る 大変良い映画でございました。 いい年して涙ぐんでしまったりしたが──いい年だから涙腺ゆるみまくってるとも言えるが、映画が暗闇で上映されるもので...
| thinkin’ in the brain | 06/10/22 02:50 |
スクリーンセーバー的な動作するバージョン作りました。
Javascriptで時かけクロック http://dambiyori.sakura.ne.jp/tokiclo/ ずーっと同じ場所に表示させるのはスクリーンセイバーとしてどうかとおもうので、一定時間たつと移動するようにしました。配...
| 速報ダム日和 | 06/08/06 22:19 |

画像処理で有名なあの画像

画像処理の書籍などを読んでいると必ずといっていいほど登場する例のサンプル画像は、The USC-SIPI Image Database から入手できます。
#なぜか引用元をちゃんと明記している書籍を見たことが無いのですが....

特に、3番目の レナ ( Lena あるいは Lenna ) という女性の画像は頻繁に引用されていますが、元ネタを知っていて使っているのだとすると、どうにかしているんじゃないか? とも思います。

Girl
http://sipi.usc.edu/database/database.cgi?volume=misc&image=1#top


Mandrill (または Baboon)
http://sipi.usc.edu/database/database.cgi?volume=misc&image=11#top


Girl (Lena あるいは Lenna)
http://sipi.usc.edu/database/database.cgi?volume=misc&image=12#top



more ...
 初出: 2006/07/09 03:45 ささお * 内容は随時追記・更新しています。
| 技術メモ::ソフトウェア | comments (0) | trackback (1) |このエントリーを含むはてなブックマーク このエントリーをはてなブックマークする
この記事のトラックバックURL
http://tmp.junkbox.info/tb.php/31
新着トラックバック
抱き枕の用途って…
抱き枕は抱きしめて眠ることで、安心感に包まれて安眠できるという寝具。体圧分散の効果も高い抱き枕は、本来は健康志向の下で流行ってきた感がありますね。しかし、今や抱きまく...
| 抱きまくらをGET | 07/11/27 15:00 |

.NET Framework 2.0 / 4.0 でキャプチャ



.NET Framework 2.0 対応言語 (C#2.0, VB2005など) を利用して USB接続の Webカメラなどから画像を取得するためのサンプルです。画像認識などを行うことを想定しています。

サンプルでは以下のことを行っています。

- 取り扱いが容易なライブラリの作成
数行の記述で Web カメラやキャプチャカードからの画像を取得/加工できるようなライブラリを作成しています。
内部的には DirectX の GetCurrentBuffer を利用して同期処理を行っているため、スレッドを意識しないプログラミングが可能です。もちろん unsafe ではありませんのでメモリリークの心配もありません。

- 高速な画像処理
標準的な方法 ( GetPixel() で 1ピクセルずつよみこむ ) を利用すると、とてつもなく遅くなります。このサンプルでは Marshal.Copy, Bitmap.LockBits, Bitmap.UnlockBits を利用して、Bitmap を byte配列 にコピーしたり、その逆を行うことで高速な画像処理を行っています。この処理もライブラリに組み込まれています。

ボックス2 サンプルコード
- [2006/06/12] ver. 0.7 (単純な静止画キャプチャ処理)
- [2008/03/02] ver. 0.8 (静止画キャプチャを連続的に行い、リアルタイム動画像処理)
* クリックで動画を表示します
クリックで動画を表示します
- [2008/03/04] 射影変換のテスト


- [2012/03/10] DirectShow.NET.NET Framework 4.0対応版

ダイヤ 参考
- USBカメラをC#で使おう
- 第 3 章 画像処理入門 1 ~ アルゴリズム入門 ~ (Microsoft)
- Bitmap.UnlockBits メソッド (MSDNライブラリ, 画像処理サンプルコードあり)

 初出: 2006/06/12 07:15 ささお * 内容は随時追記・更新しています。
| 技術メモ::ソフトウェア | comments (16) | trackback (0) |このエントリーを含むはてなブックマーク このエントリーをはてなブックマークする

C# を利用したシリアル通信

NET Framework 2.0 から標準サポートされたシリアルポートのコンポーネントをC#で利用するためのサンプルです。

シリアルポート利用サンプルアプリケーション動作画面
ボックス2 サンプルコード download (C#)
! 動作には .NET Framework 2.0 のインストールが必要。

利用手順の要点は下記の通りです。詳細はサンプルコードを参照してください。
more ...
 初出: 2006/05/06 18:43 ささお * 内容は随時追記・更新しています。
| 技術メモ::ソフトウェア | comments (0) | trackback (0) |このエントリーを含むはてなブックマーク このエントリーをはてなブックマークする

  
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
<<   09 - 2017   >>
COMMENTS
TRACBACK
PROFILE
LOGIN
現在のモード: ゲストモード
USER ID:
PASS:
OTHERS
LINK
POWERED BY
POWERED BY
ぶろぐん
SKIN BY
ゲットネット...¥