OpenCV 2.3.1をVisual C++で使用する環境を整える

icon 項目のみ表示/展開表示の切り替え

概要

OpenCVは画像処理ライブラリである。
Visual C++ でコンパイルおよび実行するために必要な作業について述べる。

テスト環境

コンパイラ

Visual C++ 2008 Express(32bit)/Standard(32/64bit) with OpenCV2.3.1
Visual C++ 2013 Express 32bit/64bit with OpenCV2.4.10

実行環境

Windows 7 32/64bit

OpenCV 2.3.1の環境設定

2014/10/02 367.3MB
このバージョンは、Visual C++ 2008/2010/2012/1013で使用可能です。
コンパイル済みのLIBやDLLファイルがあるので簡単に使用できますが静的ライブラリを用いる場合は一部のファイルが抜けています。

ダウンロード

http://sourceforge.net/projects/opencvlibrary/files/opencv-win/

2.3.1をクリックします。

OpenCV-2.3.1-win-superpack.exe(2011-08-17 131.1MB)をクリックしダウンロードします。

解凍

ダウンロードしたファイルを実行します。

ファイルを解凍する場所(フォルダー名)を聞いてくるので、C:\opencv2.3.1と入力しExtractをクリックします。
フォルダー名は、後でライブラリファイルのフォルダーをopencvのバージョンやデバック/リリース・32/64bit・動的リンク/静的リンクに合わせてC++のマクロにより自動的に選択させるために、この様にバージョン番号を含んだフォルダー名を指定します。 解凍すると1.20GBとなります。

インクルードパスの設定

OpenCvを使用したプログラムのコンパイルには、opencvのヘッダーファイルの場所を指定してやる必要があります。

Visual C++ 2008の場合

初期設定としてインクルードパスを追加する。
ツール・オプションのプロジェクトおよびソリューションの中のVC++ ディレクトリを選択し、ディレクトリを表示するプロジェクトをインクルードファイルに変更します。
アイコン 新しい行をクリックし、C:\opencv2.3.1\opencv\build\includeを追加します。
該当プロジェクトのみ設定する
プロジェクトのプロパティを開き、構成のプロパティ を選びC/C++ 追加のインクルートディレクトリC:\opencv2.3.1\opencv\build\includeを追加します。
すでに追加のインクルードディレクトリに記述がある場合は、既存の内容の前にC:\opencv2.3.1\opencv\build\include;を追加します。 ここには環境変数を記述することはできませんでした。

Visual C++ 2013

初期設定としてインクルードパスを追加する。
プロジェクトのプロパティページ・構成プロパティ・VC++ディレクト・インクルードディレクトリを修正します。
C:\opencv2.3.10\opencv\build\include
%include%;$(VC_IncludePath);$(WindowsSDK_IncludePath);
ここでは、環境変数INCLUDEを参照するようにしています。環境変数を介すことによりデバック/リリース・32/64bitの変更を行ってもバージョン番号の変更は環境変数のみで対応できます。
該当プロジェクトのみ設定する
プロジェクトのプロパティを開き、構成のプロパティ を選びC/C++ 追加のインクルートディレクトリC:\opencv2.3.1\opencv\build\includeを追加します。
すでに追加のインクルードディレクトリに記述がある場合は、既存の内容の前にC:\opencv2.3.1\opencv\build\include;を追加します。 ここには環境変数を記述することはできませんでした。

ライブラリパスの設定

リンクには、opencvの関数の場所または実態を示したLIBファイルが必要です。
デバック/リリース・32/64bit・動的リンク/静的リンクにより以下のように参照するフォルダーが変わります。
なお、静的ライブラリに一部抜けているファイルがあるので、ソースによってはコンパイルや実行できない場合があります。
抜けているファイルの入手・作成方法は後述します。

C:\OPENCV2.3.1\OPENCV\BUILD\X86
├─vc9
│  ├─lib        Visual C++ 2008 32bit 動的リンクライブラリ
│  └─staticlib  Visual C++ 2008 32bit 静的リンクライブラリ
├─vc10
│  ├─lib        Visual C++ 2010 32bit 動的リンクライブラリ
│  └─staticlib  Visual C++ 2010 32bit 静的リンクライブラリ
├─vc11
│  ├─lib        Visual C++ 2012 32bit 動的リンクライブラリ
│  └─staticlib  Visual C++ 2012 32bit 静的リンクライブラリ
└─vc12
    ├─lib       Visual C++ 2013 32bit 動的リンクライブラリ
    └─staticlib Visual C++ 2012 32bit 静的リンクライブラリ
C:\OPENCV2.3.1\OPENCV\BUILD\X64
├─vc9
│  ├─lib        Visual C++ 2008 64bit 動的リンクライブラリ
│  └─staticlib  Visual C++ 2008 64bit 静的リンクライブラリ
├─vc10
│  ├─lib        Visual C++ 2010 64bit 動的リンクライブラリ
│  └─staticlib  Visual C++ 2010 64bit 静的リンクライブラリ
├─vc11
│  ├─lib        Visual C++ 2012 64bit 動的リンクライブラリ
│  └─staticlib  Visual C++ 2012 64bit 静的リンクライブラリ
└─vc12
    ├─lib       Visual C++ 2013 64bit 動的リンクライブラリ
    └─staticlib Visual C++ 2012 64bit 静的リンクライブラリ
