OpenCVのビルド(CUI編)

OpenCVのビルドってめんどくさいよね

2016年3月の記事で「OpenCV3.1.0のビルド方法(GUI編)」というのを掲載しました。この方法はOpenCVをビルドするオーソドックスな方法です。
ただ、CMakeGUIを使用してオプションを設定し何度も [Configure] をしないとプロジェクトが作れないという煩わしさがあり、そのためにPCに張り付いて画面でポチポチしないといけません。特に微妙に設定を変えて同じバージョンのビルドを作ろうとするとその煩わしさは半端ありません。昔は夜なべしてポチポチやっていたこともあります。でも、なんだかビルド作業にばかり時間がかかり、そこで疲弊して気がついたらOpenCVのテストはもういいやってなったこともしばしばです。

めんどくさいことは自動化できないか

で、なんとかコマンドプロンプトでバッチファイル組んで自動化できないかって思ってしまう訳なんですよ。これはマジOpenCVのVer1のころから思っていました。まあ、その頃は画像処理のコードは自分でゴリゴリ書いていた(今でも書いているけど)のでOpenCVは時間があったら試してみようぐらいのつもりだったのでコマンドラインでのCMakeの使い方調べてバッチファイル書くまでのモチベーションがなかったです。
ちょうど上記の記事を書く前に機械学習や深層学習を真面目に取り組まないとまずいなということになって、OpenCV3をいじりはじめて再びビルドの煩わしさに直面したわけです。「やっぱり、自動化必要だわ」ということになり、いろいろと調べた結果、いくつかヒントになる記事を見つけました。

[blogcard url="https://www.atmarkit.co.jp/ait/articles/1704/10/news134.html"]

[blogcard url="https://github.com/atinfinity/lab/wiki/OpenCVビルド用スクリプト"]

もっと自動化したい

特に「OpenCVビルド用スクリプト」には各バージョン毎のビルドバッチが掲載されていたので、はじめの頃はこれをそのまま使用させてもらいました。
処理の流れはCMakeでプロジェクトを作成してVisualStudioでビルドするという一連の流れをコマンドラインでやっているだけです。
このバッチが使えたことで、あの煩わしいポチポチ作業からまずは解放されました。

「OpenCVビルド用スクリプト」 に掲載されてるビルドバッチはVisual Studioのバオジョンごと、CUDAやQtの有無ごとにバッチファイルを準備しているので、これをなんとか一つのバッチファイルで制御したいと思うわけです。
下記の7つを引数で切り替えることにしました。

  • Visual Studioのバージョン
  • DLLとstaticlib
  • x64とx86
  • CUDAの使用有無
  • Qtの使用有無
  • worldライブラリにまとめるか個別ライブラリに分けるか
  • サンプルのビルドのオンオフ

これでバッチファイル組んで夜に実行させておけば朝にはビルドが完成しているというてはずになりました。

なんかHDDの容量がひっ迫しているんですけど

これでしばらく作業をしているとやけにハードディスクの容量が減るのが速いことに頭を悩ませることになりました。ビルドするとオブジェクトファイルなどの中間生成物が大量に吐き出されるため一度ビルドすると数百GBのファイルができあがります。最終的に使うファイルはヘッダファイルとライブラリ(DLL、LIB)ファイル、ユーティリティやサンプルのEXEファイルと設定ファイルぐらいなのでそれだけ取り出してしまえばあとは破棄してもいいんですが、貧乏性なんですね。せめてソースファイルときれいな状態のプロジェクトファイルはアーカイブしておきたいじゃないですか。ということで、中間生成物も削除できるようにしてみました。
buildフォルダを作成してその中にプロジェクトファイル、ビルドファイルを生成するようにしていたのですが、 buildtempフォルダ を作ってビルド前に プロジェクトファイル をビルド後に使用するファイルを buildtempフォルダ にコピーするようにしました。これで作業終了後 buildフォルダ を削除すると中間生成物が削除されて、必要なファイルファイルだけが残るようになります。

それでも定期的に見直す必要がある

はじめの頃はOpenCVの新しいバージョンが出るたびにバッチの内容を見直していましたが、現在は OpenCV 4のメジャーバージョンアップの時に見直しを入れたぐらいです。
やり方は一旦CMakeGUIでプロジェクトを作ってcmake.exe -Lでビルドオプションの一覧を抽出します。

