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

秋月 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 |

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

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

ケータイと青春18きっぷでお気楽旅行-その3

第3弾。今回は9/5(水)~9/9(日)です。行き先は例によって未定。旅行前に機能追加をするつもりが、ニコニコ動画の初音ミク (歌声合成ソフト。YAMAHAが歌声合成エンジンを開発 & クリプトンが音声データを作成) 祭りに参加していたら実装が間に合わず
#せっかく新しくドメインまでとったのに....orz

前回までは Willcom のみ対応していましたが、今回からは FOMA と Softbank 3G の GPS にも対応したので、より場所の抜けがなくなる予定です。
more ...
 初出: 2007/09/05 04:52 ささお * 内容は随時追記・更新しています。
| 技術メモ | comments (4) | trackback (0) |このエントリーを含むはてなブックマーク このエントリーをはてなブックマークする

ケータイと青春18きっぷでお気楽旅行-その2

というわけでまたもややってみましょう。今回は1/4(木)~1/8(月)です。行き先などは未定。機能追加などは電車内から随時行っていきます。
more ...
 初出: 2007/01/04 01:48 ささお * 内容は随時追記・更新しています。
| 技術メモ | comments (25) | trackback (0) |このエントリーを含むはてなブックマーク このエントリーをはてなブックマークする

ケータイと青春18きっぷでお気楽旅行

ケータイと青春18きっぷを利用して2006/8/20~24の間旅行しました。
時刻表の検索やホテルの予約はケータイからできるので、今回の旅行では特に目的地を定めず、その時々で決定しています。技術の発展とはいいものですね。
さて、今回はPHSを利用した現在位置&日記のリアルタイム更新というのを試みています。

■ 仕掛け

下記の現在位置表示はリアルタイムに更新されます。下記の情報の作成にはウィルコムのPHS AH-K3001V(通称京ぽん) を主に利用しています。仕掛けは下記のような感じです。
1. PHSで緯度経度を取得し、サーバに問い合わせる
2. サーバでは、受け取った情報をマピオンの携帯向けサイトに問い合わせ、現在の場所名を取得して、PHSに戻す
3. 必要であればPHS上でコメントを追記し、位置情報、時刻情報、コメントをサーバに記録
4. Google Maps APIを利用 Webブラウザで指定した範囲の日時を表示する。


なお、PHSの電波が届かないエリアにいる場合には、FOMAを利用し、
1-1. FOMAから駅名・施設名を入力して、サーバに問い合わせる
1-2. サーバでは、受け取った情報を Google Local に問いあわせ緯度経度情報を取得する
2. 以下、上記と同様


といった処理をしています。
more ...
 初出: 2006/08/24 08:33 ささお * 内容は随時追記・更新しています。
| 技術メモ | comments (15) | trackback (2) |このエントリーを含むはてなブックマーク このエントリーをはてなブックマークする
この記事のトラックバックURL
http://tmp.junkbox.info/tb.php/35
新着トラックバック
青春18きっぷ
こんにちは!突然のトラックバック失礼します。よろしければ青春18きっぷについて情報交換しませんか?
| 国内旅行・海外旅行の豆知識 | 06/12/18 00:03 |
青春18きっぷ 格安の切符
青春18きっぷは貧乏旅行には強い味方です。5枚で11,500円 1日1枚使用可能。1日の内なら、何回でも乗り継ぎできます。使用期間は主に春休み、夏休み、冬休みになります...
| 貧乏旅行情報サイト | 06/10/31 13:49 |

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