none
tesseract.dll利用時, ".traineddata" が 読み込めない.(フォーマットエラー) RRS feed

  • 質問

  • 自分がググった限り,同じ詰まり方や似た質問がなかったためこの場で質問させていただきます.

    namespace tesseract_ocr { class Program { static void Main(string[] args) { var img = new Bitmap(@"img/test.jpg"); string[] files = System.IO.Directory.GetFiles(@"C:/tessdata", "*", System.IO.SearchOption.AllDirectories); foreach (string file in files) { Console.WriteLine(file); }

    /* 出力結果

    C:/tessdata\eng.traineddata

    C:/tessdata\jpn.traineddata

    */ var engine = new Tesseract.TesseractEngine(@"C:/tessdata", "jpn"); //System.BadImageFormatException var page = engine.Process(img); Console.WriteLine(page.GetText()); } } }

    上記のプログラムで, ".traineddata" がフォーマットエラーとなり読み込めません.

    エラー内容は,下記の通りです.

    型 'System.BadImageFormatException' のハンドルされていない例外が Tesseract.dll で発生しました
    追加情報:間違ったフォーマットのプログラムを読み込もうとしました。 (HRESULT からの例外:0x8007000B)

    .traineddata は下記URLからDownloadしました

    https://code.google.com/p/tesseract-ocr/downloads/detail?name=tesseract-ocr-3.02.jpn.tar.gz&can=2&q=

    辞書データを作成したtesseract-ocrと,自分がNuGetを用いてダウンロードしたtesseract-ocrのバージョンが異なるのでしょうか.

    自分で .traineddata拡張子の学習データ を作成するしか無いですか?

    何か解決策やヒントをいただけると大変嬉しいです.


    • 編集済み okeke 2014年9月6日 9:12
    2014年9月6日 8:49

回答

  • BadImageFormatException は「64bit アプリケーションで 32bit の DLL を読み込もうとしたとき」、あるいは「32bit アプリケーションで 64bit の DLL を読み込もうとしたとき」に発生します。データファイルがおかしいという意味ではありませんのでご注意ください。

    使おうとしているライブラリがどちらのプラットフォームに向けたライブラリかをご確認いただき、あなたのアプリケーションのプラットフォームを正しく選択してください。
    (32bit なら x86、64bit なら x64 を選ぶ)

    2014年9月6日 9:27
    モデレータ
  • Tesseract.dllは32bit/64bitどちらを使っているのですか?(使ったことがないので64bit版が用意されているのかどうか知りませんが)

    また、作成されているVC#アプリケーションの[プラットフォーム ターゲット]は何にしてますか?

    BadImageFormatExceptionはたぶん学習データのフォーマットに関するものではなく、マネージラッパーアセンブリもしくはその内部で使われているネイティブDLLのターゲットが、EXEのターゲットと異なることが原因だと思います。

    C/C++などで静的リンク/アーリーバインドするときは、ターゲットや呼び出し規約が異なる場合はコンパイル時(リンク時)にエラーが出ますが、C#でP/Invokeしたり、P/Invokeを使っているマネージアセンブリを参照したりする場合は、そのアセンブリに含まれているクラスを初めてインスタンス化したタイミングや、メソッドを呼び出したタイミングでターゲットや呼び出し規約の間違いが発覚することになります。

    32bitのネイティブDLLを使うときは、ホストプログラム側は[x86]に設定します。64bitのネイティブDLLを使うときは、ホストプログラム側は[x64]もしくは[Any CPU]に設定します。

    ちなみに「tesseract BadImageFormatException」で検索すれば、それらしき現象に遭遇している人は普通に見つかります。

    https://www.devscope.net/Support/CommunityForums/tabid/733/aft/10/Default.aspx

    あと、質問するときは開発環境とともに、動作環境をきちんと書きましょう。

    • 編集済み sygh 2014年9月6日 9:52
    • 回答としてマーク okeke 2014年9月6日 9:53
    2014年9月6日 9:42
  • 32-bit / 64-bit 不整合の問題については、以下のページが参考になると思います。目を通しておくことをお勧めします。

    Part 1. 64 ビット Windows OS の基本知識
    http://blogs.msdn.com/b/nakama/archive/2008/10/30/part-1-64-windows-os.aspx

    Part 2. .NET Framework 2.0 アプリケーションの 64 ビット対応
    http://blogs.msdn.com/b/nakama/archive/2008/11/06/part-2-net-framework-2-0-64.aspx

    • 回答としてマーク okeke 2014年9月6日 9:53
    2014年9月6日 9:50

すべての返信

  • BadImageFormatException は「64bit アプリケーションで 32bit の DLL を読み込もうとしたとき」、あるいは「32bit アプリケーションで 64bit の DLL を読み込もうとしたとき」に発生します。データファイルがおかしいという意味ではありませんのでご注意ください。

    使おうとしているライブラリがどちらのプラットフォームに向けたライブラリかをご確認いただき、あなたのアプリケーションのプラットフォームを正しく選択してください。
    (32bit なら x86、64bit なら x64 を選ぶ)

    2014年9月6日 9:27
    モデレータ
  • Tesseract.dllは32bit/64bitどちらを使っているのですか?(使ったことがないので64bit版が用意されているのかどうか知りませんが)

    また、作成されているVC#アプリケーションの[プラットフォーム ターゲット]は何にしてますか?

    BadImageFormatExceptionはたぶん学習データのフォーマットに関するものではなく、マネージラッパーアセンブリもしくはその内部で使われているネイティブDLLのターゲットが、EXEのターゲットと異なることが原因だと思います。

    C/C++などで静的リンク/アーリーバインドするときは、ターゲットや呼び出し規約が異なる場合はコンパイル時(リンク時)にエラーが出ますが、C#でP/Invokeしたり、P/Invokeを使っているマネージアセンブリを参照したりする場合は、そのアセンブリに含まれているクラスを初めてインスタンス化したタイミングや、メソッドを呼び出したタイミングでターゲットや呼び出し規約の間違いが発覚することになります。

    32bitのネイティブDLLを使うときは、ホストプログラム側は[x86]に設定します。64bitのネイティブDLLを使うときは、ホストプログラム側は[x64]もしくは[Any CPU]に設定します。

    ちなみに「tesseract BadImageFormatException」で検索すれば、それらしき現象に遭遇している人は普通に見つかります。

    https://www.devscope.net/Support/CommunityForums/tabid/733/aft/10/Default.aspx

    あと、質問するときは開発環境とともに、動作環境をきちんと書きましょう。

    • 編集済み sygh 2014年9月6日 9:52
    • 回答としてマーク okeke 2014年9月6日 9:53
    2014年9月6日 9:42
  • 32-bit / 64-bit 不整合の問題については、以下のページが参考になると思います。目を通しておくことをお勧めします。

    Part 1. 64 ビット Windows OS の基本知識
    http://blogs.msdn.com/b/nakama/archive/2008/10/30/part-1-64-windows-os.aspx

    Part 2. .NET Framework 2.0 アプリケーションの 64 ビット対応
    http://blogs.msdn.com/b/nakama/archive/2008/11/06/part-2-net-framework-2-0-64.aspx

    • 回答としてマーク okeke 2014年9月6日 9:53
    2014年9月6日 9:50
  • すぐに「回答としてマーク」するのは良いことだと思いますが、常識的に考えれば、回答者さんに一言でいいからきちんとお礼を言い、そして結果報告をするべきではないでしょうか。
    今回は全員が満場一致でほぼ同時に同じ結論を出しているので、全員に対してまとめて1レスでも良いと思いますが、質問したからにはせめて結果がどうなったのか、回答者に対してこのフォーラムの場で報告するべきです(これは回答者のためというよりはむしろ、今後誰か他の人が同じような問題に遭遇したとき、現象の理由や最終的な結論がどうなったか、ということが記録に残っていれば、その人の役に立つかもしれないからです)。
    コミュニティに貢献する、というのは、なにも回答者だけができることではなく、質問者にだってできることです。
    • 編集済み sygh 2014年9月7日 3:33
    2014年9月7日 2:27