H:\OpenCV\opencv410\buildtest>"C:\Program Files\CMake\bin\cmake.exe" -L
CMake Warning:
  No source or binary directory provided.  Both will be assumed to be the
  same as the current working directory, but note that this warning will
  become a fatal error in future CMake releases.


CMake Error: The source directory "H:/OpenCV/opencv410/buildtest" does not appear to contain CMakeLists.txt.
Specify --help for usage, or press the help button on the CMake GUI.
-- Cache values
ANT_EXECUTABLE:FILEPATH=ANT_EXECUTABLE-NOTFOUND
BUILD_CUDA_STUBS:BOOL=OFF
BUILD_DOCS:BOOL=OFF
BUILD_EXAMPLES:BOOL=OFF
BUILD_IPP_IW:BOOL=ON
BUILD_ITT:BOOL=ON
BUILD_JASPER:BOOL=ON
BUILD_JAVA:BOOL=ON
BUILD_JPEG:BOOL=ON
BUILD_LIST:STRING=
BUILD_OPENEXR:BOOL=ON
BUILD_PACKAGE:BOOL=ON
BUILD_PERF_TESTS:BOOL=ON
BUILD_PNG:BOOL=ON
BUILD_PROTOBUF:BOOL=ON
BUILD_SHARED_LIBS:BOOL=ON
BUILD_TBB:BOOL=OFF
BUILD_TESTS:BOOL=ON
BUILD_TIFF:BOOL=ON
BUILD_USE_SYMLINKS:BOOL=OFF
BUILD_WEBP:BOOL=ON
BUILD_WITH_DEBUG_INFO:BOOL=OFF
BUILD_WITH_DYNAMIC_IPP:BOOL=OFF
BUILD_WITH_STATIC_CRT:BOOL=ON
BUILD_ZLIB:BOOL=ON
BUILD_opencv_apps:BOOL=ON
BUILD_opencv_calib3d:BOOL=ON
BUILD_opencv_core:BOOL=ON
BUILD_opencv_dnn:BOOL=ON
BUILD_opencv_features2d:BOOL=ON
BUILD_opencv_flann:BOOL=ON
BUILD_opencv_gapi:BOOL=ON
BUILD_opencv_highgui:BOOL=ON
BUILD_opencv_imgcodecs:BOOL=ON
BUILD_opencv_imgproc:BOOL=ON
BUILD_opencv_java_bindings_generator:BOOL=ON
BUILD_opencv_js:BOOL=OFF
BUILD_opencv_ml:BOOL=ON
BUILD_opencv_objdetect:BOOL=ON
BUILD_opencv_photo:BOOL=ON
BUILD_opencv_python_bindings_generator:BOOL=ON
BUILD_opencv_stitching:BOOL=ON
BUILD_opencv_ts:BOOL=ON
BUILD_opencv_video:BOOL=ON
BUILD_opencv_videoio:BOOL=ON
BUILD_opencv_world:BOOL=OFF
CLAMDBLAS_INCLUDE_DIR:PATH=CLAMDBLAS_INCLUDE_DIR-NOTFOUND
CLAMDBLAS_ROOT_DIR:PATH=CLAMDBLAS_ROOT_DIR-NOTFOUND
CLAMDFFT_INCLUDE_DIR:PATH=CLAMDFFT_INCLUDE_DIR-NOTFOUND
CLAMDFFT_ROOT_DIR:PATH=CLAMDFFT_ROOT_DIR-NOTFOUND
CMAKE_CONFIGURATION_TYPES:STRING=Debug;Release
CMAKE_INSTALL_PREFIX:PATH=H:/OpenCV/opencv410/buildtest/install
CPU_BASELINE:STRING=SSE3
CPU_DISPATCH:STRING=SSE4_1;SSE4_2;AVX;FP16;AVX2;AVX512_SKX
CV_DISABLE_OPTIMIZATION:BOOL=OFF
CV_ENABLE_INTRINSICS:BOOL=ON
CV_TRACE:BOOL=ON
DC1394_INCLUDE:PATH=DC1394_INCLUDE-NOTFOUND
DC1394_LIBRARY:FILEPATH=DC1394_LIBRARY-NOTFOUND
EIGEN_INCLUDE_PATH:PATH=EIGEN_INCLUDE_PATH-NOTFOUND
ENABLE_BUILD_HARDENING:BOOL=OFF
ENABLE_CCACHE:BOOL=OFF
ENABLE_CONFIG_VERIFICATION:BOOL=OFF
ENABLE_FLAKE8:BOOL=OFF
ENABLE_IMPL_COLLECTION:BOOL=OFF
ENABLE_INSTRUMENTATION:BOOL=OFF
ENABLE_LTO:BOOL=OFF
ENABLE_NOISY_WARNINGS:BOOL=OFF
ENABLE_PIC:BOOL=ON
ENABLE_PRECOMPILED_HEADERS:BOOL=ON
ENABLE_PYLINT:BOOL=OFF
ENABLE_SOLUTION_FOLDERS:BOOL=ON
EXECUTABLE_OUTPUT_PATH:PATH=H:/OpenCV/opencv410/buildtest/bin
GSTREAMER_app_LIBRARY:FILEPATH=GSTREAMER_app_LIBRARY-NOTFOUND
GSTREAMER_base_LIBRARY:FILEPATH=GSTREAMER_base_LIBRARY-NOTFOUND
GSTREAMER_glib_INCLUDE_DIR:PATH=GSTREAMER_glib_INCLUDE_DIR-NOTFOUND
GSTREAMER_glib_LIBRARY:FILEPATH=GSTREAMER_glib_LIBRARY-NOTFOUND
GSTREAMER_glibconfig_INCLUDE_DIR:PATH=GSTREAMER_glibconfig_INCLUDE_DIR-NOTFOUND
GSTREAMER_gobject_LIBRARY:FILEPATH=GSTREAMER_gobject_LIBRARY-NOTFOUND
GSTREAMER_gst_INCLUDE_DIR:PATH=GSTREAMER_gst_INCLUDE_DIR-NOTFOUND
GSTREAMER_gstreamer_LIBRARY:FILEPATH=GSTREAMER_gstreamer_LIBRARY-NOTFOUND
GSTREAMER_pbutils_LIBRARY:FILEPATH=GSTREAMER_pbutils_LIBRARY-NOTFOUND
GSTREAMER_riff_LIBRARY:FILEPATH=GSTREAMER_riff_LIBRARY-NOTFOUND
INSTALL_CREATE_DISTRIB:BOOL=OFF
INSTALL_C_EXAMPLES:BOOL=OFF
INSTALL_PYTHON_EXAMPLES:BOOL=OFF
INSTALL_TESTS:BOOL=OFF
LAPACK_CBLAS_H:STRING=
LAPACK_IMPL:STRING=Unknown
LAPACK_INCLUDE_DIR:PATH=
LAPACK_LAPACKE_H:STRING=
LAPACK_LIBRARIES:STRING=
MKL_INCLUDE_DIRS:PATH=MKL_ROOT_DIR-NOTFOUND/include
MKL_ROOT_DIR:PATH=MKL_ROOT_DIR-NOTFOUND
MKL_WITH_OPENMP:BOOL=OFF
MKL_WITH_TBB:BOOL=OFF
M_LIBRARY:FILEPATH=M_LIBRARY-NOTFOUND
OPENCL_FOUND:BOOL=ON
OPENCV_CONFIG_FILE_INCLUDE_DIR:PATH=H:/OpenCV/opencv410/buildtest
OPENCV_DNN_OPENCL:BOOL=ON
OPENCV_DOWNLOAD_PATH:PATH=H:/OpenCV/opencv410/sources/.cache
OPENCV_DUMP_HOOKS_FLOW:BOOL=OFF
OPENCV_ENABLE_NONFREE:BOOL=OFF
OPENCV_EXTRA_MODULES_PATH:PATH=
OPENCV_FORCE_3RDPARTY_BUILD:BOOL=OFF
OPENCV_GENERATE_PKGCONFIG:BOOL=OFF
OPENCV_GENERATE_SETUPVARS:BOOL=ON
OPENCV_JAVA_SOURCE_VERSION:STRING=
OPENCV_JAVA_TARGET_VERSION:STRING=
OPENCV_PYTHON3_VERSION:BOOL=OFF
OPENCV_TIMESTAMP:STRING=2019-05-08T15:34:25Z
OPENCV_WARNINGS_ARE_ERRORS:BOOL=OFF
OpenCV_HAL_DIR:PATH=OpenCV_HAL_DIR-NOTFOUND
PROTOBUF_UPDATE_FILES:BOOL=OFF
PYTHON2_EXECUTABLE:FILEPATH=
PYTHON2_INCLUDE_DIR:PATH=
PYTHON2_INCLUDE_DIR2:PATH=
PYTHON2_LIBRARY:FILEPATH=
PYTHON2_LIBRARY_DEBUG:FILEPATH=
PYTHON2_NUMPY_INCLUDE_DIRS:PATH=
PYTHON2_PACKAGES_PATH:PATH=
PYTHON3_EXECUTABLE:FILEPATH=C:/Program Files (x86)/Microsoft Visual Studio/Shared/Python36_64/python.exe
PYTHON3_INCLUDE_DIR:PATH=C:/Program Files (x86)/Microsoft Visual Studio/Shared/Python36_64/include
PYTHON3_INCLUDE_DIR2:PATH=
PYTHON3_LIBRARY:FILEPATH=C:/Program Files (x86)/Microsoft Visual Studio/Shared/Python36_64/libs/python36.lib
PYTHON3_LIBRARY_DEBUG:FILEPATH=PYTHON_DEBUG_LIBRARY-NOTFOUND
PYTHON3_NUMPY_INCLUDE_DIRS:PATH=
PYTHON3_PACKAGES_PATH:PATH=C:/Program Files (x86)/Microsoft Visual Studio/Shared/Python36_64/Lib/site-packages
USE_WIN32_FILEIO:BOOL=ON
VTK_DIR:PATH=VTK_DIR-NOTFOUND
WITH_1394:BOOL=ON
WITH_ADE:BOOL=ON
WITH_ARITH_DEC:BOOL=ON
WITH_ARITH_ENC:BOOL=ON
WITH_CLP:BOOL=OFF
WITH_CUDA:BOOL=OFF
WITH_DIRECTX:BOOL=ON
WITH_DSHOW:BOOL=ON
WITH_EIGEN:BOOL=ON
WITH_FFMPEG:BOOL=ON
WITH_GDAL:BOOL=OFF
WITH_GDCM:BOOL=OFF
WITH_GSTREAMER:BOOL=ON
WITH_HALIDE:BOOL=OFF
WITH_HPX:BOOL=OFF
WITH_IMGCODEC_HDR:BOOL=ON
WITH_IMGCODEC_PFM:BOOL=ON
WITH_IMGCODEC_PXM:BOOL=ON
WITH_IMGCODEC_SUNRASTER:BOOL=ON
WITH_INF_ENGINE:BOOL=OFF
WITH_IPP:BOOL=ON
WITH_ITT:BOOL=ON
WITH_JASPER:BOOL=ON
WITH_JPEG:BOOL=ON
WITH_LAPACK:BOOL=ON
WITH_LIBREALSENSE:BOOL=OFF
WITH_MFX:BOOL=OFF
WITH_MSMF:BOOL=ON
WITH_MSMF_DXVA:BOOL=ON
WITH_OPENCL:BOOL=ON
WITH_OPENCLAMDBLAS:BOOL=ON
WITH_OPENCLAMDFFT:BOOL=ON
WITH_OPENCL_D3D11_NV:BOOL=ON
WITH_OPENCL_SVM:BOOL=OFF
WITH_OPENEXR:BOOL=ON
WITH_OPENGL:BOOL=OFF
WITH_OPENMP:BOOL=OFF
WITH_OPENNI:BOOL=OFF
WITH_OPENNI2:BOOL=OFF
WITH_OPENVX:BOOL=OFF
WITH_PNG:BOOL=ON
WITH_PROTOBUF:BOOL=ON
WITH_PVAPI:BOOL=OFF
WITH_QT:BOOL=OFF
WITH_QUIRC:BOOL=ON
WITH_TBB:BOOL=OFF
WITH_TIFF:BOOL=ON
WITH_VTK:BOOL=ON
WITH_VULKAN:BOOL=OFF
WITH_WEBP:BOOL=ON
WITH_WIN32UI:BOOL=ON
WITH_XIMEA:BOOL=OFF
ccitt:BOOL=ON
logluv:BOOL=ON
lzw:BOOL=ON
mdi:BOOL=ON
next:BOOL=ON
old-jpeg:BOOL=OFF
opencv_dnn_PERF_CAFFE:BOOL=OFF
opencv_dnn_PERF_CLCAFFE:BOOL=OFF
packbits:BOOL=ON
thunder:BOOL=ON

