経緯:openCVのTracking API(Tracker.hpp)で物体追跡をしたい
ただ標準のopencv2.frameworkではそのようなヘッダファイルが存在しないため、
新たにopencv_contribで管理されているextra modules込みでビルドする必要があります。
今回はそのビルド方法と備忘録です。
▼ 開発環境
Xcode 8.3.3
openCV 3.1
ビルド方法
opencv3.1よりcontribコマンドが正式対応したため比較的簡単にビルドすることができました。
以下、その手順となります。
1. OpenCV 3.1のコードを取得して展開する.
(https://github.com/opencv/opencv/releases/tag/3.1.0)
2. opencv_contrib-3.1.0のコードを取得して展開する.
(https://github.com/opencv/opencv_contrib/releases/tag/3.1.0)
3. 作業フォルダで以下コマンド実行。
1 |
python ./opencv-3.1.0/platforms/ios/build_framework.py ios --contrib ./opencv_contrib-3.1.0 |
ビルドが完了するとiosディレクトリにopencv2.framework(opencv_contribあり)が生成されます.
(結構時間かかります。)
詰まった点
よし生成された!意気揚々と実際のiOSアプリに組み込んで実行してみると、エラーが。。
Undefined symbols for architecture arm64:
“_png_init_filter_functions_neon”, referenced from:
_png_read_filter_row in opencv2(pngrutil.o)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
調べてみるとmasterブランチと他のブランチではbuild_framework.pyが違うことが原因でした。
以下の部分を、
1 2 |
if arch.startswith("armv"): cmakecmd.append("-DENABLE_NEON=ON") |
このように修正し再度ビルドコマンド実行すると、xcodeのビルドも正常に無事通りました。
1 2 |
if arch.startswith("armv") or arch.startswith("arm64"): cmakecmd.append("-DENABLE_NEON=ON") |
最後に
openCV3.2でビルドするとTracking APIのモジュール群が含まれないという不具合があったため、今回はopenCV3.1で試してみましたが、詳しく調べてみるとmasterブランチだと一部モジュールが含まれないままビルドされる事象も解消されているらいしいです。
おまけ
TrackingAPIには、KCF / TLD / MEDIANFLOW / BOOSTING / MILのトラッキングアルゴリズムが用意されていますが、KCF/TLDが比較的安定してトラッキングできている印象でした。またTrackingAPIのトラッキング手法は識別器を学習しながら追跡するため、学習が成熟する前に対象となる物体を画面から外したりすると間違った学習データで学習されしまいます。結果、識別器の精度が格段に下がり、トラッキングの精度に影響を与えてしまいます。リアルタイムの風景動画から対象となる物体を指定し、追跡することは比較的不向きな気がしました。
ちなみにですが、openCV3.2よりトラッキングアルゴリズムに「GOTURN」が追加されていました。
Convolutional Neural Networks (CNN)をベースにしているトラッカーで、オフライントレーニングのためはるかに高速とのこと。
しかし視点の変化、照明の変化、変形には弱いらしいです。