OpenCV 2.0.0a + Mac OSX 10.6 Snow Leopard インストール

ARToolkitが流行ったころ、OpenGL + OpenCV で何か出来ないかとダウンロードしてきて触った OpenCV 1.1 はもう昔、気づいたら OpenCV 2.0 なんてものが出ていました。インストールを試みるも、Snow Leopardとの相性が悪いらしく、iSightを始めとした各種機能の実装に使われているCarbonが32bitなことなどが原因でうまくいきません。
リリースはもう2ヶ月ほど前なので情報があるだろうと思いましたがあまりなかったので、成功した方法を書き留めておきます。今回紹介する方法はXcodeを用いてコンパイルを行う方法です。



参考
http://opencv.willowgarage.com/wiki/Mac_OS_X_OpenCV_Port
http://d.hatena.ne.jp/suikyo/20091105/p1
http://taxpon.com/?p=383
http://d.hatena.ne.jp/Yamagutsu/20091115/

1. OpenCVソースコードをダウンロードします

OpenCVのウェブサイトからもダウンロードできますが、今回はリポジトリから取ってきました。

$ svn co https://opencvlibrary.svn.sourceforge.net/svnroot/opencvlibrary/trunk opencv

Subversionをインストールしていない場合は

$ sudo port install subversion

2. チェックアウトしている間に必要なライブラリをインストールします

$ sudo port install pkgconfig
$ sudo port install jpeg libpng tiff

それから、pkgconfigのパスを通しておきます。

$ export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/

各シェルの.rcファイルに書き込んでおくと良いです。


3. 今回の肝の "CMake" をインストールします

cmakeはMacPortsでもインストールできますが、それではうまくいかないようなのでdmg版をダウンロードしてきます。

http://www.cmake.org/cmake/resources/software.html

ここの「Mac OSX Universal (.dmg installer for Tiger or later) cmake-2.6.4-Darwin-universal.dmg」をダウンロードします。
インストールをポチポチと進めると "/Applications" に "CMake 2.8-0" がインストールされるはずです。


4. チェックアウトが終わったらCMakeを使います

CMakeを起動すると下のような画面が出てきます。その "Where is the source code" と "Where to build the binaries" を、チェックアウトした "opencv/opencv" にどちらもセットします。



※画像では "trunk/opencv" となっていますがお気になさらずに

セットし終えたら "Configure" ボタンを押します。すると下のような赤いリストが表示されます。ここでオプションを以下のように変更します。

BUILD_NEW_PYTHON_SUPPORT=OFF
ENABLE_OPENMP=ON

変更し終えたら再度 "Configure" を押して少し待つと "Generate" が押せるようになるので、押してまた少し待つと成功を告げるメッセージが表示されるはずです。
成功したら "opencv/opencv" 直下に "OpenCV.xcodeproj" ファイルが生成されているはずです。


5. XCodeコンパイルを行います

生成されたxcodeprojファイルを開くとXCodeが起動します。このままコンパイルを行っても失敗してしまうので、コンパイル設定を以下のように変更します。

アクティブな構成=Release
アクティブアーキテクチャ=i386


変更したらあとは ⌘B でビルドを実行します。


6. サンプルコードを動かしてみる

これで完了…なんですが、これだけでは本当にインストールが完了したのかわからないのでサンプルコードを動かしてみます。そのためにはいくつかやらなくてはならないことがあります。

6.1. 必要なファイルのパスを通す

パスを通す、というかコピーします。この部分に関しては情報がなかったため、もしかしたらかなりの力技かもしれない、ということを予めご了承ください。
必要なファイルは結構あります。

"opencv/opencv/unix-install/opencv.pc" を "/usr/local/lib/pkgconfig" にコピーする
"opencv/opencv/lib" 以下のファイルを "/usr/local/lib" にコピーする
"opencv/opencv/include/opencv" 以下のファイルを "/usr/local/include" にコピーする

6.2. build_all.sh を修正する

"opencv/opencv/samples/c" のサンプルを動作させてみます。が、コンパイルをしてくれる "build_all.sh" は対象とするコンパイラのバージョンが古いらしくそのままでは動きません。ですので以下のように修正します。修正の内容は http://d.hatena.ne.jp/Yamagutsu/20091115/ で見つけました。 id:Yamagutsu 氏に感謝。ありがとうございます。

# 10行目を
# gcc -ggdb `pkg-config --cflags opencv` -o `basename $i .c` $i `pkg-config --libs opencv`;
gcc-4.0 -ggdb `pkg-config --cflags opencv` -o `basename $i .c` $i `pkg-config --libs opencv`;

# 14行目を
# g++ -ggdb `pkg-config --cflags opencv` -o `basename $i .cpp` $i `pkg-config --libs opencv`;
g++-4.0 -ggdb `pkg-config --cflags opencv` -o `basename $i .cpp` $i `pkg-config --libs opencv`;
6.3. 修正を行ったらいざ実行
$ sh build_all.sh

ちゃんと出来ているようなら

$ ./calibration

などとして遊んでみてください。



7. OpenCV.framework の作成

XCodeOpenCVを扱う場合にはframework形式であることが好ましいです。通常、frameworkファイルを作成するのは結構めんどうですが、OpenCVはこれまたシェルスクリプトを用意してくれています。
"opencv/opencv/samples/MacOSX/FaceTracker/Readme.txt" に

Building the OpenCV.framework:
In the main directory of the opencv distribution, you will find a shell script called
'make_frameworks.sh' that does all of the typical unixy './configure && make' stuff required
to build a universal binary framework. Invoke this script from Terminal.app, wait some minutes
and you are done.

と書いてました。正直分かり辛い場所ですよね。ここ。


言われるままに "opencv/opencv" 直下で

$ sh make_frameworks.sh

とすると、CPUファンが唸りを上げてframeworkファイル(ディレクトリ)を生成してくれます。


"opencv/opencv" 直下に "OpenCV.framework" が生成されるので、それを適当な場所、"/Library/Framework" にコピーしておくといいでしょう。
試しに "opencv/opencv/samples/MaxOSX/FaceTracker/FaceTracker.xcodeproj" を開いてみます。
既に "OpenCV.framework" が追加されていますが相対パスで指定されていて気持ちが悪いので "/Library/Frameworks" にコピーしたものを使います。
Xcodeの左側の「グループとファイル」の "Frameworks" を右クリックして「追加 > 既存のフレームワーク」を選択して、あとは一覧に追加された "OpenCV" を選択するだけです。

ビルドを行う際には、ビルドの設定がデフォルトでは 10.4になっているらしく、ビルドしようとすると「そんなものはない」と言われてしまうので、左上の「概要」から「アクティブSDK」を "10.6" にしてビルドしてみてください。



うまくいきましたか?

では。