C#で文字認識を行う
Microsoft Office をインストールすると、実は OCR ソフトがついてきます。C# からの利用も簡単です。下記のコードを、Visual C# Express 2005 または 2008 で作成し、参照設定に、 Microsoft Office Document Imaging 11.0 Type Library (MDIVWCTL.DLL) を追加してビルドしてください。
ソースコードのダウンロード (Visual C# Express 2008 用)
v1.0 (2008/07/21)
たとえば、下の画像をこのコードで読み込むと、
のように認識結果が出力されます。今回のサンプルでは文字そのもののみを対象としましたが、文字の画像上の位置やフォント名なども取得可能です。詳細については、
OCR with MicrosoftR Office By Martin Welker (CodeProject)
を参照してください。
ソースコードのダウンロード (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);
}
}
}
}
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][)][の][利][用][サ][ン][プ][ル][で][す][。]
* 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)
を参照してください。
この記事のトラックバックURL
http://tmp.junkbox.info/tb.php/48
新着トラックバック
ここ最近フリーの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 のいずれかが必要です)
(2008/06/30) ppt2img v1.0
サンプルコードは以下のような感じになります。エラー処理はあまりまじめにやっていないので、適宜追加してください。
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 のいずれかが必要です)
(2008/06/30) ppt2img v1.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でも利用可能です。
PSDパーサー
Yet Another PSD Parser
http://www.codeproject.com/KB/graphics/PSDParser.aspx
なる素敵なものがあったので、日本語対応を行いました。
修正後のソースコードをおいておきますので、ご利用ください。
なお、ビルドには、Visual Studio 2005 以降が必要です。実行には、.NET Framework 2.0 以降が必要です。一度ビルドしてしまえば当然ながら、VBでも利用可能です。
PSDパーサー
C#でスクリーンセーバー
2ちゃんねるの時をかける少女スレでみかけた、速報ダム日和さんのJavascriptで時かけクロックにグッときたので、勝手にWebページをスクリーンセーバー化するアプリケーションを作ってみました。URLはスクリーンセーバーの設定画面から変更できるので、天気予報の画像やYouTubeの動画のURLなどを設定するのもよいと思います。
ダウンロード (ソースコード付き)
動作には .NET Framework 2.0 が必要です。
Visual C# 2005 Express Editionをインストールすると、スクリーンセーバーは比較的容易に作ることができます。本アプリケーションでやっていることは、
程度です。上記のコードでは、Visual Studio Express のサンプルプロジェクトをさらに削って、最小限のコードにしているので、独自の拡張は簡単だと思います。
さて、本ツールを利用して、Webサイトを指定すると、Webサイトによってはスクリーンの外周に枠が表示されます。これは、HTMLの最初の方の宣言の仕方に依存します。
例えば、
と宣言されている場合は枠が表示されてしまうのですが、
というように1行追加すると表示されなくなります。
IEの仕様ってやつですね...。
参考
- DTDとブラウザの表示モード
それにしても、時をかける少女2006は良い映画ですね。何年か後には、かなりの人が知ることになる予感がします。私は、劇場には2度足を運んだ上、関連商品も結構買ってしまうほどはまっています。最近はNHKや朝日新聞などの大手マスコミにも取り上げられるようになったためか、都内の劇場はいつも満席のようです。
現時点では全国9箇所... orz の映画館で絶賛上映中ですので、見ていない人は是非この夏のうちに!
追記
劇中であまりにおいしそうに食べていたのでつい買ってきてしまいました。モロゾフのプリン。素材の味がしっかり出ていて確かにうまい!
写真は、時をかける少女 NOTEBOOK p.15 を参考に撮影。
ダウンロード (ソースコード付き)
動作には .NET Framework 2.0 が必要です。
Visual C# 2005 Express Editionをインストールすると、スクリーンセーバーは比較的容易に作ることができます。本アプリケーションでやっていることは、
1. 普通にWindowsアプリケーションを作成する(全画面表示するように設定)
2. いくつかの決まった引数に対応できるようにする
3. 作成したexe の拡張子を .scr に変更して、%SystemRoot%system32 フォルダにコピーする
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">
<!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 を参考に撮影。
この記事のトラックバックURL
http://tmp.junkbox.info/tb.php/34
新着トラックバック
「時かけクロックスクリーンセーバー」というのがあるわけではないです。たぶん。 先日書いたように、ダム日和さん(id:dambiyori)の『時をかける少女』のタイムマシンのカウンタの字...
| thinkin’ in the brain | 06/10/23 23:26 |
『時をかける少女』を観る 大変良い映画でございました。 いい年して涙ぐんでしまったりしたが──いい年だから涙腺ゆるみまくってるとも言えるが、映画が暗闇で上映されるもので...
| 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 ) という女性の画像は頻繁に引用されていますが、元ネタを知っていて使っているのだとすると、どうにかしているんじゃないか? とも思います。
http://sipi.usc.edu/database/database.cgi?volume=misc&image=1#top
http://sipi.usc.edu/database/database.cgi?volume=misc&image=11#top
http://sipi.usc.edu/database/database.cgi?volume=misc&image=12#top
more ...
#なぜか引用元をちゃんと明記している書籍を見たことが無いのですが....
特に、3番目の レナ ( Lena あるいは Lenna ) という女性の画像は頻繁に引用されていますが、元ネタを知っていて使っているのだとすると、どうにかしているんじゃないか? とも思います。
http://sipi.usc.edu/database/database.cgi?volume=misc&image=1#top
http://sipi.usc.edu/database/database.cgi?volume=misc&image=11#top
http://sipi.usc.edu/database/database.cgi?volume=misc&image=12#top
more ...
この記事のトラックバック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配列 にコピーしたり、その逆を行うことで高速な画像処理を行っています。この処理もライブラリに組み込まれています。
サンプルコード
- [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ライブラリ, 画像処理サンプルコードあり)
C# を利用したシリアル通信
TOP PAGE △