こんな感じで出てきますのでバッチファイルに記載しているビルドオプションと比較して必要なオプションを追加したり、なくなったオプションを削除します。

バッチファイル

ある程度汎用に組んだつもりですがあくまでも自分の環境で動くように作っています。これを使う人は多分経験者だと思うので、そのまま使って動かないとか言う人はいないとは思いますが、自分自身の環境で動くようにカスタマイズして使ってください。 OpenCV 4.1.0のビルドで使ったものです。
実行するときは OpenCV ソースを解凍した場所をカンレントにしてそこにバッチファイルを置いて管理者権限のコマンドプロンプトから実行です。

::buildocv32.bat
::第一引数
::バッチファイル引数の検査
::使用するVisual Studioのバージョン
::引数の種類:2010 2012 2013 2015 2017
set VS_NUM=%1
if %VS_NUM% == 2010 ( 
	set VC_VERSION_NUM=10
) else if %VS_NUM% == 2012 ( 
	set VC_VERSION_NUM=11
) else if %VS_NUM% == 2013 ( 
	set VC_VERSION_NUM=12
) else if %VS_NUM% == 2015 ( 
	set VC_VERSION_NUM=14
) else if %VS_NUM% == 2017 ( 
	set VC_VERSION_NUM=15
) else (
	exit /b
)

