第8回 初めてのOpenCV開発 ― CMakeを使ったOpenCVのカスタマイズ【OpenCV 3.1.0】:OpenCV入門【3.0対応】
CMakeを使ったOpenCVのカスタマイズ方法として、CMakeの導入方法やCMakeの各種オプションについて紹介する。
ご注意:本記事は、@IT/Deep Insider編集部(デジタルアドバンテージ社)が「www.buildinsider.net」というサイトから、内容を改変することなく、そのまま「@IT」へと転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。
1. はじめに
前回の記事では、OpenCVのデバッグ機能およびデバッグ支援ツールについて解説を行いました。今回は、CMakeを使ったOpenCVのカスタマイズ方法について紹介します。
1.1 カスタマイズのメリット
第3回で解説したように、インストーラーを用いた導入は「環境構築が容易」というメリットがある一方で、「インストーラー版で無効化されている機能については利用できない」というデメリットもあります。今回紹介する「CMakeを使ったカスタマイズ」を行うことでユーザーの用途に応じてOpenCVの機能を詳細にカスタマイズできます。
1.2 今回の記事の内容
今回の記事では以下の内容について解説を行います。
また、筆者が確認した環境は以下の通りです。
項目 | 内容 |
---|---|
OpenCVバージョン | OpenCV 3.1.0 |
Visual Studio | Visual Studio 2013 Update5 |
ビルド構成 | x64Release |
OS | Windows 10 Pro(64bit) |
筆者が確認した環境 |
2. CMakeの導入方法
2.1 CMakeとは
CMakeとは、同じソースツリーからさまざまなコンパイラー向けにビルドを行えるようにするツールで、マルチプラットフォーム対応のOSS(オープンソースソフトウェア)の開発で広く使われています。CMakeを使ったビルドの基本的な流れは以下の通りです(※第3回でも同様の説明をしていますが、その回ではCMake 3.4.3が対象なのに対し、今回は3.7.2が対象です)。
- CMake設定ファイル(CMakeLists.txtファイル)の記述を基に、指定したコンパイラー向けのビルド用ファイルを生成する
- ビルド用ファイルを用いてコンパイラーでビルドする
2.2 CMakeのインストール
今回の説明では、2017/4/2時点で最新のCMake 3.7.2を用いて環境構築を行うこととします。
(1) CMake公式ダウンロードページからインストーラー「cmake-3.7.2-win64-x64.msi」をダウンロードします。32bit Windowsの場合は「cmake-3.7.2-win32-x86.msi」をダウンロードします。
(2) インストーラーを実行し、インストールを行います。
(3) また、コマンドプロンプトからCMakeを実行する場合には、環境変数に以下のパスを追加してください(※環境変数の設定方法はこちらを参考にしてください)。コマンドプロンプトを起動し、cmakeコマンドが実行できれば環境変数の設定が正しく行われています。
変数名 | 変数値 |
---|---|
Path | ;C:\Program Files (x86)\CMake\bin |
追記する変数値(32bit Windowsの場合) |
変数名 | 変数値 |
---|---|
Path | ;C:\Program Files\CMake\bin |
追記する変数値(64bit Windowsの場合) |
2.3 CMakeの使い方(GUI)
ここでは「2.2 CMakeのインストール」でインストールしたCMakeをGUIから操作する方法について解説します。
2.4 CMakeの使い方(CUI)
ここでは「2.2 CMakeのインストール」でインストールしたCMakeをコマンドラインで操作する方法について解説します。
2.4.1 コマンドラインから用いるメリット
コマンドラインから用いることで、
- 人手によるGUI操作が減る(=オペミスが起きにくくなる)
- 自動化を行いやすい
というメリットがあります。そのため、頻繁にビルドを行う方はコマンドラインで操作することをオススメします。
2.4.2 CMakeオプションの指定方法
cmakeコマンドの-Dオプションを使うことで、機能のON/OFFを指定できます。特定のオプションについて明示的に有効にする場合は、次のようにONを指定します(xxxxにはオプション名が入る)。
-D XXXXXX=ON
逆に明示的に無効にする場合はOFFを指定します。
-D XXXXXX=OFF
ライブラリのインクルードパスを設定する場合は、以下のような指定を行います(yyyyにはインクルードパスが入る)。
-D XXXX_INCLUDE_DIR=YYYY
また、-Gオプションを使うことで、コンパイラー、対象アーキテクチャを指定できます。以下の例は、Visual Studio 2013(Visual Studio 12)、64bitビルドの場合の指定方法です。32bitビルドの場合はコンパイラーのみの指定で問題ありません。
-G "Visual Studio 12 Win64"
3. OpenCVのCMakeオプション一覧
ここではOpenCV3.1.0で使用できるオプションのうち、主要なオプションとその概要を、以下の観点で分類して説明します。
また、筆者が使用しているCMakeコマンド指定例をWikiで公開していますので、ご参考ください。
3.1 ビルド対象指定オプション
ここではビルド対象(ドキュメント、サンプルプログラム、テストプログラムなど)を指定するためのオプションを紹介します。
CMakeオプション | 概要 |
---|---|
BUILD_DOCS | ドキュメントを自動生成する |
BUILD_EXAMPLES | サンプルプログラムをビルドする |
BUILD_TESTS | テストプログラムをビルドする |
BUILD_PERF_TESTS | パフォーマンステストプログラムをビルドする |
BUILD_SHARED_LIBS | DLLを生成する |
ビルド対象指定オプション |
例えば、ドキュメントの自動生成を明示的に無効化したい場合は、以下のように指定します。
-D BUILD_DOCS=OFF
3.2 ビルド対象モジュール指定オプション
ここではビルド対象モジュールを指定するためのオプションを紹介します。
CMakeオプション | 概要 |
---|---|
BUILD_opencv_core | coreモジュールをビルド対象にする |
BUILD_opencv_imgproc | imgprocモジュールをビルド対象にする |
BUILD_opencv_imgcodecs | imgcodecsモジュールをビルド対象にする |
BUILD_opencv_videoio | videoioモジュールをビルド対象にする |
BUILD_opencv_highgui | highguiモジュールをビルド対象にする |
ビルド対象モジュール指定オプション |
例えば、highguiモジュールを明示的にビルド対象にする場合はONを指定します。
-D BUILD_opencv_highgui=ON
逆に明示的に無効にする場合はOFFを指定します。
-D BUILD_opencv_highgui=OFF
上記の表以外のモジュールもBUILD_opencv_xxxx(xxxxにはモジュール名が入る)というオプションで、ビルド対象とするかを指定できます。
3.3 並列処理フレームワーク関連オプション
ここではOpenCVの内部で用いられる並列処理フレームワークを指定するためのオプションを紹介します。これらのオプションを用いることで一部の関数を高速化できます。
CMakeオプション | 概要 |
---|---|
WITH_CUDA | CUDA実装を有効にする(GPU) |
WITH_OPENCL | OpenCL実装を有効にする(CPU/GPU) |
WITH_TBB | Intel TBB実装を有効にする(CPU) |
並列処理フレームワーク関連オプション |
ここでは紹介しませんが、WITH_OPENCLで有効にしたOpenCL実装はUMatで提供されます。UMatモジュールについては第5回や以下の資料を参照してください。
また、WITH_TBBを有効にする場合は、以下のオプションでヘッダーパスも指定する必要があります(以下の例はC:\dev\tbb2017_20161128ossにTBBがインストールされている場合の指定です)。
-D TBB_INCLUDE_DIR="C:/dev/tbb2017_20161128oss/include"
3.4 対応画像フォーマット拡張オプション
ここではOpenCVのcv::imread(画像読み込み)、cv::imwrite(画像書き出し)でサポートする画像フォーマットを拡張するオプションを紹介します。
CMakeオプション | 概要 |
---|---|
WITH_JPEG | JPEG形式の画像ファイルを扱えるようにする |
WITH_JASPER | JPEG2000形式の画像ファイルを扱えるようにする |
WITH_OPENEXR | OpenEXR形式の画像ファイルを扱えるようにする |
WITH_PNG | PNG形式の画像ファイルを扱えるようにする |
WITH_TIFF | TIFF形式の画像ファイルを扱えるようにする |
WITH_WEBP | WebP形式の画像ファイルを扱えるようにする |
対応画像フォーマット拡張オプション |
OpenCVの「3rdparty」ディレクトリには、画像フォーマットライブラリのソースファイルも同梱されています。例えば、「3rdparty」ディレクトリに入っているlibtiffをソースからビルドする場合には、以下のオプションを指定します。
-D BUILD_TIFF=ON
3.5 動画入出力オプション
ここではOpenCVの動画入出力機能で内部的に用いられるフレームワークを指定するためのオプションを紹介します。
CMakeオプション | 概要 |
---|---|
WITH_FFMPEG | 動画入出力機能でFFMPEGを使用する |
WITH_VFW | 動画入出力機能でVideo for Windowsを使用する |
WITH_DSHOW | 動画入出力機能でDirectShowを使用する |
WITH_MSMF | 動画入出力機能でMicrosoft Media Foundationを使用する |
動画入出力オプション |
例えば、OpenCVの動画入出力機能でDirectShowを有効にする場合には、以下のオプションを指定します。
-D WITH_DSHOW=ON
3.5.1 フレームワークの優先順位(動画入出力)
CMakeオプションで「WITH_FFMPEG」「WITH_VFW」「WITH_MSMF」をONにして、cv::VideoCaptureクラスとcv::VideoWriterクラスを使用して、動画入出力を行った場合、内部的に以下の優先順位に基づいて最も優先度の高いフレームワークで処理が行われる点に注意が必要です(下記はWindowsの場合の優先順位)。
FFMPEG > VFW > MSMF
ここで選択されたフレームワークで初期化処理が失敗した場合、次に優先度の高いフレームワークで処理が行われます。
3.6 その他のオプション
CMakeオプション | 概要 |
---|---|
WITH_WIN32UI | Win32 APIを使ってGUI機能を拡張する |
WITH_QT | Qtを使ってGUI機能を拡張する |
CMAKE_INSTALL_PREFIX | インストール先のパスを指定する |
その他のオプション |
例えば、Qtを使ってGUI機能を拡張する場合には以下のオプションを指定します。
-D WITH_QT=ON
前々回の記事でも簡単に述べたようにhighguiモジュールは、GUIツールキット「Qt」を用いた拡張機能(チェックボックス、ラジオボックス、画像の拡大表示&画素値表示など)を有効化できます。また、これらの拡張機能の詳細は公式ドキュメント(英語)を参照してください。
4. おわりに
今回は、CMakeを使ったOpenCVのカスタマイズ方法を紹介しました。次回からはopencv_contribに関して紹介してます。
Copyright© Digital Advantage Corp. All Rights Reserved.