OpenCV for iOS
OpenCV 2.2.0をiOS用にビルドしてみた.
参考にしたのは,@niwさんのコードと,このサイト.
ビルドの手順
上のサイトの手順でビルドすると,simulatorとdeviceのふたつのバイナリがビルドされる.
つまり,iOSデバイス用と,シミュレータ用だ.
iOSデバイスは,1年前から,armv6用バイナリだけではなくて,armv7用バイナリもファミリーに加わった.
このため,上記のビルドでは,うまくリンカがopencvのライブラリをバイナリにリンクしてくれないことがある.
また,シミュレータ用とデバイス用に分けてライブラリはビルドされるので,これも問題だ.
このために,Xcodeのプロジェクトに二つもライブラリを読み込まないといけない.これは面倒くさい.
これについては,lipoツールを使えば,ひとつのファイルにまとめられることはこのエントリで述べた.
これらを回避するため,ビルドからライブラリの結合までを自動でやるスクリプトを書いた.
https://github.com/sonsongithub/iOS_OpenCV_build_script
このスクリプトは,armv6/7用のバイナリと,simulator用のバイナリをビルドし,最後にlipoでひとつにまとめて出力するものである.
ソースコードを一式をダウンロードあるいはチェックアウトし,そのフォルダにOpenCV-2.2.0という名前でソースコードを展開し,opencv_ios_build_script.shを実行すれば,自動的にOpenCVのスタティックライブラリのビルドが実行される.
ちなみに,OpenCVには,cmakeというmakefileを作るようなビルドツールが使われているので,もし,インストールされていなければ,インストールしておく.
問題がなければ,そのままさらっとビルドが終わるはずだ.
そうすると,
./build/lib/
./build/include/
この二つのパスにスタティックライブラリと,ヘッダファイルがコピーされているはずである.
これで,OpenCVのスタティックリンクライブラリのビルドは完了である.
このスクリプトを見ると,完全に@niwさんの焼き直しで,車輪の再発明全開なんですが,ライブラリをARMモードかつ,アーキテクチャ混在でビルドできるので,ちょっと違うということで自分を納得させました.
次は,実際にXcodeのプロジェクトでOpenCVをリンクして,OpenCVの実装を使ったアプリケーションを作って見る.
ここで注意しないといけないことを上げておく.
また,
https://github.com/sonsongithub/iOS_OpenCV_build_script
ここにも,サンプルプロジェクトをアップロードしておいたので,そちらを参考にしても構わない.
ただし,何が重要で,何が必要かを考えるためにも,プロジェクトのまんまコピーはお勧めしない.
それでは,ひとつずついきませう.
ライブラリのリンク
まずは,先ほどビルドしたファイルをライブラリに追加しよう.
そして,Accelerate.frameworkもリンクするようにする.どうやら,OpenCVが内部でLAPACKを使っているらしく,それがAccelerate.frameworkに依存するためだ.
ヘッダファイルのパス
次に,OpenCVのヘッダファイルのサーチパスを追加しておく.
これで,
#include <opencv2/module/hoge.h>
のようなインクルードも正しく読み込まれるはず.
ターゲットアーキテクチャの設定
拙作のビルドであれば.問題ないはずだが,OpenCVをarmv6のみ,などで動かす場合は,"Build Active Architecture Only"のフラグを変更する必要がある.
リンカフラグの追加
最後に,追加リンクを設定しておく.
C++とzlibをリンクしておく.
これで一連のビルド作業は完了.
また,OpenCV for iOS関連のことはちょこちょこやっていくかな.