OpenCV完全体コンパイル難易度ランキング

#OpenCV完全体とは
OpenCVのすべての機能を有効化するべく，様々な外部ライブラリを吸収してした変化した，OpenCVの最終段階のこと．
cmakeにて練成される．
関東のとある勉強会中で発言されたネタに由来する．
https://twitter.com/UnaNancyOwen/status/43956620241285120

#OpenCVのライブラリに関連するライブラリ＆コンパイルオプション一覧
この記事は，前提知識としてOpenCVをcmakeしたことがある人を想定しています．cmakeを使った環境構築に関する詳細は[ここ](http://www.buildinsider.net/small/opencv/003)を参照してください．

必要な外部ライブラリは実に多岐に渡ります．すべてを網羅しきっているわけではないですが主要なものを列挙します．


以下は，[公式](http://opencv.org/)から配布されているOpenCVのインストーラでデフォルトで有効化されているもの一覧です．

* 普通のモジュール
* ドキュメント生成(Doxgen,graphviz)
* CUDA
* Intel IPP
* Java バインディング
* Python バインディング
* OpenMPやConcurrencyなどのデフォルト並列化フレームワーク
* 画像のIO（ZLib, JPEG, WEBP, PNG, TIFF, JPEG 2000, OpenEXR, GDAL, GDCM）
* FFMPEG, DirectShow（videoのIOのうちFFMPEGはわりと安定気味．一時期コンパイルエラー祭りしていましたが．）
* SSE,SSE2, NEONなどの128bitのベクトル演算最適化の有効化

また，有効には「なっていない」代表的な機能一覧はこちらです．

* Contribモジュール各種
* Qt
* VTK
* AVX/AVX2など演算最適化の有効化
* OpenCL
* OpenVX
* OpenGL
* Eigen
* Lapack([OpenBLAS](http://www.openblas.net/)高速な行列演算ライブラリ　Lapack高速化用)
* AMDのOpenCL要数値計算ライブラリ
* CUDA FFT, CUDA BLAS
* custom HAL
* 適切な並列化フレームワークの選択　TBB/OpenMP/Concurrency
* GStreamer
* OpenNI.OpenNI2,Intel PerC
* 一部の画像のIO（GDAL, GDCM） GDCMはCT画像などのDSICOM用
* Tesseract-ocr連携

また，Contribモジュールで別途必要な環境などの一覧です．

* Matlab
* SfMモジュールのための Glogなど→詳しくは別の日のカレンダーで出ててくれるとうれしいです．
* Caffe(cnnのモジュール用)
* non-freeのモジュール

#難易度表と評価

5段階評価で行います．１が簡単で5があきらめることが必要なもの
注意：デフォルトであろうが，cmakeを使ったらもう一度コンパイルする必要があります．
注意:windows編です．linuxの場合は何度に変動が多数あります．
また，最新のトランクのOpenCVをcmake3.7.0でジェネレートしたプロジェクトをVisual Studio 2015でコンパイルすることを想定しています．

##難易度１：チェックを入れれば安心してコンパイルできるもの

安心．コンパイルが通らない先頭ブランチでもない限りエラーが出ることはありません．
どれも適切な環境をインストールしていれば自動的に全部やってくれます．
これだけの基本セットがあれば十分なひとは多数．

* 普通のモジュール
* ドキュメント生成(Doxgen,graphviz)
* Java バインディング
* Python バインディング
* Intel IPP
* FFMPEG
* OpenMPやConcurrencyなどのデフォルト並列化フレームワーク
* SSE,SSE2などの128bitのベクトル演算最適化の有効化
* 画像のIO（ZLib, JPEG, WEBP, PNG, TIFF, JPEG 2000, OpenEXR, GDAL, GDCM）

ただし，画像のIOのうちGDAL, GDCMについては，使ったことはもちろん，環境構築をためしたことすらないため詳細が分かりません．

##難易度２：パスが自動で通らないこともあるが必ずコンパイルが通るもの
パスさえ，通せば必ず通るでしょう．

* Eigen
* OpenGL
* TBB
* HDF5
* Matlab (レベル１にしなかった理由は金銭的な理由．インストールするよりも買う行為の敷居が高い)
* 適切な並列化フレームワークの選択　TBB/OpenMP/Concurrency
* 一部の例外を除いたcontrib

インストールすれば動く，Matlab連携モジュールをレベル１にしなかった理由は，金銭的な理由．インストールするよりも買う行為の敷居が高いからです．

適切な並列化プレーワークを選ぶのは難しいです．
実際にいろいろな環境を使ってみて自分のOSにあったものを使いましょう．
おそらくLinuxならTBBが，WindowsならConcurrencyが最速です．
マックのことは知りません．
間違ってもCストリップという存在をつかってはいけません．何度やっても速くなりません．．．

また，HDF5は入れてみているものの，使ったことがありません．

##難易度3：意味不明なバグがでるが，バージョンを下げれば大体コンパイルが通るメジャーなライブラリを使うもの
ユーザー人口の多さからトラブルシューティングも簡単．
UMatがあるからか，OpenCLはいつも通るイメージ．

注意：OpenCL関連のAMD OpenCL FFT BLAS（http://developer.amd.com/tools-and-sdks/opencl-zone/amd-accelerated-parallel-processing-app-sdk/）のモジュールの開発は終了しています．
http://developer.amd.com/tools-and-sdks/archive/compute/amd-core-math-library-acml/

* OpenCL
* OpenNI，OpenNI2,Intel PerCなどのデプスカメラ関連


試してないけどここくらいに収まりそうなもの．テストしようとしていて，時間が無くなった．多分ここくらいに落ち着きそう．

* customHALとか気になる
* OpenVX

* GStreamer

##難易度4：コードの魔改造が必要になるときがある．

* Qt
* VTK
* cvvモジュール
* Tesseract-ocr連携
* SfMモジュールのための Glogなど
* cnnモジュール
* AVX/AVX2など演算最適化の有効化
* NEON

VTKとQtがなかなか最新のVisual Studioに対応しません．
また，Qtのビルド修行はなかなか乙なものがあります．
しかもVTKとQtに依存関係があることが多くコンパイルが通らないときが多々あります．
~~例えば現在の最新版のVTK7.1とQt5.7の組み合わせだとコンパイルがなぜか通らなかったのでVTK7.0とQt5.7の組み合わせにしました．~~
OpenCV3.2でVTK7.1とQt5.7の組み合わせの動作を確認しました．

vtkはvizモジュールに必要なのですが，qtによるGUIの拡張のほうが優先度が高いため，vizモジュールが犠牲になることが多々あります．

contribu内のcvvモジュールはビジュアルデバッガモジュールです．別途解説を書きたくなるくらい有効です．
ですが，Qtを変な風につかっているせいか，いつもなぜかどこかがコンパイルエラーしています．
現在は症状がかるく，一部文字化け部分をコメントアウトするだけでコンパイルが通ります
（opencv_cvvプロジェクトのSrc\stfl\stringutils.cppを開く．77～79行目のあたりに含まれている「Ü，Ö，Ä」といったウムラウト文字がエラーの原因になっているので，該当部分をコメントアウトする．）

Tesseract-ocr連携は，コードのいろんな#defienや変数を魔改造してWindowsで走らせました．どこを変更したかは覚えてません．

SfMモジュールやcnnのモジュールはwindowsでコンパイルするには必要なライブラリを用意すること自体が大変です．
そのライブラリさえ有効化されれば簡単に入れられるかもしれません．
OpenCV-3.1のsfmモジュール[前編]で詳しい解説があるかもしれません．

AVXなどの最新のベクトル演算を有効化するとVisual Studioの最適化コンパイルが暴走してコンパイルを完走させることが出来ないことが多いです．おそらくWindowsを対象にしてこのあたりの調整するのが最終段階に近いところでしかやらないからでしょう．
（速いコードがほしければintelコンパイラ買えば良いじゃない）

NEONは実機でテストしたかどうかが怪しいです．

* [OpenBLAS](http://www.openblas.net/)

高速な行列演算ライブラリ　With Lapackが有効化される．EIGENよりも速いと噂．
cmakeでワーニングが大量にでて真っ赤になる.
実際動かそうとするとコンパイルエラーの嵐で動かない．．．
OpenCVC3.2で導入されたばかりなのでデバッグ待ち．

##難易度5：コンパイラに対するコミットが必要なレベル

* CUDA対応
* CUDA FFT, CUDA BLAS

まず，Visual Studioのバージョンが適切にCUDAに対応するまで一切コンパイルできません．
また長時間のコンパイル修行が必要とされます．
コンパイルのオプションが動くかどうかをチェックするために必ずここをオフにすることが多いです．
また，適切にcudaの[バージョンを指定](http://tessy.org/wiki/index.php?OpenCV2.4.10.1%A4%CE%A5%D3%A5%EB%A5%C9#c03bbddb)してコンパイル時間を短くする努力が必要です．

CUDAさえコンパイルできればCUDA FFT, CUDA BLASはチェックを入れるだけで動くことでしょう．

また，現在Visual Studio2015 + Cuda8.0でコンパイルが可能なことを確認しています．
ただし，performance testの関数がコンパイルエラーします．

最後に，現在同じようなOpenCLのモジュールがある中で，本当にCUDAモジュールが必要なのか？という疑念は当然でしょう．
しかし，ただ完全体にしたいだけではないのか？という疑念を捨て去り，そこにCUDAがあるからという想いでコンパイルしましょう．

#まとめ
その他にもいくつか抜けがあるため，気付き次第しばらくの間ここに情報をまとめたいと思います．
また，いろんな情報募集してます．

#build information
```
FP16: Compiler support is available
A library with BLAS API not found. Please specify library location.
LAPACK requires BLAS
A library with LAPACK API not found. Please specify library location.
found IPP (ICV version): 9.0.1 [9.0.1]
at: C:/opencv/src/3rdparty/ippicv/unpack/ippicv_win
CUDA detected: 8.0
CUDA NVCC target flags: -gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_52,code=sm_52;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_61,code=sm_61;-D_FORCE_INLINES
Could NOT find PythonInterp (missing:  PYTHON_EXECUTABLE) (Required is at least version "2.7")
Could NOT find PythonInterp (missing:  PYTHON_EXECUTABLE) (Required is at least version "2.6")
Could NOT find PythonInterp (missing:  PYTHON_EXECUTABLE) (Required is at least version "3.4")
Could NOT find PythonInterp (missing:  PYTHON_EXECUTABLE) (Required is at least version "3.2")
Could NOT find JNI (missing:  JAVA_AWT_LIBRARY JAVA_JVM_LIBRARY JAVA_INCLUDE_PATH JAVA_INCLUDE_PATH2 JAVA_AWT_INCLUDE_PATH) 
Found VTK ver. 7.1.0 (usefile: C:/VTK/lib/cmake/vtk-7.1/UseVTK.cmake)
Caffe:   NO
Protobuf:   NO
Glog:   NO
Module opencv_sfm disabled because the following dependencies are not found: Glog/Gflags
Tesseract:   NO
Check contents of vgg_generated_48.i ...
Check contents of vgg_generated_64.i ...
Check contents of vgg_generated_80.i ...
Check contents of vgg_generated_120.i ...
Check contents of boostdesc_bgm.i ...
Check contents of boostdesc_bgm_bi.i ...
Check contents of boostdesc_bgm_hd.i ...
Check contents of boostdesc_binboost_064.i ...
Check contents of boostdesc_binboost_128.i ...
Check contents of boostdesc_binboost_256.i ...
Check contents of boostdesc_lbgm.i ...

General configuration for OpenCV 3.1.0-dev =====================================
  Version control:               unknown

  Platform:
    Timestamp:                   2016-12-03T08:13:13Z
    Host:                        Windows 10.0.14393 AMD64
    CMake:                       3.7.0
    CMake generator:             Visual Studio 14 2015 Win64
    CMake build tool:            C:/Program Files (x86)/MSBuild/14.0/bin/MSBuild.exe
    MSVC:                        1900

  C/C++:
    Built as dynamic libs?:      YES
    C++ Compiler:                C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe  (ver 19.0.24215.1)
    C++ flags (Release):         /DWIN32 /D_WINDOWS /W4 /GR /EHa  /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi  /wd4251 /wd4324 /wd4275 /wd4589 /MP4  /MD /O2 /Ob2 /DNDEBUG  /Zi
    C++ flags (Debug):           /DWIN32 /D_WINDOWS /W4 /GR /EHa  /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi  /wd4251 /wd4324 /wd4275 /wd4589 /MP4  /D_DEBUG /MDd /Zi /Ob0 /Od /RTC1 
    C Compiler:                  C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe
    C flags (Release):           /DWIN32 /D_WINDOWS /W3  /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi    /MP4  /MD /O2 /Ob2 /DNDEBUG  /Zi
    C flags (Debug):             /DWIN32 /D_WINDOWS /W3  /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi    /MP4  /D_DEBUG /MDd /Zi /Ob0 /Od /RTC1 
    Linker flags (Release):      /machine:x64  /INCREMENTAL:NO  /debug
    Linker flags (Debug):        /machine:x64  /debug /INCREMENTAL 
    ccache:                      NO
    Precompiled headers:         YES
    Extra dependencies:          C:/Program Files/HDF_Group/HDF5/1.8.18/lib/hdf5.lib comctl32 gdi32 ole32 setupapi ws2_32 Qt5::Core Qt5::Gui Qt5::Widgets Qt5::Test Qt5::Concurrent Qt5::OpenGL vfw32 vtkRenderingOpenGL2 vtkCommonCore vtksys vtkCommonDataModel vtkCommonMath vtkCommonMisc vtkCommonSystem vtkCommonTransforms vtkCommonExecutionModel vtkIOImage vtkDICOMParser vtkmetaio vtkzlib vtkjpeg vtkpng vtktiff vtkImagingCore vtkRenderingCore vtkCommonColor vtkCommonComputationalGeometry vtkFiltersCore vtkFiltersGeneral vtkFiltersGeometry vtkFiltersSources vtkglew vtkInteractionStyle vtkFiltersExtraction vtkFiltersStatistics vtkImagingFourier vtkalglib vtkRenderingLOD vtkFiltersModeling vtkIOPLY vtkIOCore vtkFiltersTexture vtkRenderingFreeType vtkfreetype vtkIOExport vtkRenderingGL2PSOpenGL2 vtkgl2ps vtkIOGeometry vtkIOLegacy glu32 opengl32 cudart nppc nppi npps cublas cufft -LIBPATH:C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v8.0/lib/x64
    3rdparty dependencies:       libprotobuf zlib libjpeg libwebp libpng libtiff libjasper IlmImf

  OpenCV modules:
    To be built:                 cudev core cudaarithm flann hdf imgproc ml reg surface_matching video viz cudabgsegm cudafilters cudaimgproc cudawarping dnn fuzzy imgcodecs photo shape videoio cudacodec highgui objdetect plot ts xobjdetect xphoto bgsegm bioinspired dpm face features2d line_descriptor saliency text calib3d ccalib cudafeatures2d cudalegacy cudaobjdetect cudaoptflow cudastereo cvv datasets rgbd stereo superres tracking videostab xfeatures2d ximgproc aruco optflow phase_unwrapping stitching structured_light
    Disabled:                    contrib_world world
    Disabled by dependency:      -
    Unavailable:                 cnn_3dobj java matlab python2 python3 sfm

  Non-free algorithms are enabled

  Windows RT support:            NO

  GUI: 
    QT 5.x:                      YES (ver 5.7.0)
    QT OpenGL support:           YES (Qt5::OpenGL 5.7.0)
    OpenGL support:              YES (glu32 opengl32)
    VTK support:                 YES (ver 7.1.0)

  Media I/O: 
    ZLib:                        build (ver 1.2.8)
    JPEG:                        build (ver 90)
    WEBP:                        build (ver 0.3.1)
    PNG:                         build (ver 1.6.24)
    TIFF:                        build (ver 42 - 4.0.2)
    JPEG 2000:                   build (ver 1.900.1)
    OpenEXR:                     build (ver 1.7.1)
    GDAL:                        NO
    GDCM:                        NO

  Video I/O:
    Video for Windows:           YES
    DC1394 1.x:                  NO
    DC1394 2.x:                  NO
    FFMPEG:                      YES (prebuilt binaries)
      codec:                     YES (ver 57.48.101)
      format:                    YES (ver 57.41.100)
      util:                      YES (ver 55.28.100)
      swscale:                   YES (ver 4.1.100)
      resample:                  NO
      gentoo-style:              YES
    GStreamer:                   NO
    OpenNI:                      NO
    OpenNI PrimeSensor Modules:  NO
    OpenNI2:                     NO
    PvAPI:                       NO
    GigEVisionSDK:               NO
    DirectShow:                  YES
    Media Foundation:            NO
    XIMEA:                       NO
    Intel PerC:                  NO

  Parallel framework:            Concurrency

  Other third-party libraries:
    Use IPP:                     9.0.1 [9.0.1]
         at:                     C:/opencv/src/3rdparty/ippicv/unpack/ippicv_win
    Use IPP Async:               NO
    Use Lapack:                  NO
    Use Eigen:                   YES (ver 3.3.0)
    Use Cuda:                    YES (ver 8.0)
    Use OpenCL:                  YES
    Use OpenVX:                  NO
    Use custom HAL:              NO

  NVIDIA CUDA
    Use CUFFT:                   YES
    Use CUBLAS:                  YES
    USE NVCUVID:                 NO
    NVIDIA GPU arch:             50 52 60 61
    NVIDIA PTX archs:
    Use fast math:               NO

  OpenCL:                        <Dynamic loading of OpenCL library>
    Include path:                C:/opencv/src/3rdparty/include/opencl/1.2
    Use AMDFFT:                  NO
    Use AMDBLAS:                 NO

  Python 2:
    Interpreter:                 NO

  Python 3:
    Interpreter:                 NO

  Python (for build):            NO

  Java:
    ant:                         NO
    JNI:                         NO
    Java wrappers:               NO
    Java tests:                  NO

  Matlab:                        NO

  Documentation:
    Doxygen:                     C:/Program Files/doxygen/bin/doxygen.exe (ver 1.8.12)

  Tests and samples:
    Tests:                       YES
    Performance tests:           YES
    C/C++ Examples:              NO

  Install path:                  C:/opencv/src/build/install

  cvconfig.h is in:              C:/opencv/src/build
-----------------------------------------------------------------
```