::第二引数
::ビルドするライブラリの種類
::引数の種類 lib dll
::staticlib or DLL
if %2 == lib (
	set LIB_KIND=staticlib
	set BUILD_SHARED_LIBS=OFF
) else if %2 == dll (
	set LIB_KIND=DLL
	set BUILD_SHARED_LIBS=ON
) else (
	exit /b
)

::第三引数
::使用するプラットフォームの種類
::引数の種類 86 64
set PLATNUM=%3
if %PLATNUM% == 86 (
	set PLATFORM=x86
	set ARCH=x86
	set TBB_PLATFORM=ia32
	set OPENCV_HDF=OFF
) else if %PLATNUM% == 64 (
	set PLATFORM=x64
	set ARCH=amd64
	set TBB_PLATFORM=intel64
	set OPENCV_HDF=ON
) else (
	exit /b
)

::第四引数
::CUDAの使用有無
::CUDAを使用する場合は環境に応じて個別にコンパイルする必要がある。
::引数の種類 wc woc
::CUDA_ARCH_BINの値はhttps://developer.nvidia.com/cuda-gpusで確認して
::使用しているGPUの値を入力する。
if %4 == wc (
	set WITH_CUDA=ON
	set INSTALL_DIRNAME_CUDA=WithCUDA
	set CUDA_ARCH_BIN="5.0"
	set CUDA_ARCH_PTX=""
) else if %4 == woc (
	set WITH_CUDA=OFF
	set INSTALL_DIRNAME_CUDA=WithoutCUDA
	set CUDA_ARCH_BIN=""
	set CUDA_ARCH_PTX=""
) else (
	exit /b
)

