トップ回答者
Bitmap型とはBMPのこと?

質問
-
お世話になっております。
Tesseract-OCRという文字認識モジュールを使用しています。
実際のコード:
private string getOCRString(Bitmap bm) { var tesseract = new Tesseract.TesseractEngine(System.Windows.Forms.Application.StartupPath + @"tessdata", "jpn"); var page = tesseract.Process(bm); return page.GetText(); }
このコードで、実際動作するのですが、文字認識精度が
1.コマンドラインから使用する tesseract test.png output -l jpn
2.上記DLLを使って使用する tesseract.Process()
とで結果が違います。
原因は、読込ませるファイルがBMPかPNGで大きく違い、PNGの方が精度が高い。
そのため、引数のBitmap型にPNGを入れたいのですが、bmp.Save()で一旦
ファイル出力する以外ないのでしょうか?メモリ上でPNGを読込んだ時と同じ状態に変換できないのでしょうか?
追記:現在、スクリーンキャプチャより取得したBitmapデータからの変換と
System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(@"C:\Users\30150026\Desktop\bbb.png");
のようにして取得した結果とでは差異が出ています。- 編集済み コーベル 2016年4月4日 6:46 追記
回答
-
検証を行っておらず申し訳ないのですが、下記のようなコードでどうでしょうか?
private string getOCRString(Bitmap bm) { if (!bm.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Png)) { using (System.IO.MemoryStream stream = new System.IO.MemoryStream()) { bm.Save(stream, System.Drawing.Imaging.ImageFormat.Png); bm = (System.Drawing.Bitmap)System.Drawing.Image.FromStream(stream); } } var tesseract = new Tesseract.TesseractEngine(System.Windows.Forms.Application.StartupPath + @"tessdata", "jpn"); var page = tesseract.Process(bm); return page.GetText(); }
- 編集済み kenjinoteMVP 2016年4月4日 7:27
- 回答としてマーク コーベル 2016年4月4日 8:49
すべての返信
-
検証を行っておらず申し訳ないのですが、下記のようなコードでどうでしょうか?
private string getOCRString(Bitmap bm) { if (!bm.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Png)) { using (System.IO.MemoryStream stream = new System.IO.MemoryStream()) { bm.Save(stream, System.Drawing.Imaging.ImageFormat.Png); bm = (System.Drawing.Bitmap)System.Drawing.Image.FromStream(stream); } } var tesseract = new Tesseract.TesseractEngine(System.Windows.Forms.Application.StartupPath + @"tessdata", "jpn"); var page = tesseract.Process(bm); return page.GetText(); }
- 編集済み kenjinoteMVP 2016年4月4日 7:27
- 回答としてマーク コーベル 2016年4月4日 8:49
-
本筋は解決されているようですが、タイトルに対して一応コメントをつけておきます。
Bitmap クラスはあくまで「画像」を表すものであり、概念的にはファイルフォーマットとは直接結びつきません。
(Bitmap クラスのオブジェクトを作る際に与えたファイルパス、Stream によってある程度の性質を持ってしまうことはありますが…)しかし、提示されているコードで動作が変わると言うことは、「RawFormat に依存した処理がライブラリ内部にある」か、「Png を経由することによって結果的に PixelFormat が変わってうまくいく」かのいずれかがあるのかもしれませんね。
-
Azuleanさん、ご回答ありがとうございます。
>Bitmap クラスはあくまで「画像」を表すものであり、概念的にはファイルフォーマットとは直接結びつきません。
私も調査したときは以下のように記載があったので(転載:MSDN)
Bitmap は、ピクセル データで定義したイメージを処理する場合に使用するオブジェクトです。
どのフォーマットであれ、同じ結果じゃないの?と思いこのような少し結びつかないタイトルと
なってしまっていました。>しかし、提示されているコードで動作が変わると言うことは、「RawFormat に依存した処理がライブラリ内部にある」か、「Png を経由することによって結果的に PixelFormat が変わってうまくいく」かのいずれかがあるのかもしれませんね。
このモジュールの日本語資料が少ないため詳細な調査が出来ていませんが、そういうものなのかもしれませんね。
もやもやしていたものが少しスッキリしました。またBitmapクラスについて勉強できました、ありがとうございました!動作検証:
指定範囲をマウスキャプチャ(CopyFromScreen)をしてOCRに通した結果(BMP):精度が悪い
前述のAndroidからスクリーンキャプチャして保存されたPNGファイルをロードしてOCRを通した結果(PNG):精度が良い