8

MODI を使用してウィンドウのプログラムを OCR しようとしています。次のようにwin32相互運用を使用してプログラムで取得したスクリーンショットでは問題なく機能します。

public string SaveScreenShotToFile()
{
    RECT rc;
    GetWindowRect(_hWnd, out rc);

    int width = rc.right - rc.left;
    int height = rc.bottom - rc.top;

    Bitmap bmp = new Bitmap(width, height);
    Graphics gfxBmp = Graphics.FromImage(bmp);
    IntPtr hdcBitmap = gfxBmp.GetHdc();

    PrintWindow(_hWnd, hdcBitmap, 0);

    gfxBmp.ReleaseHdc(hdcBitmap);
    gfxBmp.Dispose();

    string fileName = @"c:\temp\screenshots\" + Guid.NewGuid().ToString() + ".bmp";
    bmp.Save(fileName);
    return fileName;
}

この画像はファイルに保存され、次のように MODI を実行します。

    private string GetTextFromImage(string fileName)
    {

        MODI.Document doc = new MODI.DocumentClass();
        doc.Create(fileName);
        doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
        MODI.Image img = (MODI.Image)doc.Images[0];
        MODI.Layout layout = img.Layout;

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < layout.Words.Count; i++)
        {
            MODI.Word word = (MODI.Word)layout.Words[i];
            sb.Append(word.Text);
            sb.Append(" ");
        }

        if (sb.Length > 1)
            sb.Length--;

        return sb.ToString();
    }

この部分は問題なく動作しますが、スクリーンショット全体を OCR で処理したくはありません。次のようにプログラムで画像をトリミングしてみます。

    private string SaveToCroppedImage(Bitmap original)
    {
        Bitmap result = original.Clone(new Rectangle(0, 0, 250, 250), original.PixelFormat);
        var fileName = "c:\\" + Guid.NewGuid().ToString() + ".bmp";
        result.Save(fileName, original.RawFormat);

        return fileName;
    }

次に、この小さな画像をOCRしますが、MODIは例外をスローします。「OCR 実行エラー」、エラー コードは -959967087 です。

MODI は元のビットマップを処理できるのに、元のビットマップから取得した小さいバージョンを処理できないのはなぜですか?

4

7 に答える 7

7

その答えは、MODI に大きなキャンバスを与えることにあるように見えます。また、コントロールのスクリーンショットを撮ってOCRしようとしたところ、同じ問題が発生しました。最後に、コントロールの画像を取得し、画像をより大きなビットマップにコピーし、OCRed でより大きなビットマップを作成しました。

私が見つけたもう 1 つの問題は、画像ファイルに適切な拡張子が必要なことです。つまり、 .tmp はそれをカットしません。

OCR メソッド内でより大きなソースを作成する作業を続けました。これは次のようになります (Image オブジェクトを直接処理します)。

public static string ExtractText(this Image image)
{
    var tmpFile = Path.GetTempFileName();
    string text;
    try
    {
        var bmp = new Bitmap(Math.Max(image.Width, 1024), Math.Max(image.Height, 768));
        var gfxResize = Graphics.FromImage(bmp);
        gfxResize.DrawImage(image, new Rectangle(0, 0, image.Width, image.Height));
        bmp.Save(tmpFile + ".bmp", ImageFormat.Bmp);
        var doc = new MODI.Document();
        doc.Create(tmpFile + ".bmp");
        doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
        var img = (MODI.Image)doc.Images[0];
        var layout = img.Layout;
        text = layout.Text;
    }
    finally
    {
        File.Delete(tmpFile);
        File.Delete(tmpFile + ".bmp");
    }

    return text;
}

最小サイズが正確にはわかりませんが、1024 x 768 でうまくいくようです。

于 2009-09-07T05:59:16.373 に答える
3

はい、このスレッドの投稿は、私がそれを機能させるのに役立ちました。ここに私が追加しなければならないもの:

画像(小さいもの)をダウンロードしようとしてから、ocr...

-画像を処理するとき、それらのサイズは 2 の累乗でなければならないようです! (画像をocrできました:512x512、128x128、256x64 ..他のサイズはほとんど失敗しました(1103x334など))

  • 透明な背景も問題を引き起こしました。powerof2境界、白い背景で新しいtifを作成し、ダウンロードした画像を貼り付けて保存すると、最良の結果が得られました。

  • 特に「ü」のような「ドイツ語」の文字の場合、OCRが間違った結果を取得しているため、画像のスケーリングは成功しませんでした

  • 最後に私も使用しました: doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);

  • Office 2003 の modi を使用する

挨拶

ウォムド

于 2010-08-20T13:45:58.007 に答える
1

modi ocr は私と一緒に tif だけで動作しています。「tif」に画像を保存してみてください。

ごめんなさい、私の悪い英語

于 2009-08-09T05:58:29.930 に答える
1
doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);

つまり、方向を検出したり、ゆがみを修正したりしたくないということです。これで、コマンドは 2400x2496 TIFF を含むすべての画像で正常に機能します。

ただし、画像は .tif である必要があります。

これが同じ問題に直面している人々に役立つことを願っています。

于 2011-04-06T10:43:01.020 に答える
0

一部の画像で同じ問題「OCR実行の問題」が発生しました。画像のサイズを変更しました (私の場合は 50%)。できます!

于 2009-10-06T12:39:51.760 に答える
0

私の状況を解決したのは、フォトエディター(Paint.NET)を使用し、シャープ効果を最大限に使用することでした.

私も使用しました: doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);

于 2014-02-12T15:51:36.067 に答える
0

を使用しているときに同じ問題が発生しました

doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);

2400x2496 の tiff ファイルで。サイズを 50% に変更 (サイズを縮小) すると問題が修正され、メソッドは例外をスローしなくなりましたが、「参照」の代わりに「関連性」または「712517」の代わりに「712017」を検出するなど、テキストを誤って認識していました。 . さまざまな画像サイズを試し続けましたが、コマンドを次のように変更するまで、すべて同じ問題がありました

doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);

つまり、方向を検出したり、ゆがみを修正したりしたくないということです。これで、コマンドは 2400x2496 TIFF を含むすべての画像で正常に機能します。

これが同じ問題に直面している人々に役立つことを願っています

于 2010-04-06T08:11:21.087 に答える