iOS で opencv_contrib のモジュールを使う

iOSopencv_contrib のモジュールを使う方法を調べた。 OpenCV 本体を使いたければ Cocoapods でビルドするだけだが、opencv_contrib に含まれている拡張モジュールを使う場合、opencv2.framework をゼロからビルドして、それをプロジェクトに追加する必要があった。

環境

手順

ソースコードのダウンロード

以下のURLからソースコードをダウンロードして、任意の作業ディレクトリに解凍する

ディレクトリ構成は以下のようになる

my_working_directory
├── opencv-3.4.5
│   ├── 3rdparty
│   ├── CMakeLists.txt
│   ├── CONTRIBUTING.md
│   ├── LICENSE
│   ├── README.md
│   ├── apps
│   ├── cmake
│   ├── data
│   ├── doc
│   ├── include
│   ├── modules
│   ├── platforms
│   └── samples
├── opencv-3.4.5.zip
├── opencv_contrib-3.4.5
│   ├── CONTRIBUTING.md
│   ├── LICENSE
│   ├── README.md
│   ├── doc
│   ├── modules
│   └── samples
└── opencv_contrib-3.4.5.zip

ビルド

作業ディレクトリで以下のコマンドを実行

$ python ./opencv-3.4.5/platforms/ios/build_framework.py ios --contrib ./opencv_contrib-3.4.5

Python のバージョンに注意

Mac にプリインストールされている Python 2.7 を使っていれば特に問題ないが、もし Python 3 を使用している場合ビルドが失敗する。pyenv を使うなどして python コマンドが Python 2.7 を参照するように設定する。

CMake のバージョンに注意

Python 2.7 で再ビルドしたら以下のエラーが出てビルドが失敗した。

error: Build input file cannot be found: '/Users/foo/Documents/my_working_directory/ios/build/build-armv7-iphoneos/modules/world/opencl_kernels_video.cpp'

ググってみると CMake のバージョンが古いことに起因するビルドエラーの issue が立っていた。

Unable to build framework for iOS · Issue #12646 · opencv/opencv

以下のコマンドで CMake のバージョンを確認できる。

$ cmake --version
cmake version 3.11.3

これが原因のようなので Homebrew で CMake のをアップデートする。

$ brew upgrade cmake
$ cmake --version
cmake version 3.13.2

ビルド成功

再ビルドを行う。

各デバイスのCPUアーキテクチャ向けにそれぞれバイナリをビルドするので、それなりの時間がかかる。

ビルドが成功すると作業ディレクトリ直下に ios/opencv2.framework が出来る。

opencv2.framework/Headers を参照すると、 opencv_contrib のモジュールも含まれていることが分かる。あとはビルドした opencv2.framework をプロジェクトにコピーすれば、C++ のファイルから opencv_contrib のモジュールを参照できる。

framework を iOS のプロジェクトに追加する方法と C++ のコードを Swift のプロジェクトから参照する方法は他に沢山の記事があるので割愛する。

所感

Python 3 が大多数となった現在でも OpenCV のビルドツールは Python 2.7 のままだった。 以前触れた Swift コンパイラのビルドツールも Python 2.7 だった。普段使いの Python が 3 系でも、歴史あるツールを Python でビルドする機会がある場合は pyenv や virtualenv でクリーンな作業環境を維持すると良さそう。