XcodeでOpenCV開発

気がつけば2600PV。これからも皆様の役に立つブログでありたい。

さて。先日の日記の通り、Xcodeを使ってOpenCVプログラミングブック (奈良先端科学技術大学 OpenCV プログラミングブック作成チーム 著)に掲載されているソースコードのビルド、実行をやっていきたいと思います。

以下、その手順。

まず、Xcodeを起動しましょう。

/Developer/Applications/Xcode.app

にあります。
そして、新規プロジェクトを作成します。
とりあえずコマンドラインのアプリケーションを作るという方向で行くことにします。
Command Line Utility の、C++ Tool を選択して「次へ」をクリック。

次にプロジェクトの名前を設定。ここは自由に。私は「OpenCVTest」としました。
プロジェクト名を入れ終わったら「次へ」をクリック。

これでプロジェクトが生成されました。
次に、プロジェクトの設定を編集します。
プロジェクト-プロジェクト設定の編集 をクリックします。

表示されたプロジェクトの情報ウィンドウの"構成"タブをクリックします。

ここで構成リストを編集しましょう。
Xcodeは通常、IntelPowerPCの両方で使えるユニバーサルバイナリの実行ファイルを作ろうとします。
ですが、私がインストールしたOpenCVライブラリは、Intel用にコンパイルされており、それによって作られるリンクライブラリはIntelプロセッサ向けのものです。
そのため、通常の設定だと「PPCでは動かない」という理由でビルドが失敗します。それに対応するため、Intelプラットフォーム用の新しい構成を作ります。

"Release"という構成を複製して、"Release(Intel)"とします。
その後、一番下の"デフォルトの構成"を変更して"Release(Intel)"に変更しましょう。

次に"ビルド"タブをクリックします。
ここの"構成"を"Release(Intel)"にした後、"有効なアーキテクチャ"を編集します。

"有効なアーキテクチャ"をダブルクリックすると編集用の窓が現れます。
PowerPC関連の項目をクリックして、リストの下にある"-"ボタンを押してリストから削除します。削除が完了したら「OK」をクリック。

これで、Intel CPU向けのアプリケーションが作れるようになりました。
次に、検索パスを追加します。

ヘッダファイルとライブラリの検索パスを以下のように追加します。

(注意 最初私が参考にしたウェブページには /sw/include/opencv と /sw/lib を使うように指示していました。しかし、/sw/include/opencv は存在しなかったため、別なところを探し、/usr/local/include/opencv を見つけました。OpenCVのインストール時の設定で変わる可能性がありそうです。)

検索パスの追加が完了したらプロジェクト設定の編集は終了です。
次に、アプリケーションが使うリンクライブラリを探して、追加します。

私の環境の場合、リンクライブラリは /usr/local/lib/ にあります。ですが、本来 /usr 下は不過視となっているので、Finderからはこのディレクトリにアクセスできません。
ですので、ターミナルを起動して

$ open /usr/local/lib/ 

と入力して強引に開くことにしました。

開いた先にあるリンクライブラリを、Xcodeのプロジェクトディレクトリ(main.cppや*.xcodeprojなどがあるディレクトリ)の中にコピーします。

コピーが終わったら、プロジェクトの"詳細"ウィンドウ(プロジェクトの名前がついているウィンドウ)の"追加"-"既存のファイル..."をクリックします。

先ほどコピーしたリンクライブラリファイルを選択し、「OK」をクリックします。

必要に応じて設定を変更し(ここでは特に何かする必要はない)、「OK」をクリックします。

これで、OpenCVのプログラムをビルドおよび実行する準備が整いました。
先の本のサンプルプログラムを、main.cpp にコピーしてビルドしてみましょう。

なお、私の環境(MacBook Pro 15" 2.16GHz、MacOS X 10.5.1 Leopard)では

cvCreateCameraCapture( -1 ) 

だとカメラを検出できませんでした。
ですので、

cvCaptureFromCAM( 1 ) 

を使っています。


OpenCV プログラミングブック の2-3、背景差分をとるプログラムを実行してみたところ。

背景差分の画像が上下反転しているのは、cvCvtColor()のバグらしい、という話です。