OpenCV 4.1.0をWindowsでビルドする手順

[OpenCV 4.1.0](https://github.com/opencv)をWindowsでビルドする手順です。
CUDA 10.0、VTK 8.2、Qt5 を有効にして、Python 3からも利用できるようにします。

ここでは必要なソフトのインストール方法などは省略して、OpenCVをビルドする手順に焦点を当てました。
もう少し細かい説明は、[こちらのBlog](https://dev.infohub.cc/build-opencv-410/)に書いているので必要に応じて参照してください。

# OpenCV 4.1.0のビルド環境
以下の環境でOpenCV 4.1.0をビルドしています。
なお、Visual Studio 2019を使うとビルドに失敗します。

- Microsoft Windows 10 Pro
- Microsoft Visual Studio Community 2017 Version15.9.11
- Git for Windows（gitコマンドが利用できれば良い）
- CMake 3.1.4
- Python 3.7.3 for Windows
- CUDA 10.0
- VTK 8.2.0
- Qt 5.12.2

## PATHの設定
CUDA、VTK、Qtなどは事前にパスを通しておきます。

- CUDA 10
 - C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin
 - C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\libnvvp
 - C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\extras\CUPTI\libx64
- Git for Windows
  - C:\Program Files\Git\cmd
- Qt5
 - C:\Qt\Qt5.12.2\5.12.2\msvc2017_64\bin
- VTK
 - C:\lib\VTK\bin
- Python 3.7.3
 - C:\Python37\Scripts\
 - C:\Python37\

## ビルド環境の準備
Python用にビルドするためにnumpyが必要になるので、ビルド用のPython仮想環境を作成します。

```powershell
# 仮想環境の作成
python -m venv C:\venvs\build_opencv410
C:\venvs\build_opencv410\Scripts\activate

# numpyの導入
pip install numpy
```

# OpenCVのビルド
opencvとopencv_contribのソースコードを取得します。

```powershell
# 作業用のフォルダ作成
mkdir c:\build\opencv410
cd /d c:\build\opencv410

# OpenCVのソース取得
git clone https://github.com/opencv/opencv.git
cd opencv
git checkout 4.1.0
cd ..

# OepnCV Contribのソース取得
# OpenCVのビルドにはcontribのopencv_cudevが必須
git clone https://github.com/opencv/opencv_contrib.git
cd opencv_contrib
git checkout 4.1.0
cd ..
```

CMakeを起動して以下のように設定を行います。
環境によって設定項目が異なりますが、ポイントになる部分は赤矢印を付けています。

- ``OPENCV_EXTRA_MODULES_PATH``にopencv_contribのmodulesフォルダを指定
- ``PYTHON3_NUMPY_INCLUDE_DIRS``にnumpyのincludeフォルダを指定
- ``PYTHON3_PACKAGES_PATH``にPythonのsite-packagesフォルダを指定
- ``CMAKE_INSTALL_PREFIX``にOpenCVをインストールするフォルダを指定
- CPUやCUDAのアーキテクチャは利用している環境に合わせて設定
- ``WITH_CUDA``,``WITH_VTK``,``WITH_QT``などを必要に応じて選択
- 他の設定は以下画像を参照

<img width="609" alt="01_build-opencv-410.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52648/bbc2a5bd-796f-34d5-ad4d-28d0de47d86c.png">

設定が完了したらCMakeのGenerateでコードを生成し、Open ProjectでVisual Studio 2017のソリューションファイルを開きます。
Visual Studio 2017のバッチビルドで、``INSTALL``をビルドすれば完了です。

OpenCVの各種ファイルは``CMAKE_INSTALL_PREFIX``で指定したフォルダに、Python3用のモジュールは``PYTHON3_PACKAGES_PATH``で指定したフォルダ配下にcv2フォルダが作成されて格納されます。

OpenCVをどこからでも利用できるようにする場合、環境変数PATHに``CMAKE_INSTALL_PREFIX``配下に作成されたbinフォルダ（C:\lib\OpenCV410\x64\vc15\binなど）を追加してください。


# Pythonから利用する方法
Python環境にビルドしたOpenCVを導入するには、ビルド時に作成されたpython_loaderフォルダのsetup.pyを利用します。
OpenCVを導入したいPythonの仮想環境をアクティブにして``setup.py install``とすれば導入できます。

```powershell
# 仮想環境を作成してアクティブ化
python -m venv C:\venvs\cv410
C:\venvs\cv410\Scripts\activate.bat

# OpenCVの導入
python C:\build\opencv410\opencv\build\python_loader\setup.py install
```

``pip list``でopencvが導入されたことが確認できます。

```powershell
pip list
Package    Version
---------- -------
numpy      1.16.2
opencv     4.1.0
pip        19.0.3
setuptools 40.8.0
```

PythonにOpenCVを導入しても、必要なファイル（OpenCVのdllファイルや、依存しているCUDA,VTK,Qtなどのファイル）が参照できない状態だとOpenCVを使う時に「DLL load failed: 指定されたモジュールが見つかりません」のようなエラーが発生します。

以下コマンドで、OpenCVを正しくロードできるか試してください。
もしDLL load failedのエラーが発生するようならPATHが正しく設定されているか確認してください。

```powershell
# OpenCVのバージョン表示
# 正しくインストールできていれば 4.1.0 と表示される
python -c "import cv2; print(cv2.__version__)"

# OpenCVのビルド情報表示
# 正しくインストールしていればOpenCVのビルド情報が詳細に表示される
python -c "import cv2; print(cv2.getBuildInformation())"
```