動的リンク/静的リンクを切り替えて使用しなければ、プロジェクトのプロパティページ・構成プロパティ・VC++ディレクト・ライブラリディレクトリに記述すれば参照可能ですが、面倒なので、C++のマクロにより切り替えることとしました。
ビルド時の状態によりマクロが以下のように変わります。
また、デバック版の場合は、ファイル名にdが付加されます。

_DLL 動的リンクを指定している場合に定義される。
_WIN64 64bitの実行ファイルを作成する場合に定義される。
_DEBUG デバックを指定している場合に定義される
_MSV_VER Visual C++のバージョンを示す。
  1500 Visual C++ 2008
  1600 Visual C++ 2010
  1700 Visual C++ 2012
  1800 Visual C++ 2013
CVAUX_STR(CV_MAJOR_VERSION) OpenCVのメジャーバージョンを示す。 2.4.10の場合2
CVAUX_STR(CV_MINOR_VERSION) OpenCVのマイナーバージョンを示す。 2.4.10の場合4
CVAUX_STR(CV_SUBMINOR_VERSION)  OpenCVのサブマイナーバージョンを示す。 2.4.10の場合10
ライブラリファイルはC++のソースコード上で#pragma comment(lib,"LIBファイル名")で指定できるので、これらのマクロを駆使しLIBファイル名を作成する。

実行時のパス

動的リンクでビルドした場合は、実行時に以下のフォルダーのdllファイルを参照する。
正常に動作させるには、環境変数PATHに以下のパスを通す必要がある。32/64bitで参照するdllファイルは同じ名前なので、ビルドしたファイルに合わせて環境変数を切り替える必要がある。
32/64bitで両方ビルドするには、先にソリューションを作成しておいてから、同じフォルダーに以下のバッチファイルを作成する。
test.slnはソリューションのファイル名に合わせて修正する必要がある。

C:\OPENCV2.3.1\OPENCV\BUILD\X86
├─vc9
│  └─bin
├─vc10
│  └─bin
├─vc11
│  └─bin
└─vc12
    └─bin
C:\OPENCV2.3.1\OPENCV\BUILD\X64
├─vc9
│  └─bin
├─vc10
│  └─bin
├─vc11
│  └─bin
└─vc12
    └─bin

32bit


set path_tmp=%path%
path=C:\opencv2.3.1\opencv\build\x86\vc12\bin;%path%
set include_tmp=%include%
set include=C:\opencv2.4.10\opencv\build\include;%include%
start /wait test.sln

64bit


set path_tmp=%path%
path=C:\opencv2.3.1\opencv\build\x64\vc12\bin;%path%
set include_tmp=%include%
set include=C:\opencv2.4.10\opencv\build\include;%include%
start /wait test.sln

実行ファイルとソースファイルのダウンロード(playsound_file.zip)

静的ライブラリを作成する

静的ライブラリのうち一部が抜けているためリンク時にエラーがでます。
cmakeを使用することにより静的ライブラリを構築することができます。

cmakeの入手

http://www.cmake.org/download/
Windows (Win32 Installer) cmake-3.1.0-win32-x86.exe 11.7MBをダウンロードします。
cmakeをインストールします。

プログラムメニューよりcmakeを起動します。

Wheres is the source codeにはOpenCVをインストールしたフォルダー名のサブフォルダーopencvをフルパスで指定します。
Wheres to build the binariesはVisual C++用のソリューションファイルを出力するフォルダーを指定します。
Configureボタンをクリックし、対象とするVisual Studuoを選択しFinishボタンをクリックします。
BUILD_SHARED_LIBSのチェックをはずします。CUDAを使用しない場合は、 WHITH_CUDAのチェックもはずしてください。(CUDAを使用するには先に必要なファイルをインストールしておく必要があります。)
Configureボタンをクリックしてください。


Configureボタンをクリックしてください。
Generateボタンをクリックしてください。
先ほど指定したd:\stdlibの中にOpenCV.slnをクリックするとVisual C++が起動します。
ビルドの構成マネージャーを開くと

Debug/ReleaseのINSTALLのビルドにチェックを入れます。 Debugのビルドはi7-870(2.93GHz RAM 2GB Windows7 32bit)1分45秒かかりました。
DebugのビルドはPentium 4(3.2GHz RAM 1GB WindowsXP 32bit)5分45秒かかりました。
Releaseのビルドはi7-870(2.93GHz RAM 2GB Windows7 32bit)2分20秒かかりました。
ReleaseのビルドはPentium 4(3.2GHz RAM 1GB WindowsXP 32bit)8分5秒かかりました。
プロジェクトのデバック/リリースともに実行します。 D:\stdlib\install\libにビルドされたスタティックライブラリが保存されます。
D:\stdlib\install\share\OpenCV\3rdparty\lib のLIBファイルも必要となります。
32bit用のライブラリをビルドした場合は、これらのファイルをC:\opencv2.3.1\opencv\build\x86\vc9\staticlibに上書きしてください。
64bit用のライブラリをビルドした場合は、これらのファイルをC:\opencv2.3.1\opencv\build\x64\vc9\staticlibに上書きしてください。
32/64bitそれぞれについてcmakeのWheres to build the binariesで指定するフォルダー名を別々にしてライブラリファイルを作成します。