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 |

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) |このエントリーを含むはてなブックマーク このエントリーをはてなブックマークする

グラフで見る動画投稿の傾向 - アイドルマスター編

昨日の「VOCALOID編」 に引き続き、ニコニコ動画に投稿された動画の数を、タグ別・日別で集計してみました。今回も人気ジャンルの「アイドルマスター」関連です。

データの見方ですが、

・縦軸: 1日あたりの投稿数(1ピクセル=1投稿)
・横軸: 2007/6/9を0とする経過日数(1ピクセル=1日)

水色の縞々の背景は、日曜日始まりの1週間分をあらわしています。また、各グラフの下部の数字は月をあらわしています。データの収集は、30秒に1リクエスト程度のゆっくりしたペースで行ったので、1日程度のずれがあります。
more ...
 初出: 2008/06/09 22:55 ささお * 内容は随時追記・更新しています。
| ニコニコ動画 | comments (0) | trackback (0) |このエントリーを含むはてなブックマーク このエントリーをはてなブックマークする

グラフで見る動画投稿の傾向 - VOCALOID編

ニコニコ動画に投稿された動画の数を、タグ別・日別で集計してみました。投稿の傾向は、必ずしも、動画ランキングの傾向とは一致していないようです。また、世間では、VOCALOIDに関するさまざまな話題がありましたが、その影響が投稿数にはあまり反映されていないように見えます。

データの見方ですが、

・縦軸: 1日あたりの投稿数(1ピクセル=1投稿)
・横軸: 2007/6/9を0とする経過日数(1ピクセル=1日)

水色の縞々の背景は、日曜日始まりの1週間分をあらわしています。また、各グラフの下部の数字は月をあらわしています。データの収集は、30秒に1リクエスト程度のゆっくりしたペースで行ったので、1日程度のずれがあります。
more ...
 初出: 2008/06/08 22:43 ささお * 内容は随時追記・更新しています。
| ニコニコ動画 | comments (0) | trackback (0) |このエントリーを含むはてなブックマーク このエントリーをはてなブックマークする

秋月 GPSレシーバモジュールキット 組み立てのポイント

秋月の GPSモジュール:GPS-52D(B)-014 キットを組み立てる際のポイントです。

- 回路面


- 各部品のピン配置
付属の回路図では、極性のある電解コンデンサが記述されていますが、キットに付属しているコンデンサ(2種類)はいずれも極性がありませんので、向きはどちらでもかまいません。


- アンテナ面
アルミホイルが電池の足にあたってショートしないよう注意します。


- GPSモジュールへの配線
コネクタのピンはかなり折れやすいので注意してください。もし折ってしまった場合には、下記のようにコネクタを利用せず、直接配線することで、半田付けが比較的楽に行えます。


- GPSモジュールのピン配置
下記のようになっています。配線の必要が無いピン(6~8番ピン)には配線してはいけません。


- COMポートの確認
コントロールパネル/システム/ハードウェア タブ でデバイス マネージャー を選択して、ポート (COM と LPT)を確認します。


- 付属アプリケーションの画面
COMポートを正しく設定し、Baudrate を 9600 に、Raw Data を選択、Color のチェックボックスを有効にして、GPSモジュールに電源を入れると下記のような画面となります。



- 受信状態が良い場合
見晴らしの良い場所で2~3分ほど待つとこの色になります。緯度経度、高度などすべての情報が取得できている状態です。


 初出: 2008/03/30 02:27 ささお * 内容は随時追記・更新しています。
| 技術メモ::ハードウェア | comments (1) | trackback (1) |このエントリーを含むはてなブックマーク このエントリーをはてなブックマークする
この記事のトラックバックURL
http://tmp.junkbox.info/tb.php/44
新着トラックバック
秋月のGPSレシーバーモジュールキット 製作きろく。
GPSに最近、興味があったので買ってみた。必要に迫られてというのが正しいかもしれないが(笑)
| jm4lfa blog | 08/05/23 02:22 |

うp主向けツールまとめ

ニコニコ動画に作品を投稿する際に便利なツールをまとめています。このページは随時更新されます。
ブックマークなどされる場合には、 http://tmp.junkbox.info/e43.html を指定してください。

