OpenCV3.3.1をcontribモジュールとともにビルドして使用する

OpenCVには拡張モジュールがある。OpenCV3.3.1時点ではtrackerモジュール等。TBBで並列化処理をする設定です。個人的な備忘録。

## 環境
- Windows 10

## 必要なもの
- Visual Studio 2015 Community(が無難？2013でもいけそう,2017はまだ早い？)
- cmake 3.5.2(これより新しければ大丈夫だと思う)
- 【Option】TBB (並列化処理しだい)

## 手順
Visual Studioとcmakeは事前にダウンロードしてください。
[ここ](https://github.com/opencv/opencv/releases)から通常のOpenCVのSource code(zip or tar.gz)をダウンロードする。
同様に拡張モジュールについても[こちら](https://github.com/opencv/opencv_contrib/releases)からダウンロードする。

ZIPを解凍するとopencv-3.3.1,opencv_contrib-3.3.1のフォルダが出来る。そのままだとopencv-3.3.1/opencv-3.3.1/みたいにマトリョーシカのようになっていて気持ち悪いのでopencv-3.3.1/いろいろの部分だけコピー。今回はC:直下にopencv331_contribというフォルダを作り、そこに貼りつける。contribについても同様にopencv331_contribへ貼りつける。

図のようにWhere is the source codeとWhere to build the binariesに入力してConfigureを押す。後者のフォルダはあらかじめ作っておかなくても自動で生成されます。ここがビルドされたもの出力先。
![configure.png](https://qiita-image-store.s3.amazonaws.com/0/217523/ceefda9c-b30b-6f2c-0695-a596cc42d5d2.png)
その次にプロジェクトの形式を聞かれるので、Specify the generator for this projectで選択。
ここではOpenCVを使いたいVisual Studioのバージョンを選択してください。今回はVisual Studio 14 2015 Win64を選択。

![extrapass.png](https://qiita-image-store.s3.amazonaws.com/0/217523/0d23005d-1273-8b6e-a997-59c40d757d8c.png)

写真のように項目が赤く染まる（変更があった項目は赤色）のでそのうちOPENCV/OPENCV_EXTRA_MODULES_PASSにpassを入力。もう一回configureを押す。
GPU非内蔵PCはWITH_CUDAをオフにする必要があるらしいがここでいうGPUはCPU内蔵GPUでも問題がない様子。
並列化は欠かせないのでTBB実装を有効にしてみる。
WITH/WITH_TBBをonにしてconfigure
[この記事](https://github.com/atinfinity/lab/wiki/OpenCV-3.2%E3%81%A7WITH_TBB%E3%82%92ON%E3%81%AB%E3%81%99%E3%82%8B)を参考にしてTBBを入手。tbb2017_20170807ss_win.zipを使用（VS2017は対応してなかった）。
変数については以下の通りにしてgenerateした。

| 変数名 | 設定例 | 
|:-----------|:------------|
| TBB_ENV_INCLUDE       | C:/tbb2017_20170807oss/include        |
| TBB_ENV_LIB     | C:/tbb2017_20170807oss/lib/intel64/vc14/tbb.lib      |
| TBB_ENV_LIB_DEBUG       | C:/tbb2017_20170807oss/lib/intel64/vc14/tbb_debug.lib        | 

C:/opencv331_contrib/opencv-3.3.1/buildに生成されたOpenCV.slnをVisual Studio 2015で開く。ビルド/ソリューションのビルドをする。ソリューションプラットフォームがWin32になっている場合はx64に変更。
python36のdebug用ライブラリが存在しないとかでエラー。pythonは使わないのでPYTHON2,PYTHON3をRemove Entryして再度cmakeでgenerate。Anaconda等でpythonの環境が入っていると起きそうなエラー。気を取り直してもう一度、debugとrelease構成それぞれでbuild。これで上手くビルドできた。
buildをする際はCMakeTargets/INSTALLをスタートアッププロジェクトにしてINSTALLのプロジェクトをbuildする。

## 実際にプロジェクトで使うとき
### 設定以前に
Visual Studioでソリューションファイルを作る（何も作っていなければ）。ソリューションファイルを選択して右クリック。追加をクリック。プロジェクトを追加する。
プロジェクトを選択して右クリック。追加をクリック。空のcppファイルを追加する（何かしらcppファイルを作らないと次の設定に進めない）。
### 設定
プロジェクトを右クリックしてプロパティを表示。
構成がすべての構成、プラットフォームがx64になっていることを確認。
構成プロパティ/VC++ディレクトリ/ライブラリディレクトリに
C:\opencv331_contrib\opencv-3.3.1\build\install\x64\vc14
構成プロパティ/C/C++/追加のインクルードディレクトリに
C:\opencv331_contrib\opencv-3.3.1\build\install\include;%(AdditionalIncludeDirectories)

構成をDebugにして、
構成プロパティ/リンカー/全般/追加のライブラリディレクトリに
C:\opencv331_contrib\opencv-3.3.1\build\lib\Debug
構成プロパティ/リンカー/入力/追加の依存ファイルに
opencv_core331d.lib;opencv_imgcodecs331d.lib;opencv_video331d.lib;opencv_videoio331d.lib;opencv_highgui331d.lib;opencv_tracking331d.lib;opencv_imgproc331d.lib;%(AdditionalDependencies)
構成をreleaseにして、
構成プロパティ/リンカー/全般/追加のライブラリディレクトリに
C:\opencv331_contrib\opencv-3.3.1\build\lib\release
構成プロパティ/リンカー/入力/追加の依存ファイルに
opencv_core331.lib;opencv_imgcodecs331.lib;opencv_video331.lib;opencv_videoio331.lib;opencv_highgui331.lib;opencv_tracking331.lib;opencv_imgproc331.lib;%(AdditionalDependencies)
これで使える！なお、最後の項目については構成をすべての構成にしてでも良い（OpenCVのライブラリ内にバグの原因がある場合に対応できなくなるけれどめったにないので）。