::使用できるQtのVersion
::Qtの最新バージョンはC++11が必須となったため、使用できるのはVS2013以降
::VS2012以前は5.6.2が最終サポート
if %VS_NUM% geq 2013 (
	set QT_VERSION_NUM=5.11.1
) else (
	set QT_VERSION_NUM=5.6.2
)

::第五引数
::Qtの使用有無
::引数の種類 wq woq
if %5 == wq (
	set WITH_Qt=ON
	set WITH_WIN32UI=OFF
	set INSTALL_DIRNAME_QT=WithQt
	set QT5_DIR=qt\DLL\%QT_VERSION_NUM%-msvc%VS_NUM%-x%PLATNUM%-opengl
	set QT5CONCURRENT_DIR="%QT5_DIR%/lib/cmake/Qt5Concurrent"
	set QT5CORE_DIR="%QT5_DIR%/lib/cmake/Qt5Core"
	set QT5GUI_DIR="%QT5_DIR%/lib/cmake/Qt5Gui"
	set QT5OPENGL_DIR="%QT5_DIR%/lib/cmake/Qt5OpenGL"
	set QT5TEST_DIR="%QT5_DIR%/lib/cmake/Qt5Test" ^
	set QT5WIDGETS_DIR="%QT5_DIR%/lib/cmake/Qt5Widgets"
) else if %5 == woq (
	set WITH_Qt=OFF
	set WITH_WIN32UI=ON
	set INSTALL_DIRNAME_QT=WithoutQt
	set QT5_DIR=""
	set QT5CONCURRENT_DIR=""
	set QT5CORE_DIR=""
	set QT5GUI_DIR=""
	set QT5OPENGL_DIR=""
	set QT5TEST_DIR=""
	set QT5WIDGETS_DIR=""
) else (
	exit /b
)

