読者です 読者をやめる 読者になる 読者になる

OpenCV 3.x のインストール方法(Mac OS X)

O'Reilly Mediaの半額セールOpenCV 3の本を購入したので OpenCVの環境構築についてメモ。

購入したのはEarly-Release版*1です(英語)。年内には読み終わりたいです。

shop.oreilly.com

書籍の正式リリースは2016年11月の模様。

Amazon(予約受付中):Learning Opencv 3: Computer Vision in C++ With the Opencv Library

一時期Amazon.co.jp側は発売中になっていましたが、間違いだったようです。

調べた範囲では、下記の3通りのアプローチがある。なお、iOSはCocoaPods経由で3.0がインストールできる模様。

  1. Homebrew でインストールする(共用ライブラリとして)
  2. CmakeでMakefileを作成してビルド(GUI/CLI
  3. 付属のPythonスクリプトでframework形式のライブラリとしてビルド(内部ではCMakeが利用される)

方法1. はHomebrewさえセットアップしていれば最も簡単なようだが、いろいろとライブラリがセットでインストールされる。Linux環境向けのバイナリに近いものができるように見える。

方法2. についてはCMakeに-G Xcodeオプションを指定してXcode用のプロジェクト形式で出力させればXcodeGUIからビルドすることもできる。有効にするモジュールをカスタマイズするには一番良さそう。

方法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"

f:id:atuyosi:20160904112037p:plain

opencv_contrib

特許などライセンスの関係で本体に統合されていないライブラリ、または十分にテストされていない新機能など公式パッケージに含まれないモジュールはopencv_contribとして提供されています。これらのモジュールを利用する場合は別途ダウンロードしてビルド時に組み込む必要があります。

3.1向けの配布パッケージはframework形式でビルドするとエラーになるのでGitHubから修正版を別途入手(後述)。

CMake

XcodeとCommand Line Tools はインストール済みとして、CMakeをインストールする。Homebrewからインストールするか、公式サイトからダウンロードしてGUI版をインストールしてもいい。

  1. Hombebrew
  2. 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の差分を取っとみました。

f:id:atuyosi:20160905031200j:plain

左側がcontrib無効で右側が有効です。左側のペインでグレーになっているのは存在しないディレクトリ(フォルダ)。

ヘッダだけでなくライブラリの本体のサイズはそれぞれ、97.5MBと111MB。contrib側固有のモジュールはまだ試していませんが、framework形式としては問題なさそう。

f:id:atuyosi:20160905031034p:plain

ビルドに失敗した場合

エラーが発生する場合はソースファイルの位置、CMake にパスが通っているか、Python のバージョン(python --versionと実行)を確認してください。

出力先ディレクトリ配下のbuildというディレクトリに一時ファイルと設定ファイルが残るので、原因を特定したらこれらを除去したうえで再度スクリプトを実行してください。 同じエラーで失敗する確率が高いです。

make clean相当の処理が定義されていれば別ですが、よくわかりませんでした。

iOS

ついでに書いておくとiOSの場合はは下記の方法で利用できる。

  • CocoaPods でバージョン 3.0を利用する
  • ビルド済みのopencv2.frameworkをダウンロードする
  • Pythonのビルドスクリプトを使用してビルドする

最後の選択肢の場合は、ソースアーカイブplatforms/ios/build_framework.pyを使用する(同じ要領)。

カスタマイズ

macOS(OSX)向けのビルドスクリプトは内部でiOS向けのスクリプトを読み込んでいるBuilderクラスを継承する仕組みになっている。iOS用のスクリプトを直接いじるか、 getCMakeArgsをオーバーライドしてやればいいはず(未検証)。

Xcodeからの利用

出来上がったopencv2.frameworkXcodeで作成したプロジェクトのNavigation pane にドラッグアンドドロップする。

プロジェクトの"Build Phase"で"Link Binary with Libraries"でで他のframeworkも追加する。

f:id:atuyosi:20160701012157p:plain

  • CoreVideo.framework
  • QTKit.framework
  • Cocoa.framework
  • OpenCL.framework

利用する機能によっては他のframeworkが必要になる場合がある。

その他

XcodeCLIツールを作る場合、実行時に引数を与えたい場合がある。そういう場合、XcodeではEdit Scheme からコマンドライン引数を指定することができる。

f:id:atuyosi:20160701012247p:plain

まとめ

サンプルを動かすとMac本体のカメラから撮影された眠そうな自分の画像が画面いっぱいに大写しに……。なんとも表現しがたい複雑な気分です。

何か気がついたことがあれば後で追記する予定。間違いなくXcode 8用にビルドし直すはずなので。


とりあえずここまで。

参考URL

*1:執筆中の原稿を電子書籍版として提供するもの。執筆の進行に伴ってアップデート版が提供される。