公開ブログパーツがある場合には勝手にお借りしています。
いまはひとまずポインタだけですが、そのうちツールの使い方の動画もアップしたいなー。
more ...
 初出: 2008/03/23 00:46 ささお * 内容は随時追記・更新しています。
| ニコニコ動画 | comments (4) | trackback (0) |このエントリーを含むはてなブックマーク このエントリーをはてなブックマークする

dsPIC30F3012 で PCMデータ再生

比較的メモリサイズの大きい PIC である dsPIC30F3012 を使うと、18 pin DIP の1チップで2秒程度PCMデータが鳴らせます。
2秒あると意外といろいろできますよ!

実装例 (動画)


回路図
回路図

詳細は、ソースコードを見たほうが手っ取り早いと思いますので貼り付けます。フリーのC30コンパイラを利用しています。
ソースコード他一式はこちらからダウンロードしてください。

//-------------------------------------------------------
// dsPIC30F3012 で PCM データ再生 (2008/2/25, ksasao)
//-------------------------------------------------------
// - 8kHz, 8bit の PCMデータを再生します。外付けメモリ
//   無しで合計約2秒間鳴らせます。
// - PCMの再生には RD0 の PWM 出力を利用します。
// - dsPICの内蔵クロックを PLLx8 で利用すると3Vで駆動
//   できます(PLLx16にしたい場合は5Vが必要です)。
// 本ソースコードは煮たり焼いたりお好きなように。
//-------------------------------------------------------
#include <p30f3012.h>
#include <outcompare.h>
#include <timer.h>
  
// 設定値は、
// %ProgramFiles%MicrochipMPLAB C30supporthp30f3012.h や
// dsPIC30F3012の PDF を参照してください。

_FWDT(WDT_OFF);                 // ウォッチドッグタイマ無効
_FGS(CODE_PROT_OFF);            // コードプロテクト無効
_FOSC(CSW_FSCM_OFF & FRC_PLL8); // FRC(7.37MHz)xPLL8/4=7.37MIPS * 2
_FBORPOR(PBOR_OFF  & PWRT_64 & MCLR_EN);

// 遅延のための関数です
void delay(int count){
    while(count--);
}

// 再生処理の宣言です。
void playP(int start,int end);

// 8kHz, 8bitの PCMデータを適当に作成してください(128が中央値です)
const unsigned char WAV_DATA[] = {
129,130,128,126,128,128,131,128,125,128,128,129,128,128,128,128,
  // 略
127,126,125,126,128,129,130,131,130,129,128,128,128,128,127,126
};

// ピン割り当て (dsPIC30F3012)
//--------------------------------------------------------------
// 1(I) /MCLR (10kでプルアップ)   18(I) AVdd (+3V)
// 2(I) スイッチ0(RB0)            17(I) AVss (GND)
// 3(I) スイッチ1(RB1)            16(N.C.)
// 4(I) スイッチ2(RB2)            15(N.C.)
// 5(I) スイッチ3(RB3)            14(I) Vdd (+3V)
// 6(N.C.)                        13(I) Vss (GND)
// 7(N.C.)                        12(N.C)
// 8(I) スイッチ4(RC13)           11(N.C)
// 9(I) スイッチ5(RC14)           10(O) PWM出力(RD0)
//--------------------------------------------------------------
// dsPIC30F3021 の 2 - 5, 8, 9 番ピンは 10kΩでプルアップしておき、
// スイッチが押されたら Lになるよう1kΩの抵抗を各スイッチのGND側に
// 配置します。
int main(void){
    // 各ポートの出力値設定
    PORTB = 0xFFFF;
    PORTC = 0xFFFF;
    PORTD = 0xFFFE;

    // 入出力設定 (O: 出力, I: 入力, -:無効)
    TRISB = 0x000F;    // ---- ---- OOOO IIII
    TRISC = 0x6000;    // OII- ---- ---- ----
    TRISD = 0x0000;    // ---- ---- ---- ---O
    
    // ADコンバータ設定(0:ADコンバータを利用 1:ディジタルI/Oを利用)
    // デフォルトでは、ADコンバータが有効なため、PORTB をディジタル
    // I/Oとして利用したい場合は、下記設定は必須です><
    ADPCFG = 0xFFFF;

    // 今回は適当です。各ボタンが押されたら単純に
    // 指定した範囲を再生します。
    while (1) {
        if(!PORTCbits.RC13){
            playP(0,116*16-1);
        }
        if(!PORTCbits.RC14){
            playP(116*16,218*16-1);
        }
        
        int b = PORTB;
        if(!(b & 0x1)){
            playP(218*16,437*16-1);
        }
        if(!(b & 0x2)){
            playP(437*16,570*16-1);
        }
        if(!(b & 0x4)){
            playP(570*16,722*16-1);
        }
        if(!(b & 0x8)){
            playP(722*16,972*16-1);
        }
    }
    return 0;   
     
}

