iPhoneでOpenCV(2.2以降)を使う

以前も同じ内容を書いたのですが、OpenCVの開発は大変活発で最新版を使おうと思ったら色々つまずいたので再度エントリを書いておきます。前回はniwさんのエントリをなぞっただけだったので、今回は自力でライブラリのビルドをしました。手元の環境はSnowLeopard + iOS4.2 + OpenCVのリポジトリヘッド(2.2以降)です。

まずOpenCVは正式にiOSをサポートしていません。(androidはしてるんですが。)iOS環境では一部の機能を使えないため、使える部分を切り出してビルドするというのがiPhoneでOpenCVを使うということです。使える部分を切り出してビルドをする為のスクリプトがniwさんの記事などで紹介されているのですが、構成が変わる度に他の人に頼るのはどうかという事で自力でビルドしてみようと思いました。

ライブラリの生成手順は以下になります。

  1. CMakeを使ってXcodeのプロジェクトファイルを生成
  2. 1で生成したXcodeからiOSではビルドできない部分を削除
  3. Xcodeでビルドしてライブラリを生成

順に見ていきます。

1. CMakeを使ってXcodeのプロジェクトファイルを生成
OpenCVではビルドにCMakeを利用しています。CMakeはプラットフォームごとにビルド環境を生成するツールで、mac上であればMakefileやXcodeプロジェクト、Eclipseプロジェクトなどが選べます。ここではXcodeプロジェクトを使う事にします。CMakeにはCUIとGUIのインターフェースが用意されていますが、慣れていない人はGUIをインストールするのが良いと思います。ココからdmgファイルを落とせます。

さてCMakeを使ってXcodeプロジェクトを生成する前に、パスの確認をしておきます。ここでは/usr/local/src以下にopencv_rootというディレクトリを作成し、ソースやビルド用のディレクトリをその下に置くものとします。

$ cd /usr/local/src
$ mkdir opencv_root
$ cd opencv_root
$ svn co https://code.ros.org/svn/opencv/trunk/opencv    # 最新コードをチェックアウト
$ mkdir install
$ mkdir build
$ tree -L 1                                                              
  ├── build     # ビルド用のディレクトリ (Xcodeのプロジェクトが出力される)
  ├── install   # インストール用のディレクトリ (ライブラリやヘッダファイルが出力される)
  └── opencv    # opencvのリポジトリHEAD

上記ディレクトリを作成したらインストールしたCMakeを起動します。まずソースコードへのパスとビルドディレクトリを指定して「Configure」を押しましょう。ウィザードが起動するのでXcodeを選択します。

cmake_for_opencv
cmake_for_opencv
cmake_wizard
cmake_wizard

以上で指定したbuildディレクトリに必要なファイルが出力されます。ここでいくつかiPhone用にビルドするために以下の設定を行います。

BUILD_SHARED_LIBS = NO
BUILD_NEW_PYTHON_SUPPORT = NO
BUILD_EXAMPLES = NO
BUILD_TESTS = NO
ENABLE_SSE = NO
ENABLE_SSE2 = NO
WITH_EIGEN2 = NO
WITH_PVAPI = NO
WITH_OPENEXR = NO
WITH_QT = NO
WITH_QUICKTIME = NO
CMAKE_INSTALL_PREFIX = /usr/local/src/opencv_root/install

設定を入力したら、再度Configureを押し、続いてGenerateを押下します。これでビルドディレクトリにXcodeのプロジェクトが生成されます。

2. 1で生成したXcodeからiOSではビルドできない部分を削除
生成したXcodeプロジェクトを開いたら、まずベースSDKをiOSに設定して再起動します。次にiOSでは使用できない以下のターゲットを削除しましょう。基本的にはhighguiモジュールと、highguiに依存しているターゲットを削除します。手元では削除する際にXcodeの内部エラーが何度か表示されたのですがすべて無視しました。

opencv_highgui
opencv_createsamples
opencv_haartraining
opencv_performance
opencv_traincascade

