2014年9月23日火曜日

OpenCvSharpExtern.dll' を読み込めないためにMatが利用できない場合の対処法

OpenCVは、歴史的経緯よりIplImageクラスからMatクラスへと利用する流れになっています。Matはピクセル単位のデータアクセスが容易なため、個人的にも積極的に使っていこうと考えています。

Matクラスが使えない場合がある?
先日、OpenCVSharpが使えている環境で、Matクラスを利用すると(インスタンスを生成するだけで)プログラムが
Invokeエラー:OpenCvSharpExtern.dll' を読み込めない(見つからない)
といったエラーを起こしてしまうという事象が起きました。
おさらいですが、OpenCVSharpを使うには、母体であるOpenCVに対して
  • プラットフォーム(32 or 64 bit)を共通にする
  • バージョンを共通にする
といった注意点があるのは周知の事実です。さらに、OpenCvSharpExtern.dllについては

  • プロパティの「出力ディレクトリにコピーをする」

という設定が必要です。

これらを注意し、IplImageを利用したサンプルプログラムの動作を確認しても、Matを使う時にはダメ、、、という意味不明な事象。エラーはInvoke関係のエラーで、エラーメッセージの注意書きにあるように
  • OpenCVのパス確認
  • Visual C++ Redistributable Package(再頒布可能パッケージ)のインストール
  • プラットフォームの一致(32bit or 64bit)
と点に不備があると発生するようです。

Visual C++ 再頒布可能パッケージに罠があった!
で、今回のエラーでは上記条件は全てクリアしており、原因究明に試行錯誤していたのですが、原因はVisual C++ Redistributable Package(再頒布可能パッケージ)にありました。
今回の開発環境はVisual Studio 2010ですので、Visual studio 2010の再頒布可能パッケージをインストールすればいいと思っておりました。。。が、Dependency Walkerで依存ファイルを見てみると
msvcr110.dllがない
ということが発覚。これは、Visual Studio 2012の再頒布可能パッケージに付随するものです。つまり、Visual studio 2010を使っているから2010用の再頒布可能パッケージがあればいいのではないということ。これは盲点でした。早速、、Visual Studio 2012の再頒布可能パッケージをインストールして解決したわけです。

なお、OpenCVSharp系のエラーはDependency Walkerで原因究明しろと作者も述べているのでインストールしておくとよいでしょう。


0 件のコメント:

コメントを投稿