Windows上で Qt と VTK (QVTK) サポートな OpenCV, PCL 環境構築メモ (2018/04版)

# **[2019/04版](https://qiita.com/n_chiba_/items/8d546272035f3123aee8)の記事を公開しています**
https://qiita.com/n_chiba_/items/8d546272035f3123aee8

# はじめに

Windows, Visual Studio 2015でのQtとVTK(with Qt)サポートな開発環境構築の記録用メモ．Pythonは3のみを想定．
主にOpenCV, PCL, ついでにTensorFlowが使える環境を構築，ライブラリはC:\lib以下に配置．

[1年前の記事](https://qiita.com/n_chiba_/items/ea0bc4b4b99ac14ef46d) のアップデートです．
昨年引き続き http://unanancyowen.com/pcl181 (PCL 1.8.1) を大いに参考にさせて頂きました．ありがとうございます．

本記事での `> 何かコマンド` は，PowerShell上での操作の意味です．



# 導入するもの
- インストーラー使用
  - Visual Studio Community 2015
  - Anaconda 5.1 (Python 3.6)
  - Git for Windows 2.17.0
  - CUDA Toolkit 9.0
  - cuDNN 7.0.0 for CUDA 9.0
  - CMake 3.11.1
  - HDF5 1.10.2
  - Microsoft MPI v9.0.1, Microsoft MPI SDK v9.0.1
  - OpenNI 2.2.0.33 Beta
  - (Ensenso SDK 2.2.65) もし使うなら
  - (MATLAB 2017b) もし使うなら
- パッケージマネージャー使用だけどちょっと注意が必要
  - TensorFlow 1.7
- ソースから導入
  - bzip2 1.0.6 （ソースのみ）
  - zlib 1.2.11 （ソースのみ）
  - Boost 1.67.0
  - Qt 5.10.1
  - FreeGLUT 3.0.0
  - GLEW 2.1.0
  - Eigen 3.3.4
  - VTK 8.1.0
  - FLANN 1.9.1
  - QHull 2015.2 (7.2.0)
  - OpenCV 3.4.0
  - PCL 1.8.1
  - Bullet 2.87



# システム構成（参考）

|  要素 | スペック |
|---:|:---|
| CPU | Intel Core i7-6700K     |
| RAM | 64GB                    |
|  OS | Windows 10 Pro (64bit)  |
| GPU | NVIDIA GeForce GTX 1080 |



# 導入手順

## インストーラ使用
CUDAが最新のVisual Studioに対応していないため（VS2017のUpdateによっては対応しているが面倒），VS2015を使用する．
CUDA, cuDNNはバージョンに注意．TensorFlowがCUDA 9.0, cuDNN 7.0を指定しているため，バージョンを合わせる必要がある．

- Visual Studio Community 2015
  - https://www.visualstudio.com/ja/vs/older-downloads/

- Anaconda Anaconda 5.1 (Python 3.6)
  - https://www.anaconda.com/download/
  - 今回は`C:\Python\Anaconda3`にインストール．

- Git for Windows 2.17.0
  - https://gitforwindows.org/

- CUDA Toolkit 9.0
  - https://developer.nvidia.com/cuda-downloads

- cuDNN 7.0.0 for CUDA 9.0
  - https://developer.nvidia.com/rdp/cudnn-download

- CMake 3.11.1
  - https://cmake.org/

- HDF5 1.10.2
  - https://www.hdfgroup.org/downloads/hdf5
  - ユーザー登録が必要
  - 環境変数 %HDF5_ROOT% を C:\Program Files\HDF_Group\HDF5\1.10.2 に設定

- Microsoft MPI v9.0.1, Microsoft MPI SDK v9.0.1
  - https://msdn.microsoft.com/ja-jp/library/bb524831.aspx

- OpenNI 2.2.0.33 Beta
  - https://structure.io/openni

- (Ensenso SDK 2.2.65) もし使うなら
  - https://www.ensenso.com/support/sdk-download/

- (MATLAB 2017b) もし使うなら



## TensorFlow 1.7
（参考: https://www.tensorflow.org/install/install_windows ）

1. AnacondaでPython3.5の環境を作る
  1. `> conda create -n tensorflow pip python=3.5`
  1. `> activate tensorflow`
1. `> pip install --ignore-installed --upgrade tensorflow-gpu`
1. TensorFlowが動作することを確認．まずPythonインタプリタ起動
    1. `> python`
    1. インタプリタ上で以下を走らせてみる

    ```
    > import tensorflow as tf
    > hello = tf.constant('Hello, TensorFlow!')
    > sess = tf.Session()
    > print(sess.run(hello))
    ```

    `b'Hello, TensorFlow!'`が出ていればとりあえずOK．`(Ctrl)+Z`で抜ける



## bzip2 1.0.6 （ソースのみ）

1. C:\lib\bzip2を作成
1. http://www.bzip.org/downloads.html からソースをダウンロードしてC:\lib\bzip2\srcに解凍



## zlib 1.2.11 （ソースのみ）

1. C:\lib\zlibを作成
1. http://zlib.net/ からソースをダウンロードしてC:\lib\zlib\srcに解凍



## Boost 1.67.0
（参考: https://gist.github.com/UnaNancyOwen/d879a41710e9c05025f8 ）

1. C:\lib\Boost\を作成
1. http://www.boost.org/users/download/ からソースをダウンロード，C:\lib\Boost\srcに解凍
1. C:\lib\Boost\srcに移動
1. VS 2015 用 x64 Native Tools コマンド プロンプトを起動，以降はこのプロンプト上で実行
1. `> bootstrap.bat`
1. project-config.jamに以下を追記
  
    ```
    using mpi ;
    ```

1. `> b2.exe toolset=msvc-14.0 address-model=64 --build-dir="C:/lib/Boost/build" -s BZIP2_SOURCE="C:/lib/bzip2/src" -s ZLIB_SOURCE="C:\lib\zlib\src" -s NO_ZLIB=0 -s NO_BZIP2=0 -j7`
（-jで並列数指定，コア数以下に設定すると良さげ．Pythonは自動で見つけてくれるようになったっぽい．）
1. `> b2.exe toolset=msvc-14.0 address-model=64 --build-dir="C:/lib/Boost/build" install --prefix="C:/lib/Boost/install"`
1. TensorFlow環境でも使うため，Python3.5用のBoost.PythonとBoost.Numpyを入れる．project-config.jamの

    ```
    using mpi ;
    ```

    を削除し以下を追記 （環境に合わせて適宜パスは変更）

    ```
    using python : 3.5 : "C:/Python/Anaconda3/envs/tensorflow/python.exe" : "C:/Python/Anaconda3/envs/tensorflow/include" : "C:/Python/Anaconda3/envs/tensorflow/libs" ;
    ```
1. `> ./b2.exe toolset=msvc-14.0 address-model=64 --build-dir="C:/lib/Boost/build" -j7`
1. `> ./b2.exe toolset=msvc-14.0 address-model=64 --build-dir="C:/lib/Boost/build" install --prefix="C:/lib/Boost/install"`
1. 環境変数 %BOOST_ROOT% を C:\lib\Boost\install に設定



## Qt 5.10.1
（参考: https://blog.kintarou.com/2016/03/28/bulding_qt/ ）
今回はソースから入れましたが，おすすめしません．Qtはバイナリで入れた方が良いと思います

1. C:\lib\Qtを作成
1. https://www1.qt.io/offline-installers/ からソースをダウンロード，C:\lib\Qt\srcに解凍
1. C:\lib\Qt\srcに移動
1. VS 2015 用 x64 Native Tools コマンド プロンプトを起動，以降はこのプロンプト上で実行
1. `> configure.bat -developer-build -confirm-license -opensource -nomake examples -nomake tests -opengl desktop -no-warnings-are-errors -prefix "C:/lib/Qt/install" -skip webengine`
1. どっかからjom.exeを見つけてくる （Qtのバイナリパッケージから拾ってくるのが一番楽）．コンパイルが遅くて良ければjomの代わりにnmakeでも良い（らしい，未確認）
1. `> jom`
1. `> jom intall`
1. 環境変数 %QT_DIR% を C:\lib\Qt\install\lib\cmake に設定
1. PATH に C:\lib\Qt\install\bin を追加



## FreeGLUT 3.0.0

1. C:\lib\Freeglutを作成し移動
1. http://freeglut.sourceforge.net/ からソースをダウンロード，C:\lib\Freeglut\srcに解凍
1. CMake
    - src: C:\lib\Freeglut\src
    - build: C:\lib\Freeglut\build
1. Configure （変更点のみ．各自の環境に合わせて確認する）
    - CMAKE_INSTALL_PREFIX: C:/lib/Freeglut/install
    - INSTALL_PDB: no
1. 環境変数 %GLUT_ROOT_PATH% を C:\lib\Freeglut\install に設定
1. PATH に C:\lib\Freeglut\install\bin を追加



## GLEW 2.1.0

1. C:\lib\GLEWを作成
1. http://glew.sourceforge.net/ からソースをダウンロード，C:\lib\Qt\GLEW\srcに解凍．
    GitHubのリポジトリには含まれていないファイルがあるので必ずzipで．
1. C:\lib\GLEW\srcに移動
1. CMake
    - src: C:\lib\GLEW\src\build\cmake
    - build: C:\lib\GLEW\build
1. Configure （変更点のみ．各自の環境に合わせて確認する）
    - CMAKE_INSTALL_PREFIX: C:/lib/GLEW/install
1. Generate & Open Project
1. DebugでALL_BUILD, INSTALLを順にビルド
1. ReleaseでALL_BUILD, INSTALLを順にビルド
1. 環境変数 %GLEW_ROOT% を C:\lib\GLEW\install に設定
1. Pathに C:\lib\GLEW\install\bin を追加



## Eigen 3.3.4
（参考: https://gist.github.com/UnaNancyOwen/08e5a9b8f5979ed0077c ）

1. C:\lib\Eigen\を作成し移動
1. `> git clone https://github.com/eigenteam/eigen-git-mirror.git src`
1. `> cd src`
1. `> git checkout 3.3.4`
1. CMake
    - src: C:\lib\Eigen\src
    - build: C:\lib\Eigen\build
1. Configure （変更点のみ．各自の環境に合わせて確認する）
    - CMAKE_INSTALL_PREFIX: C:/lib/Eigen/install/
1. Generate & Open Project
1. DebugでALL_BUILD, INSTALLを順にビルド
1. ReleaseでALL_BUILD, INSTALLを順にビルド
1. 環境変数 %EIGEN_ROOT% を C:\lib\Eigen\install に設定



## VTK 8.1.0
（参考: https://gist.github.com/UnaNancyOwen/9d16060714ba9b28f90e ）

1. C:\lib\VTK\を作成し移動
1. `> git clone https://github.com/Kitware/VTK.git src`
1. `> cd src`
1. `> git checkout v8.1.0`
1. CMake
    - src: C:\lib\VTK\src
    - build: C:\lib\VTK\build
1. Configure （変更点のみ．各自の環境に合わせて確認する）
    - CMAKE_DEBUG_POSTFIX: \_d
    - BUILD_TESTING: no
    - CMAKE_CXX_MP_FLAG: yes
    - CMAKE_INSTALL_PREFIX: C:/lib/VTK/install
    - VTK_GROUP_Qt: yes
1. Generate & Open Project
1. DebugでALL_BUILD, INSTALLを順にビルド
1. ReleaseでALL_BUILD, INSTALLを順にビルド
1. 環境変数 %VTK_DIR% を C:\lib\VTK\install に設定
1. Pathに C:\lib\VTK\install\bin を追加



## FLANN 1.9.1
（参考: https://gist.github.com/UnaNancyOwen/1e3fced09e4430ad0b7b ）

1. C:\lib\Flann\ を作成し移動
1. `> git clone git://github.com/mariusmuja/flann.git src`
1. `> cd src`
1. `> git checkout 1.9.1`
1. CMake
    src: C:\lib\Flann\src
    build: C:\lib\Flann\build
1. Configure （変更点のみ．各自の環境に合わせて確認する）
    - CMAKE_DEBUG_POSTFIX: \_d
    - CMAKE_INSTALL_PREFIX: C:/lib/GLEW/install
    - BUILD_CUDA_LIB: yes
    - BUILD_DOC: no
    - BUILD_MATLAB_BINDINGS: no
    - BUILD_PYTHON_BINDINGS: no
    - BUILD_EXAMPLES: no
    - BUILD_TESTS: no
1. Generate & Open Project
1. DebugでALL_BUILD, INSTALLを順にビルド
1. ReleaseでALL_BUILD, INSTALLを順にビルド
1. 環境変数 %FLANN_ROOT% を C:\lib\flann\install に設定
1. Pathに C:\lib\flann\install\bin を追加



## QHull 2015.2 (7.2.0)
（参考: https://gist.github.com/UnaNancyOwen/ffbe6b05ee0101620d3c ）

1. C:\lib\Qfull\ を作成し移動
1. `> git clone https://github.com/qhull/qhull.git src`
1. `> cd src`
1. `> git checkout 5a79a0009454c86e9848646b3c296009125231bf` これは2015.2 (7.2.0)で，tagなどがないのでHash値で指定
1. CMake
    - src: C:\lib\Qfull\src
    - build: C:\lib\Qfull\build
1. Configure （変更点のみ．各自の環境に合わせて確認する）
   - CMAKE_DEBUG_POSTFIX: \_d
   - CMAKE_INSTALL_PREFIX: C:/lib/Qfull/install
1. Generate & Open Project
1. DebugでALL_BUILD, INSTALLを順にビルド
1. ReleaseでALL_BUILD, INSTALLを順にビルド
1. 環境変数%QHULL_ROOT%: C:\lib\Qfull\install
1. PathにC:\lib\Qfull\install\binを追加



## OpenCV 3.4.0
（参考: http://qiita.com/bodyscrap/items/68b38f58f492bc645da5 ）
（参考: http://qiita.com/emakryo/items/5e2c79c2a18e60dd212f ）
（参考: http://qiita.com/fukushima1981/items/fae7d40123bfdf426624 ）

1. C:\lib\OpenCV\ を作成し移動
1. `> git clone https://github.com/Itseez/opencv.git src`
1. `> cd src`
1. `> git checkout 3.4.0`
1. `> cd ..`
1. `> git clone https://github.com/Itseez/opencv_contrib.git src_contrib`
1. `> cd src_contrib`
1. `> git checkout 3.4.0`
1. CMake
    - src: C:\lib\OpenCV\src
    - build: C:\lib\OpenCV\build
1. Configure （変更点のみ．各自の環境に合わせて確認する，CUDA_ARCH_BINはVisual Studio上のNsightからSystem Infoで確認するのが楽）
   -  CMAKE_INSTALL_PREFIX: C:/lib/OpenCV/install
   -  CUDA_ARCH_BIN: 6.1
   -  BUILD_opencv_python3: no
   -  WITH_QT yes
   -  HDF5_C_LIBRARY: C:/Program Files/HDF_Group/HDF5/1.10.2/lib/hdf5.lib
   -  HDF5_INCLUDE_DIRS: C:/Program Files/HDF_Group/HDF5/1.10.2/include
   -  WITH_OPENNI2: yes
   -  WITH_OPENGL: yes
   -  OPENCV_EXTRAMODELUES_PATH: C:/lib/OpenCV/src_contrib/modules
   -  EIGEN_INCLUDE_PATH: C:/lib/Eigen/install/include/eigen3
   -  OPENCV_ENABLE_NONFREE: yes
1. Generate & Open Project
1. DebugでALL_BUILD, INSTALLを順にビルド
1. CMakeで再度Configure（Python3のデバッグビルドを持っていないため，Pythonバインディングはリリースのみでビルドする）
  -  BUILD_opencv_python3: yes
1. Generate & Open Project
1. ReleaseでALL_BUILD, INSTALLを順にビルド（必要なら管理者権限でVisual Studioを起動）
1. 環境変数 %OPENCV_DIR% を C:\lib\OpenCV\install に設定
1. Pathに C:\lib\OpenCV\install\bin と C:\lib\OpenCV\install\x64\vc14\bin を追加



## PCL 1.8.1
（参考: https://gist.github.com/UnaNancyOwen/59319050d53c137ca8f3）

1. C:\lib\PCL\を作成し移動
1. `> git clone https://github.com/PointCloudLibrary/pcl.git src`
1. `> cd src`
1. `> git checkout pcl-1.8.1`
1. io\src\ensenso_grabber.cppの464行目と509行目の `uint` を `unsigned int` に変更
1. visualization\include\pcl\visualization\impl\pcl_visualizer.hppの1431行目，1467行目，1543行目 `am_it->second.actor->GetMapper ()->ImmediateModeRenderingOff ();` をそれぞれコメントアウト

1. visualization\src\pcl_visualizer.cppの1149行目，1229行目，1543行目 `mapper->ImmediateModeRenderingOff ();` をそれぞれコメントアウト
1. CMake
    - src: C:\lib\PCL\src
    - build: C:\lib\PCL\build
1. Configure （変更点のみ．各自の環境に合わせて確認する）
    - CMAKE_INSTALL_PREFIX: C:/lib/PCL/install
    - FLANN_LIBRARY_DEBUG: C:/lib/Flann/install/lib/flann_cpp_s_d.lib
    - BUILD_CUDA: yes
    - BUILD_GPU: yes
    - BUILD_examples: yes
    - BUILD_cuda_apps: yes
    - BUILD_cuda_io: yes
    - BUILD_gpu_kinfu: yes
    - BUILD_gpu_kinfu_large_scale: yes
    - BUILD_gpu_surface: yes
    - BUILD_gpu_tracking: yes
    - CUDA_ARCH_BIN: 6.1
1. Generate & Open Project
1. DebugでALL_BUILD, INSTALLを順にビルド
1. ReleaseでALL_BUILD, INSTALLを順にビルド
1. 環境変数 %PCL_ROOT% を C:\lib\PCL\install に設定
1. Pathに C:\lib\PCL\install\bin を追加



## Bullet 2.87

1. C:\lib\Bullet\を作成し移動
1. `> git clone https://github.com/bulletphysics/bullet3.git src`
1. `> cd src`
1. `> git checkout 2.87`
1. CMake
    - src: C:\lib\Bullet\src
    - build: C:\lib\Bullet\build
1. Configure
    - CMAKE_INSTALL_PREFIX: C:/lib/Bullet/install
    - LIBRARY_OUTPUT_PATH: C:/lib/Bullet/install/lib
    - INSTALL_LIBS: yes
    - USE_MSVC_RUNTIME_LIBRARY_DLL: yes
    - BUILD_BULLET2_DEMOS: no
    - BUILD_CPU_DEMOS: no
    - BUILD_OPENGL3_DEMOS: no
    - BUILD_UNIT_TESTS: no
1. Generate & Open Project
1. DebugでALL_BUILD, INSTALLを順にビルド
1. ReleaseでALL_BUILD, INSTALLを順にビルド
1. 環境変数 %BULLET_ROOT% を C:\lib\Bullet\install\lib\cmake に設定



# おわりに
一年間でどのライブラリがどれくらい更新されているか分かるので楽しいですね．