3. Xcodeでビルドしてライブラリを生成
2で設定したXcodeプロジェクトで通常通りビルドを行います。ライブラリ、Debug構成の場合opencv本体のライブラリがlib/Debug以下、opencvが依存しているサードパーティのライブラリ群が3rdparty/lib/Debug以下にそれぞれ出力されます。ここで注意したいのは出力先が現在のアーキテクチャの設定に関わらず上記の場所にライブラリが出力される事です。シミュレータ用とデバイス用の両方をビルドするには出力ファイルを一旦別の場所に移しておく必要があります。

ちなみにビルド後は以下のライブラリ群が出力されます。2.2から機能ごとにライブラリが分かれたようです。必要に応じてライブラリを選んでリンクしましょう。

$ find .                                                                                                                                  .
./libopencv_calib3d.a
./libopencv_contrib.a
./libopencv_core.a
./libopencv_features2d.a
./libopencv_flann.a
./libopencv_gpu.a
./libopencv_haartraining_engine.a
./libopencv_imgproc.a
./libopencv_legacy.a
./libopencv_ml.a
./libopencv_objdetect.a
./libopencv_video.a

ビルドが完了したらinstallターゲットをビルドして、ライブラリのヘッダファイルを1で用意したinstallディレクトリにコピーします。この際にXcodeプロジェクトのディレクトリ以下にあるmodules/cmake_install.cmakeファイルを編集する必要があります。2で削除したターゲットをコメントアウトしています。これでヘッダファイルがinstallディレクトリに配置されます。

IF(NOT CMAKE_INSTALL_LOCAL_ONLY)
  # Include the install script for each subdirectory.
  INCLUDE("/usr/local/src/opencvlib/opencv/build/modules/calib3d/cmake_install.cmake")
  INCLUDE("/usr/local/src/opencvlib/opencv/build/modules/core/cmake_install.cmake")
  INCLUDE("/usr/local/src/opencvlib/opencv/build/modules/features2d/cmake_install.cmake")
  INCLUDE("/usr/local/src/opencvlib/opencv/build/modules/flann/cmake_install.cmake")
#  INCLUDE("/usr/local/src/opencvlib/opencv/build/modules/gtest/cmake_install.cmake")
#  INCLUDE("/usr/local/src/opencvlib/opencv/build/modules/highgui/cmake_install.cmake")
  INCLUDE("/usr/local/src/opencvlib/opencv/build/modules/imgproc/cmake_install.cmake")
  INCLUDE("/usr/local/src/opencvlib/opencv/build/modules/legacy/cmake_install.cmake")
  INCLUDE("/usr/local/src/opencvlib/opencv/build/modules/contrib/cmake_install.cmake")
  INCLUDE("/usr/local/src/opencvlib/opencv/build/modules/ml/cmake_install.cmake")
  INCLUDE("/usr/local/src/opencvlib/opencv/build/modules/objdetect/cmake_install.cmake")
  INCLUDE("/usr/local/src/opencvlib/opencv/build/modules/video/cmake_install.cmake")
#  INCLUDE("/usr/local/src/opencvlib/opencv/build/modules/haartraining/cmake_install.cmake")
#  INCLUDE("/usr/local/src/opencvlib/opencv/build/modules/traincascade/cmake_install.cmake")
  INCLUDE("/usr/local/src/opencvlib/opencv/build/modules/gpu/cmake_install.cmake")

以上でiPhone上でOpenCVを使う準備が整いました。Xcode上でhighguiを削除すればよいので、基本的にはプロジェクトの構成が変わっても対応できると思います。あとは前回のエントリと同様の手順で自分のプロジェクトにopencvライブラリをリンクすればOKです。

1個画像処理なアプリを作りたいんですけどなかなか腰が重いです。。。

3 thoughts on “iPhoneでOpenCV(2.2以降)を使う”

  1. OpenCVをiPhoneで使いたいと思い参考にさせていただきました
    一部うまくいかない部分があったので質問させていただいた次第です

    プロジェクトをビルドするところまでは問題なかったのですが
    最後の install ターゲットをビルドを行っても ただ成功と出るだけで
    installフォルダには何も存在しないのですが手動でコピーするのでしょうか?

Leave a Reply

Your email address will not be published. Required fields are marked *