OpenCV 3.x のインストール方法(Mac OS X)
スポンサーリンク
O'Reilly Mediaの半額セールでOpenCV 3の本を購入したので OpenCVの環境構築についてメモ。
購入したのはEarly-Release版*1です(英語)。年内には読み終わりたいです。
書籍の正式リリースは2016年11月の模様。
Amazon(予約受付中):Learning Opencv 3: Computer Vision in C++ With the Opencv Library
一時期Amazon.co.jp側は発売中になっていましたが、間違いだったようです。
調べた範囲では、下記の3通りのアプローチがある。なお、iOSはCocoaPods経由で3.0がインストールできる模様。
- Homebrew でインストールする(共用ライブラリとして)
- CmakeでMakefileを作成してビルド(GUI/CLI)
- 付属のPythonスクリプトでframework形式のライブラリとしてビルド(内部ではCMakeが利用される)
方法1. はHomebrewさえセットアップしていれば最も簡単なようだが、いろいろとライブラリがセットでインストールされる。Linux環境向けのバイナリに近いものができるように見える。
方法2. についてはCMakeに-G Xcode
オプションを指定してXcode用のプロジェクト形式で出力させればXcodeのGUIからビルドすることもできる。有効にするモジュールをカスタマイズするには一番良さそう。
方法3.はframework形式でビルドされるのでmake install
しなくて済むのと、作成した(macOS向けの)ソフトウェアとOpenCVライブラリを一緒に配布する場合はを3.一番確実。難点はライブラリのバージョン管理。
macOS用のアプリを配布する可能性を考慮に入れて、3. の方法でインストール。よって3. のみ記載。C++またはObjective-Cから利用する前提です。
Xcode 7 + OpenCV 3.1 の組み合わせで試しました。MacBook Airのカメラから画像を取り込むサンプルが動くことは確認しています。逆に言うと他はまだ未検証です。あしからず。
参考:Introduction to Framework Programming Guide
準備(共通)
必要なファイルをダウンロードする。
OpenCV 本体
VERSION 2.4.X ではなくVERSION 3.Xの箇所からダウンロードする。
DOWNLOADS | OpenCV からVERSION 3.1 のところにある"OpenCV for Linux/Mac"
opencv_contrib
特許などライセンスの関係で本体に統合されていないライブラリ、または十分にテストされていない新機能など公式パッケージに含まれないモジュールはopencv_contrib
として提供されています。これらのモジュールを利用する場合は別途ダウンロードしてビルド時に組み込む必要があります。
3.1向けの配布パッケージはframework形式でビルドするとエラーになるのでGitHubから修正版を別途入手(後述)。
CMake
XcodeとCommand Line Tools はインストール済みとして、CMake
をインストールする。Homebrewからインストールするか、公式サイトからダウンロードしてGUI版をインストールしてもいい。
- Hombebrew
- GUI インストールパッケージ
$ which cmake
下記のいずれかの結果が帰ってこればOK。CMake はインストール済みなのでことの次の手順は不要。
Homebrewでインストールした場合。
/usr/local/bin/cmake
あるいは
/Applications/CMake.app/Contents/bin/cmake
(a.) CMake をHomobrewでインストールする。
XcodeのセットアップとHomebrewのインストールはすでに完了している前提。
$ brew install cmake
(b.) GUIのインストーラを使用する
CMake のGUIフロントエンド(make-gui)が欲しい場合はこっち。
Cmakeの配布サイトからダウンロードしてインストールした場合は/Applications/CMake.app/Contents/bin/
にパスを通す必要がある。
Downloadサイト:Download | CMake
Platformのセクションから"make-バージョン番号-Darwin-x86_64.dmg"という名前のファイルをダウンロードする。あとは通常のdmg形式のソフトウェアと同様。
各環境のシェルの設定ファイル((macOSのデフォルトは.profile
。ただし、.bash_profile
が存在する場合は読み込まれない。))に以下を追加。
export PATH="$PATH:/Applications/CMake.app/Contents/bin"
環境変数を有効にするために、設定ファイルを再読み込みさせるか、端末エミュレーターを別途起動する。あるいは実行中のシェルで上記のコマンド実行して一時的にパスを追加しても問題ない。
Python スクリプトによる framework 形式のビルド
contrib を無効にしてビルドする場合
$ mkdir work $ cd work $ unzip opencv-3.1.0.zip $ unzip opencv_contrib-3.1.0.zip $ mkdir -p libs/macOS
$ ls libs opencv_contrib-3.1.0 opencv-3.1.0 opencv_contrib-3.1.0.zip opencv-3.1.0.zip
ビルドスクリプトはPython 2.x 用なので、環境に応じてpython
またはpython2.7
コマンドとして明示的に2.xを使用する。
$ python2.7 platforms/osx/build_framework.py --opencv opencv-3.1.0 libs/macOS
最後に以下のようなメッセージが出力され、直後の終了ステータスが"0"なら成功。
Executing: ['lipo', '-create', '/Users/atuyosi/workspace/openCV/3.1/libs/macOS/build/x86_64-MacOSX/lib/Release/libopencv_merged.a', '-o', '/Users/atuyosi/workspace/openCV/3.1/libs/macOS/opencv2.framework/Versions/A/opencv2'] in None
念のため。
$ echo $? 0
作業ディレクトリ配下にopencv2.framework
が作成されているので、これをXcodeのプロジェクトにドラッグアンドドロップして追加すればいい。
$ ls libs/macOS/ build opencv2.framework
contrib を有効にしてビルドする場合
上記と同じ要領で、オプションに--contrib 展開した'opencv_contrib'のソースのパス
を追加すれば良い。ただし、バージョン3.1用にリリースされたースアーカイブではビルド用のCMakeの設定ファイルに不備があるためframework形式でビルドしようとすると失敗する。GitHubには修正がまーじされているのでこちらを利用する。
まずは、バグ修正済みのリビジョンのコードをGitHubから入手する。
$ git clone https://github.com/opencv/opencv_contrib.git $ cd opencv_contrib
最新の開発版ではOpenCV本体も最新版することになるので、本体側と同じバージョン 3.1に最も近いバグ修正済みのリビジョンに切り替え。
$ git checkout 5fe21e4
あるいはgit checkout tags/3.1.0
としてからgit cherry-pick 5fe21e4
とする方がいいかもしれません。
やや面倒な手順になるが、バージョン3.1のソースアーカイブを入手し、下記を参照して該当ファイルだけ修正してもOK(修正対象は4ファイル)。
cmake: fix build on MacOSX by alalek · Pull Request #530 · opencv/opencv_contrib · GitHub
$ mkdir -p libs/macOS_with_contrib $ python2.7 opencv-3.1.0/platforms/osx/build_framework.py --opencv opencv-3.1.0 --contrib opencv_contrib-3.1.0 libs/macOS_with_contrib
私の環境はminicondaでPython 3.5 系がインストールしてあるのでpython2.7
を指定してます。
上記の例だと、libs配下のディレクトリにopencv2.framework
が生成される。
meldという差分比較ツールでcontrib 無効と有効で生成されたopencv2.framework
の差分を取っとみました。
左側がcontrib
無効で右側が有効です。左側のペインでグレーになっているのは存在しないディレクトリ(フォルダ)。
ヘッダだけでなくライブラリの本体のサイズはそれぞれ、97.5MBと111MB。contrib
側固有のモジュールはまだ試していませんが、framework形式としては問題なさそう。
ビルドに失敗した場合
エラーが発生する場合はソースファイルの位置、CMake にパスが通っているか、Python のバージョン(python --version
と実行)を確認してください。
出力先ディレクトリ配下のbuild
というディレクトリに一時ファイルと設定ファイルが残るので、原因を特定したらこれらを除去したうえで再度スクリプトを実行してください。
同じエラーで失敗する確率が高いです。
make clean
相当の処理が定義されていれば別ですが、よくわかりませんでした。
iOS
ついでに書いておくとiOSの場合はは下記の方法で利用できる。
最後の選択肢の場合は、ソースアーカイブのplatforms/ios/build_framework.py
を使用する(同じ要領)。
カスタマイズ
macOS(OSX)向けのビルドスクリプトは内部でiOS向けのスクリプトを読み込んでいるBuilder
クラスを継承する仕組みになっている。iOS用のスクリプトを直接いじるか、
getCMakeArgs
をオーバーライドしてやればいいはず(未検証)。
Xcodeからの利用
出来上がったopencv2.framework
をXcodeで作成したプロジェクトのNavigation pane にドラッグアンドドロップする。
プロジェクトの"Build Phase"で"Link Binary with Libraries"でで他のframeworkも追加する。
利用する機能によっては他のframeworkが必要になる場合がある。
その他
XcodeでCLIツールを作る場合、実行時に引数を与えたい場合がある。そういう場合、XcodeではEdit Scheme からコマンドライン引数を指定することができる。
まとめ
サンプルを動かすとMac本体のカメラから撮影された眠そうな自分の画像が画面いっぱいに大写しに……。なんとも表現しがたい複雑な気分です。
何か気がついたことがあれば後で追記する予定。間違いなくXcode 8用にビルドし直すはずなので。
とりあえずここまで。
参考URL
- opencv2.framework(for Mac OS X)生成方法 · atinfinity/lab Wiki · GitHub%E7%94%9F%E6%88%90%E6%96%B9%E6%B3%95)
- OpenCV 3.1をOS Xで使う|風のさざめき|note