開発のヒホ

iOSとかAndroidとかのアプリを開発するのに四苦八苦するブログ

MATLABでOpenCVを動かすmexopencvの環境構築

MATLABOpenCVを使えるようになるmexを使ったOpenCVのラッパー、mexopencvがあります。 mexopencv - Matlab mex functions for OpenCV

非常に便利なのですが、導入の際に少し手間取ったのでメモを残しておきます。
こちらの環境は MacOSX YosemiteMATLAB 2013a Studentsバージョンです。

homebrewで必要な物をインストール

homebrewに関しては他の記事を参照して下さい。
MacOSX - パッケージ管理システム Homebrew - Qiita

まずhomebrewを更新しておきます。

brew update
brew upgrade

まずpkg-configをインストール。

brew install pkg-config

続いてOpenCVをインストール。

brew tap homebrew/science
brew install opencv

これで必要な物は揃うはずです。

githubからzipをダウンロード

ではmexopencvを導入していきます。
まず下記のGitHubページからzipファイルをダウンロードして展開します。
kyamagu/mexopencv · GitHub

続いてTerminalを開いてmexopencv-masterフォルダに移動し、makeコマンドを実行します。
すると環境によっては以下のエラーが出ます。

make: /usr/local/matlab/bin/mexext: Command not found

MATLABの場所がわかっていないのが原因なので、場所を教えてあげます。
MATLABの場所はMATLAB上でmatlabrootと入力するとわかるみたいです。

make MATLABDIR=/Applications/ [MATLABの場所]

すると、MATLABのバージョンによってはこんなエラーが出るかと思います。

xcodebuild: error: SDK "macosx10.7" cannot be located.

持ってるMATLABが知っているxcodeのバージョンと実際のxcodeのバージョンが合わないのが原因らしいです。
下記サイトを参考にすると、mexopts.shを変更する必要があるとのこと。
Can I use Xcode 5 as my C or C++ compiler in MATLAB 8.1 (R2013a) or MATLAB 8.2 (R2013b)? - MATLAB Answers - MATLAB Central

mexopts.shを編集します。MATLAB上で以下のコマンドを実行します。

cd( [matlabroot '/bin'] )

左のファイル一覧に出てくるmexopts.shを開いて、10.7をすべて10.10に変更して保存します。readonlyですがoverwriteで上書きします。
(10.10の値はMacのバージョンに合わせます。Yosemiteなら10.10です。Macのバージョンは画面一番左上のアップルマークこのMacについてで確認可能です)

最後にMATLAB上で

mex -setup

を実行します。The options files available for mex are:と聞かれるので1と入力してエンターを押して変更完了です。念のためMATLABを閉じておきます。

再度Terminalを開いて、makeしなおして5分ぐらい待って導入は完了です。

make MATLABDIR=/Applications/ [MATLABの場所]

動かしてみる

MATLABを起動して、忘れないうちににmexopencvをaddしておきます。

addpath( [mexopencvの場所] );

続いてmexopencvディレクトリに有るsamplesフォルダ内のSURF_detectorを開いて実行してみます。
するとこんなエラーが表示されました。

Invalid MEX-file
--略--
/usr/local/lib/libtiff.5.dylib
  Referenced from:
  /usr/local/lib/libopencv_highgui.2.4.dylib
  Reason: Incompatible library version:
  libopencv_highgui.2.4.dylib requires
  version 8.0.0 or later, but libtiff.5.dylib
  provides version 6.0.0

どうやらMATLABが持つライブラリとOpenCVが使おうとするライブラリのバージョンが異なるようです。公式で紹介されている通り、MATLABOpenCVを使う場合はTerminalで以下のようにライブラリの使用方法を指定してMATLABを起動する必要があるとのこと。

DYLD_INSERT_LIBRARIES=/usr/local/lib/libtiff.5.dylib /Applications/[MATLAB.app]/bin/matlab &

これで動くようになると思います。