web-dev-qa-db-ja.com

Tesseract OCRの簡単な例

こんにちはTesseract OCRをC#でテストする簡単な例を教えてください。
見つかったデモを試しました こちら 。英語のデータセットをダウンロードし、Cドライブで解凍しました。次のようにコードを変更しました:

string path = @"C:\pic\mytext.jpg";
Bitmap image = new Bitmap(path);
Tesseract ocr = new Tesseract();
ocr.SetVariable("tessedit_char_whitelist", "0123456789"); // If digit only
ocr.Init(@"C:\tessdata\", "eng", false); // To use correct tessdata
List<tessnet2.Word> result = ocr.DoOCR(image, Rectangle.Empty);
foreach (tessnet2.Word word in result)
    Console.WriteLine("{0} : {1}", Word.Confidence, Word.Text);

残念ながら、コードは機能しません。プログラムは「ocr.Init(...」行で終了します。try-catchを使用しても例外を取得することさえできませんでした。

vietocr !を実行できました。しかし、それは私が従うべき非常に大きなプロジェクトです。上記のような簡単な例が必要です。

ありがとう

24
Will Robinson

OK。私はここで解決策を見つけました tessnet2はロードに失敗します Adamによって与えられたAns

どうやら間違ったバージョンのtessdataを使用していたようです。 ソースページ の指示を直感的にたどっていたため、問題が発生しました。

それは言います

Tessnet2のクイック使用

  1. ここからバイナリをダウンロード 、アセンブリTessnet2.dllの参照を.NETプロジェクトに追加します。

  2. 言語データ定義ファイル here をダウンロードして、tessdataディレクトリに配置します。 Tessdataディレクトリとexeは同じディレクトリにある必要があります。

バイナリをダウンロードした後、リンクをクリックして言語ファイルをダウンロードすると、多くの言語ファイルがあります。しかし、それらのどれも正しいバージョンではありません。すべてのバージョンを選択し、次のページに進んで正しいバージョン(tesseract-2.00.eng)を探す必要があります!ダウンロードバイナリリンクをバージョン3に更新するか、バージョン2の言語ファイルを最初のページに配置する必要があります。または、このバージョンの問題が大したことであるという事実に少なくとも大胆に言及してください!

とにかく見つけた。みんな、ありがとう。

19
Will Robinson

C#でTesseract OCRをテストする簡単な例:

    public static string GetText(Bitmap imgsource)
    {
        var ocrtext = string.Empty;
        using (var engine = new TesseractEngine(@"./tessdata", "eng", EngineMode.Default))
        {
            using (var img = PixConverter.ToPix(imgsource))
            {
                using (var page = engine.Process(img))
                {
                    ocrtext = page.GetText();
                }
            }
        }

        return ocrtext;
    }

情報:tessdataフォルダーがリポジトリーに存在する必要があります:bin\Debug \

これらの 指示 に従うことで動作させることができました。

  • サンプルコードTesseract sample code

  • 新しい場所に解凍します

  • 〜\ tesseract-samples-master\src\Tesseract.Samples.slnを開きます(Visual Studio 2017を使用しました)

  • そのプロジェクトのTesseract NuGetパッケージをインストールします(または必要に応じてアンインストール/再インストールします) NuGet Tesseract

  • Tesseract.Samples.Program.csの最後の2行のコメントを外します:Console.Write("Press any key to continue . . . "); Console.ReadKey(true);

  • 実行(F5キーを押す)

  • このWindowsコンソール出力を取得する必要があります enter image description here

2
Doppelganger

行を次のように更新してみてください。

ocr.Init(@ "C:\"、 "eng"、false); //ここのパスはtessdataの親フォルダーである必要があります

1
Rachel

これは私のために働いた、私は3-4以上PDF Text Extractorにあり、1つが機能しない場合、他のものは... tesseract特にWindows 7、8で使用できるこのコードServer 2008。これがお役に立てば幸いです

    do
    {
    // Sleep or Pause the Thread for 1 sec, if service is running too fast...
    Thread.Sleep(millisecondsTimeout: 1000);
    Guid tempGuid = ToSeqGuid();
    string newFileName = tempGuid.ToString().Split('-')[0];
    string outputFileName = appPath + "\\pdf2png\\" + fileNameithoutExtension + "-" + newFileName +
                            ".png";
    extractor.SaveCurrentImageToFile(outputFileName, ImageFormat.Png);
    // Create text file here using Tesseract
    foreach (var file in Directory.GetFiles(appPath + "\\pdf2png"))
    {
        try
        {
            var pngFileName = Path.GetFileNameWithoutExtension(file);
            string[] myArguments =
            {
                "/C tesseract ", file,
                " " + appPath + "\\png2text\\" + pngFileName
            }; // /C for closing process automatically whent completes
            string strParam = String.Join(" ", myArguments);

            var myCmdProcess = new Process();
            var theProcess = new ProcessStartInfo("cmd.exe", strParam)
            {
                CreateNoWindow = true,
                UseShellExecute = false,
                RedirectStandardOutput = true,
                RedirectStandardError = true,
                WindowStyle = ProcessWindowStyle.Minimized
            }; // Keep the cmd.exe window minimized
            myCmdProcess.StartInfo = theProcess;
            myCmdProcess.Exited += myCmdProcess_Exited;
            myCmdProcess.Start();

            //if (process)
            {
                /*
                MessageBox.Show("cmd.exe process started: " + Environment.NewLine +
                                "Process Name: " + myCmdProcess.ProcessName +
                                Environment.NewLine + " Process Id: " + myCmdProcess.Id
                                + Environment.NewLine + "process.Handle: " +
                                myCmdProcess.Handle);
                */
                Process.EnterDebugMode();
                //ShowWindow(hWnd: process.Handle, nCmdShow: 2);
                /*
                MessageBox.Show("After EnterDebugMode() cmd.exe process Exited: " +
                                Environment.NewLine +
                                "Process Name: " + myCmdProcess.ProcessName +
                                Environment.NewLine + " Process Id: " + myCmdProcess.Id
                                + Environment.NewLine + "process.Handle: " +
                                myCmdProcess.Handle);
                */
                myCmdProcess.WaitForExit(60000);
                /*
                MessageBox.Show("After WaitForExit() cmd.exe process Exited: " +
                                Environment.NewLine +
                                "Process Name: " + myCmdProcess.ProcessName +
                                Environment.NewLine + " Process Id: " + myCmdProcess.Id
                                + Environment.NewLine + "process.Handle: " +
                                myCmdProcess.Handle);
                */
                myCmdProcess.Refresh();
                Process.LeaveDebugMode();
                //myCmdProcess.Dispose();
                /*
                MessageBox.Show("After LeaveDebugMode() cmd.exe process Exited: " +
                                Environment.NewLine);
                */
            }


            //process.Kill();
            // Waits for the process to complete task and exites automatically
            Thread.Sleep(millisecondsTimeout: 1000);

            // This works fine in Windows 7 Environment, and not in Windows 8
            // Try following code block
            // Check, if process is not comletey exited

            if (!myCmdProcess.HasExited)
            {
                //process.WaitForExit(2000); // Try to wait for exit 2 more seconds
                /*
                MessageBox.Show(" Process of cmd.exe was exited by WaitForExit(); Method " +
                                Environment.NewLine);
                */
                try
                {
                    // If not, then Kill the process
                    myCmdProcess.Kill();
                    //myCmdProcess.Dispose();
                    //if (!myCmdProcess.HasExited)
                    //{
                    //    myCmdProcess.Kill();
                    //}

                    MessageBox.Show(" Process of cmd.exe exited ( Killed ) successfully " +
                                    Environment.NewLine);
                }
                catch (System.ComponentModel.Win32Exception ex)
                {
                    MessageBox.Show(
                        " Exception: System.ComponentModel.Win32Exception " +
                        ex.ErrorCode + Environment.NewLine);
                }
                catch (NotSupportedException notSupporEx)
                {
                    MessageBox.Show(" Exception: NotSupportedException " +
                                    notSupporEx.Message +
                                    Environment.NewLine);
                }
                catch (InvalidOperationException invalidOperation)
                {
                    MessageBox.Show(
                        " Exception: InvalidOperationException " +
                        invalidOperation.Message + Environment.NewLine);
                    foreach (
                        var textFile in Directory.GetFiles(appPath + "\\png2text", "*.txt",
                            SearchOption.AllDirectories))
                    {
                        loggingInfo += textFile +
                                       " In Reading Text from generated text file by Tesseract " +
                                       Environment.NewLine;
                        strBldr.Append(File.ReadAllText(textFile));
                    }
                    // Delete text file after reading text here
                    Directory.GetFiles(appPath + "\\pdf2png").ToList().ForEach(File.Delete);
                    Directory.GetFiles(appPath + "\\png2text").ToList().ForEach(File.Delete);
                }
            }
        }
        catch (Exception exception)
        {
            MessageBox.Show(
                " Cought Exception in Generating image do{...}while{...} function " +
                Environment.NewLine + exception.Message + Environment.NewLine);
        }
    }
    // Delete png image here
    Directory.GetFiles(appPath + "\\pdf2png").ToList().ForEach(File.Delete);
    Thread.Sleep(millisecondsTimeout: 1000);
    // Read text from text file here
    foreach (var textFile in Directory.GetFiles(appPath + "\\png2text", "*.txt",
        SearchOption.AllDirectories))
    {
        loggingInfo += textFile +
                       " In Reading Text from generated text file by Tesseract " +
                       Environment.NewLine;
        strBldr.Append(File.ReadAllText(textFile));
    }
    // Delete text file after reading text here
    Directory.GetFiles(appPath + "\\png2text").ToList().ForEach(File.Delete);
} while (extractor.GetNextImage()); // Advance image enumeration... 
0
Kaushal B

これが素晴らしい実例プロジェクトです。 Leptonica前処理を備えたTesseract OCRサンプル(Visual Studio) Leptonica前処理を備えたTesseract OCRサンプル(Visual Studio)

Tesseract OCR 3.02.02 APIは混乱を招く可能性があるため、TesseractおよびLeptonica dllをVisual Studio C++プロジェクトに含める方法を説明し、イメージパスをプリプロセスおよびOCRに使用するサンプルファイルを提供します。 Leptonicaの前処理スクリプトは、入力画像を白黒の本のようなテキストに変換します。

セットアップ

これを独自のプロジェクトに含めるには、ヘッダーファイルとlibを参照し、tessdataフォルダーとdllをコピーする必要があります。

Tesseract-includeフォルダーをプロジェクトのルートフォルダーにコピーします。 Visual Studioソリューションエクスプローラーでプロジェクトをクリックし、[プロジェクト]> [プロパティ]に移動します。

VC++ディレクトリ>ディレクトリを含める:

..\tesseract-include\tesseract; ..\tesseract-include\leptonica; $(IncludePath)C/C++> Preprocessor> Preprocessor Definitions:

_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)C/C++> Linker> Input> Additional Dependencies:

..\tesseract-include\libtesseract302.lib; ..\tesseract-include\liblept168.lib;%(AdditionalDependencies)これで、プロジェクトのファイルにヘッダーを含めることができます。

含める

含める

次に、tesseract-includeの2つのdllファイルと、Debugのtessdataフォルダーをプロジェクトの出力ディレクトリにコピーします。

Tesseractを初期化するときに、実行可能ファイルの現在のディレクトリでない場合は、tessdataフォルダーの親フォルダー(!important)の場所を指定する必要があります。スクリプトをコピーできます。これは、tessdataが実行可能ファイルのフォルダーにインストールされていることを前提としています。

tesseract :: TessBaseAPI * api = new tesseract :: TessBaseAPI(); api-> Init( "D:\ tessdataParentFolder \"、...サンプル

提供されているサンプルをコンパイルできます。これは、使用するイメージパスのコマンドライン引数を1つ受け取ります。 preprocess()関数はLeptonicaを使用して、白黒の本のような画像のコピーを作成し、テセラクトを90%の精度で動作させます。 ocr()関数は、文字列出力を返すTesseract APIの機能を示しています。 toClipboard()は、Windowsのテキストをクリップボードに保存するために使用できます。これらを自分のプロジェクトにコピーできます。

0
Alex G

私は同じ問題を抱えていましたが、今では解決しました。 32ビットと64ビットのこのフォルダーの下にtesseract2があり、64ビットフォルダー(システムは64ビット)をメインフォルダー( "Tesseract2")とbin/Debugフォルダーの下にコピーしました。現在、私のソリューションは正常に機能しています。

0
Prasad

私の場合、正しい文字認識を除いて、これらすべてが機能していました。

ただし、次のいくつかの点を考慮する必要があります。

  • 正しいtessnet2ライブラリを使用する
  • 正しいtessdata言語バージョンを使用する
  • tessdataは、アプリケーションフォルダーの外にある必要があります。このフォルダーでは、initパラメーターにフルパスを入力できます。 ocr.Init(@"c:\tessdata", "eng", true);を使用します
  • デバッグは頭痛の種になります。次に、これを使用してapp.configを更新する必要があります。 (ここにxmlコードを入れることはできません。あなたにメールを送ってください。

これが役立つことを願って

0
Muadzir Aziz