// PCMデータを start から end まで再生します。
void playP(int start,int end){

    int p = start;
    const int MAX = 256;

    TRISD = 0x0000;    // ---- ---- ---- ---O

    // PWM関連の設定です。リンクするライブラリが結構大きいので、
    // インラインアセンブラで書いたほうが良いと思います。
    SetDCOC1PWM(0);
        OpenOC1(OC_IDLE_CON & OC_TIMER2_SRC & OC_PWM_FAULT_PIN_DISABLE, 0, 0);
    // 7.37MHz * 8逓倍(PLL) / 4命令 / MAX段階 = 57.6kHz(@MAX=256)
    OpenTimer2(T2_ON & T2_GATE_OFF & T2_PS_1_1 & T2_SOURCE_INT, MAX - 1);

    const int WAIT = 360; // 決めうち :-)

    // スピーカーが「カチっ!」というのを抑える
    int startup = 0;
    while(startup < 128){
        SetDCOC1PWM(startup++);
        delay(WAIT);
    }    
    
    // ここからがメインの再生
    unsigned int c0;
    while(p<end) {
        c0 = WAV_DATA[p];
        p++;
        SetDCOC1PWM(c0);
        delay(WAIT);
    }

    // スピーカーが「カチっ!」というのを抑える
    int count = 127;
    while(count > 0){
        SetDCOC1PWM(count--);
        delay(WAIT);
    }
    // ここではスピーカーが停止状態
}
 初出: 2008/02/25 01:43 ささお * 内容は随時追記・更新しています。
| 技術メモ::ハードウェア | comments (0) | trackback (0) |このエントリーを含むはてなブックマーク このエントリーをはてなブックマークする

ILMergeWin



■ これは何ですか?
.NET Framework で作成された複数のDLLを1つの.exeにまとめたりするツールです。ILMergeという Microsoft が配布しているコマンドラインツールを GUI で wrap したものです。ILMergeに関する詳細は、

@IT: アプリケーションのEXEファイルやDLLファイルを1つにまとめるには?

などを参照してください。

機能を最小限に絞っているので操作がシンプルです :-)
Visual Studio 2005 (C#) 向けのソースコードも付属しています。自由に改変してください。
なお、実行には、.NET Framework 2.0, 3.0, 3.5 のいずれかがインストールされている必要があります。
また、あらかじめ、ILMerge.exe をMicrosoftのサイトから取得しておいてください。

最新版の配布は、
http://tmp.junkbox.info/e41.html
で行います。

■ 利用方法

1. ILMergeWin.exe を起動します。
2. 1つにまとめたいファイルやDLLをDrag&Dropします。
3. F5キーを押すと結合を行います。

■ ライセンス
利用には以下の項目に同意が必要です。

- 本アーカイブのファイルの、一部または全部の利用および再配布は、 商用・非商用のいずれであっても許可は不要です。
- ソースコードの改変を行った場合には、改変者が著作権を保有します。
- 本アーカイブの一部または全部をささおが改変したり、配布する権利は放棄しません。
- 本アーカイブの一部または全部の利用により発生した損害について、 ささおは一切責任を負いません。
- 本アーカイブに対するサポートは行いません。

■ ダウンロード
ボックス1 ver. 1.0.0.0 (2008/01/27)
 初出: 2008/01/27 19:13 ささお * 内容は随時追記・更新しています。
| ツール | 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
31       
<<   03 - 2024   >>
TRACBACK
PROFILE
LOGIN
現在のモード: ゲストモード
USER ID:
PASS:
OTHERS
LINK
POWERED BY
POWERED BY
ぶろぐん
SKIN BY
ゲットネット...¥