OpenCvSharpをつかう その13(導入時のエラーについて)

13回目にして今更導入時の不具合とはなんとも変な話ですが、OpenCvSharpが動かないというケースを時々耳にします。はっきり聞いているわけではないのでよくわからないのですが、わかる限りの解決策を書いておきます。どうやらBadImageFormatExceptionが多いらしい?

OpenCvSharpをつかう 記事一覧

BadImageFormatExceptionについて

おそらく、OpenCvSharpのDLLと利用側のコードの間の、対象プラットフォームの違いだと思われます。これまでOpenCvSharpはx86x64のバイナリを別に用意していたので、利用側でAny CPUとお任せにしていると食い違ってしまうことがありました。

今日更新したDLLでは、OpenCvSharpのDLLもAny CPUでビルドしました。これで利用側のコードのプラットフォーム設定にOpenCvSharpが合わせてくれるようになります。そのため、ここでの問題はおそらく大丈夫になったと思います。問題があれば、新しいバイナリを試してみてください。

http://code.google.com/p/opencvsharp/

相変わらずx86x64とでパッケージが分けられていますが、これはネイティブ部分を別々に用意する必要があるからです。.NETのDLLはどちらも同じです。

P/Invokeの問題

しかしその先、OpenCVのDLLの呼び出し部分で、別のエラーが起こることがあります。これは大抵、OpenCVのDLLが見つからないか、もしくは呼び出しに失敗しています。

DLLが見つからないときは、とりあえず実行ファイルと同じディレクトリにOpenCVのDLLを全部置いてやれば読み込んでくれます。それでもエラーが消えない場合は、呼び出しの失敗です。原因は十中七八ぐらいで、利用側のコード(.NET)とOpenCVのDLLでの、対象プラットフォームの違いだと思われます。

このプラットフォームの問題はおそらく32ビットOSの人にはあまり発生せず、大抵は64ビットOSの人に関係のある話だと思います。まずは、.NET側とOpenCVがそれぞれ32ビットなのか64ビットなのか確認してください。もし違えば、どちらかに合わせる必要があります。こだわりが無ければ32ビットに合わせた方が楽です。

x64版OpenCvSharpについて

OpenCvSharpのx64版というのは、正確には64ビットOS向けという意味ではなく、64ビットのOpenCV向けという意味です。64ビットOSを利用している人でも、インストーラを使い32ビット版のOpenCVを導入したといった場合は、OpenCvSharpはx86版を利用してください。もしx64版を使うのであれば、CMakeを使いOpenCVも64ビット用にコンパイルしなければいけません。

プラットフォーム設定の変更

64ビットOSを使っている人がx86版のOpenCvSharp(とOpenCV)を使う際は、一つ設定が必要です。Visual Studio 2008では既定でビルド設定が Any CPU になっていますが、これを x86 に変更します。

変更の仕方がわからなければ、英語ですが、以下のページの下の方に書いてあります。スクリーンショットを見れば大体理解できると思います。
http://www.broculos.net/tutorials/badimageformatexception_was_unhandled/20080307/en

Any CPUのままでは実行時にx64としてコンパイルされてしまい、ライブラリ側(x86)と不整合が起きてしまいます。


AccessViolationException が出た場合

OpenCVの関数の呼び出し自体は成功していますが、関数の中でぶっ壊れている、といったところです。これが出ると、.NETからは原因がさっぱりわからないのでただただ絶望するほかありません。

・・・というのでは救いがないのでもう少し書きますと、実は原因のかなりの割合としてラッパー側のミスがあります。ですので、どうしても直らなければ実は私のせいかもしれませんのでお知らせくださるとうれしいです。すみません。

または、引数が「変な」値の場合にも起こることがあります。引数の中身や関数の仕様を要チェック。


直らなかったら

ここのコメントにでも書いて下さると幸いです。それなりに最善を尽くします。

Visual C++ 再頒布可能パッケージ について

一応、Visual C++の再頒布可能パッケージを試してください。結構忘れられています。以下のリンクから、ご自分の環境に合ったものを入れてください。

例えば OpenCV 1.1pre に対しては VC++2005 のものが必要です。ですが、一応全部インストールしておくと良いかも。

もう入れてるよ、という方でも、「SP1」が付いたものを入れたのかどうか確認してください。