OpenCV 2.4.9 入門(7)

OpenCV 2.4.9 入門(7)

初めてのOpenCV開発 ― CMakeを使ったOpenCVのカスタマイズ【OpenCV 2.4.9】

2015年4月27日

CMakeを使ったOpenCVのカスタマイズ方法として、CMakeの導入方法やCMakeの各種オプションについて紹介する。

@dandelion1124(dandelion's log
  • このエントリーをはてなブックマークに追加
OpenCV 3.0が正式にリリースされたのに合わせて、この記事も3.0の内容に改訂する予定です。

1. はじめに

 前回の記事では、OpenCVのデバッグ機能およびデバッグ支援ツールについて解説を行いました。今回は、CMakeを使ったOpenCVのカスタマイズ方法について紹介します。

1.1 カスタマイズのメリット

 第2回で解説したように、インストーラーを用いた導入は、環境構築が容易というメリットがある一方で、インストーラー版で無効化されている機能については利用できません。今回紹介する「CMakeを使ったカスタマイズ」を行うことで、OpenCVの機能をユーザーの用途に応じて詳細にカスタマイズできます。

1.2 今回の記事の内容

 今回の記事では以下の内容について解説を行います。

 また、筆者が確認した環境は以下の通りです。

項目 内容
OpenCVバージョン OpenCV 2.4.9
Visual Studio Visual Studio 2012 Update4
ビルド構成 Win32Release
OS Windows 8.1 Pro(64bit)
筆者が確認した環境

▲記事内容の一覧に戻る

2. CMakeの導入方法

2.1 CMakeとは

 CMakeとは、同じソースツリーからさまざまなコンパイラー向けにビルドを行えるようにするツールで、マルチプラットフォーム対応のOSS(オープンソースソフトウェア)の開発で広く使われています。CMakeを使ったビルドの基本的な流れは以下の通りです(第2回でも同様の説明をしていますが、その回ではCMake 3.0が対象なのに対し、今回は3.2.1が対象です)。

  • CMake設定ファイル(CMakeLists.txtファイル)の記述を基に、指定したコンパイラー向けのビルド用ファイルを生成する
  • ビルド用ファイルを用いてコンパイラーでビルドする

2.2 CMakeのインストール

 今回の説明では、2015/4/12時点で最新のCMake 3.2.1を用いて環境構築を行うこととします。

1 CMake公式ダウンロードページからインストーラー「cmake-3.2.1-win32-x86.exe」をダウンロードします。
2 ダウンロードした「cmake-3.2.1-win32-x86.exe」を実行し、インストールを行います。

3 また、コマンドプロンプトからCMakeを実行する場合には、環境変数に以下のパスを追加してください(環境変数の設定方法はこちらを参考にされたい)。コマンドプロンプトを起動し、cmakeコマンドが実行できれば環境変数の設定が正しく行われています。

変数名 変数値
Path ;C:\Program Files\CMake\bin
追記する変数値(32bit Windowsの場合)
変数名 変数値
Path ;C:\Program Files (x86)\CMake\bin
追記する変数値(64bit Windowsの場合)

2.3 CMakeの使い方(GUI)

 ここでは「2.2 CMakeのインストール」でインストールしたCMakeをGUIから操作する方法について解説します。

図1 「cmake-gui.exe」ファイルを実行し、所定のパスを設定した後、[Configure]ボタンを押します
CMake実行(GUI)(1)
図2 [Yes]ボタンを押して処理を続行します
CMake実行(GUI)(2)
図3 コンパイラーを指定して、[Finish]ボタンを押します
図4 設定をカスタマイズした後に[Configure]ボタンを押し、最後に[Generate]ボタンを押すことでソリューションファイルを生成できます

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
オプション機能のONを指定

 逆に明示的に無効にする場合はOFFを指定します。

-D XXXXXX=OFF
オプション機能のOFFを指定

 ライブラリのインクルードパスを設定する場合は、以下のような指定を行います(yyyyにはインクルードパスが入る)。

-D XXXX_INCLUDE_DIR=YYYY
ライブラリのインクルードパスを指定

 また、-Gオプションを使うことで、コンパイラー、対象アーキテクチャを指定できます。以下の例は、Visual Studio 2012(Visual Studio 11)、64bitビルドの場合の指定方法です。32bitビルドの場合はコンパイラーのみの指定で問題ありません。

-G "Visual Studio 11 Win64"
コンパイラーと対象アーキテクチャを指定

▲記事内容の一覧に戻る

3. OpenCVのCMakeオプション一覧

 ここではOpenCV2.4.9で使用できるオプションのうち、主要なオプションとその概要を、以下の観点で分類して説明します。

 また、筆者が使用しているCMakeコマンド指定例をGistsで公開していますので、ご参考ください。

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_highgui highguiモジュールをビルド対象にする
ビルド対象モジュール指定オプション

 例えば、highguiモジュールを明示的にビルド対象にする場合はONを指定します。

-D BUILD_opencv_highgui=ON
highguiモジュールをビルド対象に「する」場合の指定例

 逆に明示的に無効にする場合はOFFを指定します。

-D BUILD_opencv_highgui=OFF
highguiモジュールをビルド対象に「しない」場合の指定例

 上記の表以外のモジュールもBUILD_opencv_xxxx(xxxxにはモジュール名が入る)というオプションで、ビルド対象とするかを指定できます。

▲CMakeオプションの一覧に戻る

3.3 並列処理フレームワーク関連オプション

 ここではOpenCVの内部で用いられる並列処理フレームワークを指定するためのオプションを紹介します。これらのオプションを用いることで一部の関数を高速化できます。

CMakeオプション 概要
WITH_CUDA CUDA実装を有効にする(GPU)
WITH_OPENCL OpenCL実装を有効にする(CPU/GPU)
WITH_TBB Intel TBB実装を有効にする(CPU)
並列処理フレームワーク関連オプション

 ここでは紹介しませんが、WITH_CUDAで有効にしたCUDA実装はgpuモジュールWITH_OPENCLで有効にしたOpenCL実装はoclモジュールで提供されます。gpuモジュールについては公式ドキュメント(英語)、oclモジュールについては公式ドキュメント(英語)筆者の資料を参照してください。

 また、WITH_TBBを有効にする場合は、以下のオプションでヘッダーパスも指定する必要があります(以下の例はC:\dev\tbb43_20150209ossにTBBがインストールされている場合の指定です)。

-D TBB_INCLUDE_DIR="C:/dev/tbb43_20150209oss/include"
Intel TBBのヘッダーパス指定例

▲CMakeオプションの一覧に戻る

3.4 対応画像フォーマット拡張オプション

 ここではOpenCVのcv::imread(画像読み込み)、cv::imwrite(画像書き出し)でサポートする画像フォーマットを拡張するオプションを紹介します。

CMakeオプション 概要
WITH_JPEG JPEG形式の画像ファイルを扱えるようにする
WITH_JASPER JPEG2000形式の画像ファイルを扱えるようにする
WITH_OPENEXR OpenEXR形式の画像ファイルを扱えるようにする
WITH_PNG PNG形式の画像ファイルを扱えるようにする
WITH_TIFF TIFF形式の画像ファイルを扱えるようにする
対応画像フォーマット拡張オプション

 OpenCVの「3rdparty」ディレクトリには、画像フォーマットライブラリのソースファイルも同梱されています。例えば、「3rdparty」ディレクトリに入っているlibtiffをソースからビルドする場合には、以下のオプションを指定します。

-D BUILD_TIFF=ON
libtiffをソースからビルドする場合の指定例

▲CMakeオプションの一覧に戻る

3.5 動画入出力オプション

 ここではOpenCVの動画入出力機能で内部的に用いられるフレームワークを指定するためのオプションを紹介します。

CMakeオプション 概要
WITH_FFMPEG 動画入出力機能でFFMPEGを使用する
WITH_VFW 動画入出力機能でVFWを使用する
WITH_DSHOW 動画入出力機能でDirectShowを使用する
WITH_MSMF 動画入出力機能でMicrosoft Media Foundationを使用する
動画入出力オプション

 例えば、OpenCVの動画入出力機能でDirectShowを有効にする場合には、以下のオプションを指定します。

-D WITH_DSHOW=ON
DirectShowの有効化の指定
3.5.1 フレームワークの優先順位(動画入出力)

 CMakeオプションで「WITH_FFMPEG」「WITH_VFW」「WITH_MSMF」をONにして、VideoCaptureクラスとVideoWriterクラスを使用して、動画入出力を行った場合、内部的に以下の優先順位に基づいて最も優先度の高いフレームワークで処理が行われる点に注意が必要です(下記はWindowsの場合の優先順位)。

  FFMPEG > VFW > MSMF

 ここで選択されたフレームワークで初期化処理が失敗した場合、次に優先度の高いフレームワークで処理が行われます。

▲CMakeオプションの一覧に戻る

3.6 その他のオプション

CMakeオプション 概要
WITH_QT Qtを使ってGUI機能を拡張する
CMAKE_INSTALL_PREFIX インストール先のパスを指定する
その他のオプション

 例えば、Qtを使ってGUI機能を拡張する場合には以下のオプションを指定します。

-D WITH_QT=ON
Qtを使ってGUI機能を拡張するためのオプション指定

 前回の記事でも簡単に述べたようにhighguiモジュールは、GUIツールキット「Qt」を用いた拡張機能(チェックボックス、ラジオボックス、画像の拡大表示&画素値表示など)を有効化できます。また、これらの拡張機能の詳細は公式ドキュメント(英語)を参照してください。

QtによるGUI拡張機能
図5 QtによるGUI拡張機能
3.6.1 注意点

 Qt5のVisual Studio 2013版は、32bit/64bitのライブラリが配布されていますが、Visual Studio 2010、2012版は32bitライブラリのみの配布となっています。そのため、64bitライブラリが必要な場合はソースファイルからビルドする必要があります。

4. おわりに

 今回は、CMakeを使ったOpenCVのカスタマイズ方法を紹介しました。次回からは、OpenCV 3.0の新機能について紹介します。

※以下では、本稿の前後を合わせて5回分(第4回~第8回)のみ表示しています。
 連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。

4. 初めてのOpenCV開発 ― Visual Studio/CMake/NuGetでプロジェクト作成【OpenCV 3.0/3.1】

OpenCVを使ったアプリケーションのプロジェクト作成方法として、「Visual Studio」「CMake」「NuGet」の3つの方法を解説する。

5. 初めてのOpenCV開発 ― coreモジュール【OpenCV 3.1.0】

OpenCVのcoreモジュールの概要を解説。そのMatクラスを使って画像データを扱う方法や、ユーティリティ関数、OpenCV 3.0より導入されたUMatクラスを紹介する。

6. 初めてのOpenCV開発 ― highgui/imgcodecs/videoioモジュール【OpenCV 3.1.0】

OpenCVのhighgui、imgcodecs、videoioという3つのモジュールの概要を解説。GUI機能、画像ファイル/動画ファイルの入出力機能、カメラキャプチャ機能などのAPIと、その基本的な使い方を説明する。

7. 初めてのOpenCV開発 ― デバッグ機能およびデバッグ支援プラグイン【OpenCV 3.1.0】

OpenCVを用いたアプリケーションの開発で役立つにデバッグ機能やデバッグ支援プラグインを紹介する。また、問題が生じた場合の対処法について説明する。

8. 【現在、表示中】≫ 初めてのOpenCV開発 ― CMakeを使ったOpenCVのカスタマイズ【OpenCV 2.4.9】

CMakeを使ったOpenCVのカスタマイズ方法として、CMakeの導入方法やCMakeの各種オプションについて紹介する。

GrapeCity Garage 記事内容の紹介

Azure Central の記事内容の紹介

Twitterでつぶやこう!


Build Insider賛同企業・団体

Build Insiderは、以下の企業・団体の支援を受けて活動しています(募集概要)。

ゴールドレベル

  • グレープシティ株式会社
  • 日本マイクロソフト株式会社