::第六引数
::world or core
::引数の種類 world core
if %6 == world (
	set LIB_WORLD=world
	set BUILD_OPENCV_WORLD=ON
) else if %6 == core (
	set LIB_WORLD=core
	set BUILD_OPENCV_WORLD=OFF
) else (
	exit /b
)

::第七引数
::サンプルのビルド
::引数の種類 ex nex
if %7 == ex (
	set BUILD_EXAMPLES=ON
) else if %7 == nex (
	set BUILD_EXAMPLES=OFF
) else (
	exit /b
)

:: setting of the environment variables
set CURRENT_DIR=%~dp0
set SOURCE_DIR=%CURRENT_DIR%sources
if %VS_NUM% geq 2017 (
	set VCVARSALL_BAT="C:\Program Files (x86)\Microsoft Visual Studio\%VS_NUM%\Enterprise\VC\Auxiliary\Build\vcvarsall.bat"
) else (
	set VCVARSALL_BAT="C:\Program Files (x86)\Microsoft Visual Studio %VC_VERSION_NUM%.0\VC\vcvarsall.bat"
)
set CMAKE_PATH="C:\Program Files\CMake\bin\cmake.exe"
set MKDIR_NAME=build\%INSTALL_DIRNAME_CUDA%\%INSTALL_DIRNAME_QT%\%LIB_WORLD%\%LIB_KIND%\%PLATFORM%\vs%VS_NUM%
set MKDIR_NAME2=buildtemp\%INSTALL_DIRNAME_CUDA%\%INSTALL_DIRNAME_QT%\%LIB_WORLD%\%LIB_KIND%\%PLATFORM%\vs%VS_NUM%

set BUILD_DIR=%CURRENT_DIR%%MKDIR_NAME%
set INSTALL_DIR=%BUILD_DIR%\install
set SAVE_DIR=%CURRENT_DIR%%MKDIR_NAME2%

if %ARCH% == amd64 (
	set GENERATOR_NAME=Visual Studio %VC_VERSION_NUM% %VS_NUM% Win64
) else if %ARCH% == x86 (
	set GENERATOR_NAME=Visual Studio %VC_VERSION_NUM% %VS_NUM%
) else (
	exit /b
)

::TBBの設定
::VS2010、VS2012のサポートはVer4.4 Update 6まで
if %VS_NUM% geq 2013 ( 
	set TBB_VERSION=tbb2019_20190410oss
) else (
	set TBB_VERSION=tbb44_20160803oss
)

::VS2017対応のTBBはvc14フォルダに格納されている。
if %VS_NUM% == 2017 (
	set TBB_VC=vc14
) else (
	set TBB_VC=vc%VC_VERSION_NUM%
)

::QRコードコーデックはVC2013非対応
if %VS_NUM% == 2013 (
	set WITH_QUIRC=OFF
) else (
	set WITH_QUIRC=ON
)


set TBB_ROOT=%CURRENT_DIR%%TBB_VERSION%
set TBB_ENV_INCLUDE="%TBB_ROOT%/include"
set TBB_ENV_LIB="%TBB_ROOT%/lib/%TBB_PLATFORM%/%TBB_VC%/tbb.lib"
set TBB_ENV_LIB_DEBUG="%TBB_ROOT%/lib/%TBB_PLATFORM%/%TBB_VC%/tbb_debug.lib"

::Eigenの設定
set EIGEN_VER=eigen3.3.7

::pythonのあるフォルダ
::set PYTHON_DIR=C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_%PLATNUM%
set PYTHON_DIR=C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_%PLATNUM%

::pythonのあるフォルダにpathを通す
set PATH=%PYTHON_DIR%;%PATH%

