検索
連載

第8回 初めてのOpenCV開発 ― CMakeを使ったOpenCVのカスタマイズ【OpenCV 3.1.0】OpenCV入門【3.0対応】

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

Share
Tweet
LINE
Hatena
「OpenCV入門【3.0対応】」のインデックス

連載目次

ご注意:本記事は、@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から操作する方法について解説します。

図1 「cmake-gui.exe」ファイルを実行し、所定のパスを設定した後、[Configure]ボタンを押します
図1 「cmake-gui.exe」ファイルを実行し、所定のパスを設定した後、[Configure]ボタンを押します

図2 [Yes]ボタンを押して処理を続行します
図2 [Yes]ボタンを押して処理を続行します

図3 コンパイラーを指定して、[Finish]ボタンを押します
図3 コンパイラーを指定して、[Finish]ボタンを押します

図4 設定をカスタマイズした後に[Configure]ボタンを押し、最後に[Generate]ボタンを押すことでソリューションファイルを生成できます
図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 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


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

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

-D BUILD_opencv_highgui=OFF


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

 上記の表以外のモジュールも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"


Intel TBBのヘッダーパス指定例


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


libtiffをソースからビルドする場合の指定例


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


DirectShowの有効化の指定

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


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

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

図5 QtによるGUI拡張機能
図5 QtによるGUI拡張機能


4. おわりに

 今回は、CMakeを使ったOpenCVのカスタマイズ方法を紹介しました。次回からはopencv_contribに関して紹介してます。

「OpenCV入門【3.0対応】」のインデックス

OpenCV入門【3.0対応】

Copyright© Digital Advantage Corp. All Rights Reserved.

[an error occurred while processing this directive]
ページトップに戻る