XCode 4.5.2 でOpenCV 2.4.2 を使う

やあみんな元気にしてるかい。風邪は引き始めが肝心だから甘く見るなよ。今日はXCode 4.5.2でOpenCV 2.4.2を軽く使った、OSX上で動くコンソールアプリを作ってみようという自分用メモだよ。とくにここではXCodeでの使い方操作的なことに焦点をあてるものであって、OpenCVはすでに/usr/localの下にインストール済なことを前提にするのであしからず。では早速行ってみようか。

  1. コンソールアプリプロジェクトを作成する
  2. OpenCVヘッダをincludeする
  3. OpenCVライブラリをリンクする
  4. OpenCVのヘッダとライブラリ、それぞれへのサーチパスを設定する
  5. C++ Standard Library を、libstdc++ にする

さてさて、上記1と2については説明は不要だね。文字通りXCodeでコンソールベースのアプリプロジェクトを作成して、その結果できる、main.cpp としては例えば以下のような感じにしておくよ。

#include <iostream>
#include "/usr/local/include/opencv2/opencv.hpp"
#include "/usr/local/include/opencv2/highgui/highgui.hpp"

int main(int argc, const char * argv[])
{
    cv::Mat src_img = cv::imread( argv[1], 1 );
    cv::imshow( "HelloCV", src_img );
    cv::waitKey();
    return 0;
}

このコードがビルドできてかつ動くようにするために、上記、項目3,4,5の操作が必要になってくるというわけだね。ではみていこうか。
OpenCVライブラリをリンクする

まずはリンク。XCodeでは、フレームワークの追加という操作がプロジェクトの設定のBuildPhasesの中の、LinkBinaryWithLibraries というところからできるわけなのだけれども、冒頭に述べたように、/usr/local という、自分で勝手に決めた場所の下にライブラリがインストールされているだけの状態なので、ここのフレームワークのリストの中にはいくら探しても載ってこない。そこでどうするかというと、ここでFinderを起動して、Finderの「移動」メニュー下の「フォルダへ移動‥」というボタンを押すと、移動したいパスを入力するダイアログが出てくるので、それで/usr/local に移動しよう。するとlibの中に、必要なOpenCVのライブラリが当然の如く見つかるので、それをそのままXCodeにドラッグ&ドロップします。ドロップは、XCode画面左側の、Navigator Paneにドロップしてもよいし、あるいは上述のLinkBinaryWithLibraries の矩形領域にドロップしてもよいようだよ。(図を参照)

■ヘッダとライブラリのサーチパスを設定する
これはもう普通に。プロジェクトのBuild Settings の中、Search Paths というチャプターがあるので、その中の、Header Search Paths, Library Search Paths に、それぞれ適切なパス(この場合は /usr/local )を設定しよう。




C++ Standard Library を、libstdc++ にする
さあ来たね。これだよ。プロジェクトの設定の下の方にある、Apple LLVM Compiler 4.1 -Language というチャプターの中の、C++ Standard Library は何を使うかという設定だ。これが、XCodeの4.5あたりから、デフォルトでは、LLVM C++ になってるのでそれをあえて、libstdc++ にしよう。これをやらないと、OpenCVAPIのシンボルが見つからないというリンカーのエラーになってビルドできないよ。これはおじさんの認識としてはOpenCV 2.4.2自体が libstdc++ で構築されているためと思われるよ確証があるわけではないけどな。もっと前のバージョンのXCodeを使っていてOpenCVも使えていたけどビルドできなくなったなんていう場合はこれが原因となってるかも知れないから気をつけてくれ。



さて以上で本日の記事はおしまいだ。無事にプログラムが動いたなら万歳だね。ちょっとOpenCVを使ったプログラムをXCodeでちゃちゃっと作りたいというのがめでたくこれで確立されたわけだね。
(後日記)その後OpenCVのインストールをMacでしてないわけだけれども、libstdc++の問題は、OpenCVのインストール時というかビルド時に、LLVMを使うようなオプションを使えば完全に回避できる可能性がある。OpenCV LLVM でググってみてくれ!