::opencv_contrib、Python3の設定
if %VS_NUM% geq 2013 ( 
	set OPENCV_EXTRA_MODULES_PATH="%CURRENT_DIR%opencv_contrib-4.1.0\modules"
	set OPENCV_PYTHON3=ON
	set PYTHON_INCLUDE_DIR="%PYTHON_DIR%\include"
	set PYTHON_LIBRARY="%PYTHON_DIR%\libs\python36.lib"
) else (
	set OPENCV_EXTRA_MODULES_PATH=""
	set OPENCV_PYTHON3=OFF
	set PYTHON_INCLUDE_DIR=""
	set PYTHON_LIBRARY=""
)

::Visual C++ ツールセットの有効化
call %VCVARSALL_BAT% %ARCH%

echo on

::作業フォルダの作成と移動
mkdir %MKDIR_NAME%
mkdir %MKDIR_NAME2%
mkdir %MKDIR_NAME2%\..\..\install\vs%VS_NUM%
cd %MKDIR_NAME%

:: runnig CMake
%CMAKE_PATH% ^
-G "%GENERATOR_NAME%" ^
--build "%BUILD_DIR%" ^
-D BUILD_CUDA_STUBS=OFF ^
-D BUILD_DOCS=OFF ^
-D BUILD_EXAMPLES=%BUILD_EXAMPLES% ^
-D BUILD_JASPER=ON ^
-D BUILD_JPEG=ON ^
-D BUILD_OPENEXR=ON ^
-D BUILD_PACKAGE=ON ^
-D BUILD_PERF_TESTS=OFF ^
-D BUILD_PNG=ON ^
-D BUILD_SHARED_LIBS=%BUILD_SHARED_LIBS% ^
-D BUILD_TBB=OFF ^
-D BUILD_TESTS=OFF ^
-D BUILD_TIFF=ON ^
-D BUILD_WITH_DEBUG_INFO=ON ^
-D BUILD_WITH_STATIC_CRT=ON ^
-D BUILD_ZLIB=ON ^
-D BUILD_WEBP=ON ^
-D BUILD_opencv_apps=ON ^
-D BUILD_opencv_calib3d=ON ^
-D BUILD_opencv_core=ON ^
-D BUILD_opencv_cudaarithm=%WITH_CUDA% ^
-D BUILD_opencv_cudabgsegm=%WITH_CUDA% ^
-D BUILD_opencv_cudacodec=%WITH_CUDA% ^
-D BUILD_opencv_cudafeatures2d=%WITH_CUDA% ^
-D BUILD_opencv_cudafilters=%WITH_CUDA% ^
-D BUILD_opencv_cudaimgproc=%WITH_CUDA% ^
-D BUILD_opencv_cudalegacy=%WITH_CUDA% ^
-D BUILD_opencv_cudaobjdetect=%WITH_CUDA% ^
-D BUILD_opencv_cudaoptflow=%WITH_CUDA% ^
-D BUILD_opencv_cudastereo=%WITH_CUDA% ^
-D BUILD_opencv_cudawarping=%WITH_CUDA% ^
-D BUILD_opencv_cudev=%WITH_CUDA% ^
-D BUILD_opencv_features2d=ON ^
-D BUILD_opencv_flann=ON ^
-D BUILD_opencv_highgui=ON ^
-D BUILD_opencv_imgcodecs=ON ^
-D BUILD_opencv_imgproc=ON ^
-D BUILD_opencv_java=OFF ^
-D BUILD_opencv_ml=ON ^
-D BUILD_opencv_objdetect=ON ^
-D BUILD_opencv_photo=ON ^
-D BUILD_opencv_python2=OFF ^
-D BUILD_opencv_python3=%OPENCV_PYTHON3% ^
-D BUILD_opencv_shape=ON ^
-D BUILD_opencv_stitching=ON ^
-D BUILD_opencv_superres=ON ^
-D BUILD_opencv_ts=ON ^
-D BUILD_opencv_video=ON ^
-D BUILD_opencv_videoio=ON ^
-D BUILD_opencv_videostab=ON ^
-D BUILD_opencv_viz=OFF ^
-D BUILD_opencv_world=%BUILD_OPENCV_WORLD% ^
-D PYTHON_INCLUDE_DIR=%PYTHON_INCLUDE_DIR% ^
-D PYTHON_LIBRARY=%PYTHON_LIBRARY% ^
-D CMAKE_CONFIGURATION_TYPES="Debug;Release" ^
-D CMAKE_INSTALL_PREFIX="%INSTALL_DIR%" ^
-D OPENCV_EXTRA_MODULES_PATH=%OPENCV_EXTRA_MODULES_PATH% ^
-D BUILD_opencv_hdf=%OPENCV_HDF% ^
-D EIGEN_INCLUDE_PATH="%CURRENT_DIR%%EIGEN_VER%" ^
-D TBB_ENV_INCLUDE=%TBB_ENV_INCLUDE% ^
-D TBB_ENV_LIB=%TBB_ENV_LIB% ^
-D TBB_ENV_LIB_DEBUG=%TBB_ENV_LIB_DEBUG% ^
-D CUDA_ARCH_BIN=%CUDA_ARCH_BIN% ^
-D CUDA_ARCH_PTX=%CUDA_ARCH_PTX% ^
-D Qt5Concurrent_DIR="%QT5CONCURRENT_DIR%" ^
-D Qt5Core_DIR="%QT5CORE_DIR%" ^
-D Qt5Gui_DIR="%QT5GUI_DIR%" ^
-D Qt5OpenGL_DIR="%QT5OPENGL_DIR%" ^
-D Qt5Test_DIR="%QT5TEST_DIR%" ^
-D Qt5Widgets_DIR="%QT5WIDGETS_DIR%" ^
-D WITH_1394=OFF ^
-D WITH_CUBLAS=%WITH_CUDA% ^
-D WITH_CUDA=%WITH_CUDA% ^
-D WITH_CUFFT=%WITH_CUDA% ^
-D WITH_DIRECTX=ON ^
-D WITH_DSHOW=ON ^
-D WITH_EIGEN=ON ^
-D WITH_FFMPEG=ON ^
-D WITH_GDAL=OFF ^
-D WITH_IPP=ON ^
-D WITH_IPP_A=OFF ^
-D WITH_JASPER=ON ^
-D WITH_JPEG=ON ^
-D WITH_MSMF=ON ^
-D WITH_NVCUVID=%WITH_CUDA% ^
-D WITH_OPENCL=ON ^
-D WITH_OPENCLAMDBLAS=OFF ^
-D WITH_OPENCLAMDFFT=OFF ^
-D WITH_OPENCL_SVM=OFF ^
-D WITH_OPENEXR=ON ^
-D WITH_OPENGL=ON ^
-D WITH_OPENMP=OFF ^
-D WITH_OPENNI=OFF ^
-D WITH_OPENNI2=OFF ^
-D WITH_OPENVX=OFF ^
-D WITH_PNG=ON ^
-D WITH_PVAPI=OFF ^
-D WITH_QT=%WITH_Qt% ^
-D WITH_TBB=ON ^
-D WITH_TIFF=ON ^
-D WITH_VFW=OFF ^
-D WITH_VTK=OFF ^
-D WITH_WEBP=ON ^
-D WITH_QUIRC=%WITH_QUIRC% ^
-D WITH_WIN32UI=%WITH_WIN32UI% ^
-D WITH_XIMEA=OFF %SOURCE_DIR%

xcopy /S /Y /I /F * %SAVE_DIR%\

:: Building the OpenCV(Debug/Release) using Visual Studio
if %PLATFORM% == x86 (
	devenv /build "Debug|Win32" /project "INSTALL" OpenCV.sln
	devenv /build "Release|Win32" /project "INSTALL" OpenCV.sln
) else (
	devenv /build "Debug|x64" /project "INSTALL" OpenCV.sln
	devenv /build "Release|x64" /project "INSTALL" OpenCV.sln
)

::mkdir ..\..\install
xcopy /S /Y /I /F install\* %SAVE_DIR%\..\..\install\vs%VS_NUM%



cd ..\..\..\..\..\..\

私は次のようなビルド用のバッチファイルを組んで夜間に実行させています。
処理の内容をテキストに吐き出すようにしておくとエラーが出たときに役立ちます。

start /wait cmd /c "buildocv32 2017 dll 86 woc woq world nex>2017_dll_86_woc_woq.txt"
echo on
start /wait cmd /c "buildocv32 2017 dll 64 woc woq world ex>2017_dll_64_woc_woq.txt"
echo on
start /wait cmd /c "buildocv32 2017 lib 86 woc woq world nex>2017_lib_86_woc_woq.txt"
echo on
start /wait cmd /c "buildocv32 2017 lib 64 woc woq world nex>2017_lib_64_woc_woq.txt"
echo on