Computer Vision

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

OpenCV 4.3.0をCUDA等のオプションを有効にしてWindows 10でビルドする手順のまとめです。

これまでにもOpenCVをビルドする手順を何度か紹介してきましたが、今回はビルド構成の設定にかかる手間を減らし、より簡単にビルドできる手順にしています。また、ビルドにはNinjaを使用し、マルチコア環境でのビルド時間を大幅に短縮できるようにしています。

OpenCV 4.3.0 のビルド構成

今回は次の構成でOpenCV 4.3.0をビルドします。

OpenCVはCUDAを使ってパフォーマンスを向上できるので、CUDAを有効にしています。VTKやQtは必須ではありませんが、利用環境が整っていたので有効にしています。また、PythonからOpenCVを利用可能にするため、Python 3用のモジュールも作成するように設定しています。

  • OpenCV 4.3.0
  • OpenCV Contrib 4.3.0 (OpenCVの追加モジュール)
  • CUDA 10.2
  • cuDNN 7.6.5
  • VTK 8.2.0
  • Qt 5.14.1
  • Python 3用パッケージ

ビルド環境

ビルドには以下の環境を使用しています。環境によって設定可能な構成に多少の違いが出てくる場合があるので、その場合は環境に合わせてビルド構成を変更していただければと思います。

ハードウェア

ソフトウェア

OpenCVをビルドする前に、下記のソフトウェアを導入しておく必要があります。

OpenCV 4.3.0のビルド時には、これらのソフトウェアへのパスを通しておくとCMakeの構成でパッケージが自動的に検出されるため、作業がスムーズになります。
通常時はPATHを設定しておきたくない…という場合は、ビルドに利用するコンソール画面でsetコマンドを使って一時的にパスを通してください。

VTKやQtなどは実行環境があれば良いので、これらをソースコードからビルドする必要はありません。Windows向けにビルド済みのセットアップファイルを利用すれば簡単です。

私の場合はVTKをソースコードからビルドしましたが、VTK 8.2.0でVTK_WRAP_PYTHONを有効にしてVisual Studio 2019でビルドすると「nullptrに関するキャストのエラー」でビルドに失敗します。そのためVTK_WRAP_PYTHONを無効にしてVTK 8.2.0をビルドしています。

OpenCV 4.3.0 のビルド手順

使用フォルダ

今回は以下のフォルダを使用する前提です。
パスは各自の利用環境に合わせて読み替えてください。

# OpenCVのビルドで利用するPythonの仮想環境
G:\venvs\build_cv430

# OpenCVのインストール先
C:\lib\OpenCV430
# ninja.exeの格納場所
C:\Tools\Ninja

# VTKのインストール場所
C:\lib\VTK

# 環境変数PATHの情報(関係する部分)
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\bin
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\libnvvp
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\extras\CUPTI\lib64
C:\Program Files\CMake\bin
C:\lib\VTK\bin
C:\lib\OpenCV430\x64\vc16\bin
C:\Python\Python38\Scripts\
C:\Python\Python38\
C:\Tools\Ninja
C:\Qt\Qt5.14.1\5.14.1\msvc2017_64\bin

ビルド用のPython仮想環境を作成

x64 Native Tools Command Prompt for VS 2019を起動して、VS2019のコマンドプロンプトを起動します。普通に起動したコマンドプロンプトではビルドに必要な環境変数が設定されていないため、必ずVS2019のコマンドプロンプトを使用してください。
以降の操作は、基本的に、このコマンドプロンプト画面で行っていきます。

以下のコマンドでOpenCVをビルドするための仮想環境G:\venvs\build_cv430を作成します。

# ビルド用のPython仮想環境作成
python -m venv g:\venvs\build_cv430
g:\venvs\build_cv430\Scripts\activate.bat
pip install numpy

# pipの更新(任意)
python -m pip install --upgrade pip

ソースコードの取得

gitを使ってOpenCVとOpenCV追加モジュールのソースコードを取得します。最新のソースコードを取得するとビルドに失敗する可能性があるため、4.3.0のタグを指定して取得します。

# OpenCVのソースコードを取得(4.3.0のタグ)
cd /d g:\venvs\build_cv430

git clone -b 4.3.0 https://github.com/opencv/opencv.git
git clone -b 4.3.0 https://github.com/opencv/opencv_contrib.git

ビルド構成の設定

CMakeを使ってOpenCVのビルド構成を設定します。
必須ではありませんが、オリジナルのソースファイルがビルド用のファイルで汚染されないように、ソースフォルダ配下にbuildフォルダを作成して、このフォルダでビルドを行います。

# build用の作業フォルダ作成
cd /d g:\venvs\build_cv430\opencv
md build
cd build

# OpenCVのビルド構成設定
# パスの区切り文字はスラッシュ'/'を使用する。'\'を使うとエラーになる場合がある。
# 追加したい設定や不要な設定があれば「-Dxxx=xx」部分を適宜変更
cmake .. -G "Ninja" -DWITH_CUDA=ON -DOPENCV_DNN_CUDA=ON -DCUDA_FAST_MATH=ON -DENABLE_FAST_MATH=ON -DOPENCV_EXTRA_MODULES_PATH="G:/venvs/build_cv430/opencv_contrib/modules" -DCMAKE_INSTALL_PREFIX="C:/lib/OpenCV430" -DCPU_BASELINE="AVX2" -DCMAKE_CONFIGURATION_TYPES="Release" -DCMAKE_BUILD_TYPE="Release" -DOPENCV_ENABLE_NONFREE=ON -DINSTALL_PYTHON_EXAMPLES=ON -DWITH_QT=ON -DPYTHON3_PACKAGES_PATH="G:/venvs/build_cv430/lib/site-packages" -DCUDA_GENERATION="Turing"
ビルド構成の詳細(ここをクリックすると展開できます)

いくつかの重要な設定についての補足になります。

  • WITH_CUDA,OPENCV_DNN_CUDA,CUDA_FAST_MATH
    いくつかの機能でCUDAを有効にするためONにします。
  • OPENCV_EXTRA_MODULES_PATH
    CUDAを使うためにはopencv_contribのcudevモジュールが必須になるためopencv_contribのmodulesフォルダのパスをスラッシュ”/”区切りで指定します。
  • CMAKE_INSTALL_PREFIX
    ビルドしたOpenCVのインストール先を指定します。
  • INSTALL_PYTHON_EXAMPLES
    有効にするとPythonのサンプルコードが追加されます。
  • PYTHON3_PACKAGES_PATH
    Python用モジュールのインストール先を指定します。
    このパスに作成されたモジュールは利用しないため、ビルド用に作成した仮想環境のフォルダG:/venvs/build_cv430/lib/site-packagesを指定します。(ビルド後は削除してもOK)
  • CPU_BASELINE,CUDA_GENERATION
    利用しているCPUやGPUに合わせて適宜設定してください。設定内容が分からない場合、このオプション自体を指定しなくてもOKです。指定しなかった場合は利用している環境に合わせて自動で最適な値が設定されます。

なお、CMakeで設定した構成の詳細はcmake .. -Lで表示できます。
今回のビルド構成の全容を以下にのせておきます。

-- Detected processor: AMD64
-- libjpeg-turbo: VERSION = 2.0.4, BUILD = opencv-4.3.0-libjpeg-turbo
-- Could NOT find OpenJPEG (minimal suitable version: 2.0, recommended version >= 2.3.1)
-- found Intel IPP (ICV version): 2020.0.0 [2020.0.0 Gold]
-- at: G:/venvs/build_cv430/opencv/build/3rdparty/ippicv/ippicv_win/icv
-- found Intel IPP Integration Wrappers sources: 2020.0.0
-- at: G:/venvs/build_cv430/opencv/build/3rdparty/ippicv/ippicv_win/iw
-- CUDA detected: 10.2
-- CUDA NVCC target flags: -gencode;arch=compute_75,code=sm_75;-D_FORCE_INLINES
-- Could not find OpenBLAS include. Turning OpenBLAS_FOUND off
-- Could not find OpenBLAS lib. Turning OpenBLAS_FOUND off
-- Could NOT find BLAS (missing: BLAS_LIBRARIES) 
-- LAPACK requires BLAS
-- A library with LAPACK API not found. Please specify library location.
-- Could NOT find JNI (missing: JAVA_AWT_LIBRARY JAVA_JVM_LIBRARY JAVA_INCLUDE_PATH JAVA_INCLUDE_PATH2 JAVA_AWT_INCLUDE_PATH) 
-- Found VTK 8.2.0 (C:/lib/VTK/lib/cmake/vtk-8.2/UseVTK.cmake)
-- OpenCV Python: during development append to PYTHONPATH: G:/venvs/build_cv430/opencv/build/python_loader
-- Module opencv_alphamat disabled because the following dependencies are not found: Eigen
-- Caffe:   NO
-- Protobuf:   NO
-- Glog:   NO
-- freetype2:   NO
-- harfbuzz:    NO
-- Module opencv_ovis disabled because OGRE3D was not found
-- No preference for use of exported gflags CMake configuration set, and no hints for include/library directories provided. Defaulting to preferring an installed/exported gflags CMake configuration if available.
-- Failed to find installed gflags CMake configuration, searching for gflags build directories exported with CMake.
-- Failed to find gflags - Failed to find an installed/exported CMake configuration for gflags, will perform search for installed gflags components.
-- Failed to find gflags - Could not find gflags include directory, set GFLAGS_INCLUDE_DIR to directory containing gflags/gflags.h
-- Failed to find glog - Could not find glog include directory, set GLOG_INCLUDE_DIR to directory containing glog/logging.h
-- Module opencv_sfm disabled because the following dependencies are not found: Eigen Glog/Gflags
-- Tesseract:   NO
-- Allocator metrics storage type: 'long long'
-- Registering hook 'INIT_MODULE_SOURCES_opencv_dnn': G:/venvs/build_cv430/opencv/modules/dnn/cmake/hooks/INIT_MODULE_SOURCES_opencv_dnn.cmake
-- 
-- General configuration for OpenCV 4.3.0 =====================================
--   Version control:               4.3.0
-- 
--   Extra modules:
--     Location (extra):            G:/venvs/build_cv430/opencv_contrib/modules
--     Version control (extra):     4.3.0
-- 
--   Platform:
--     Timestamp:                   2020-04-06T14:00:02Z
--     Host:                        Windows 10.0.18363 AMD64
--     CMake:                       3.17.0
--     CMake generator:             Ninja
--     CMake build tool:            C:/Tools/Ninja/ninja.exe
--     MSVC:                        1925
--     Configuration:               Release
-- 
--   CPU/HW features:
--     Baseline:                    SSE SSE2 SSE3 SSSE3 SSE4_1 POPCNT SSE4_2 FP16 FMA3 AVX AVX2
--       requested:                 AVX2
--     Dispatched code generation:  AVX512_SKX
--       requested:                 SSE4_1 SSE4_2 AVX FP16 AVX2 AVX512_SKX
--       AVX512_SKX (6 files):      + AVX_512F AVX512_COMMON AVX512_SKX
-- 
--   C/C++:
--     Built as dynamic libs?:      YES
--     C++ standard:                11
--     C++ Compiler:                C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.25.28610/bin/Hostx64/x64/cl.exe  (ver 19.25.28612.0)
--     C++ flags (Release):         /DWIN32 /D_WINDOWS /W4 /GR  /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi  /fp:fast /FS         /arch:AVX  /arch:AVX /arch:AVX2 /EHa /wd4127 /wd4251 /wd4324 /wd4275 /wd4512 /wd4589  /MD /O2 /Ob2 /DNDEBUG 
--     C++ flags (Debug):           /DWIN32 /D_WINDOWS /W4 /GR  /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE /D _SCL_SECURE_NO_WARNINGS /Gy /bigobj /Oi  /fp:fast /FS         /arch:AVX  /arch:AVX /arch:AVX2 /EHa /wd4127 /wd4251 /wd4324 /wd4275 /wd4512 /wd4589  /MDd /Zi /Ob0 /Od /RTC1 
--     C Compiler:                  C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.25.28610/bin/Hostx64/x64/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  /fp:fast /FS         /arch:AVX  /arch:AVX /arch:AVX2   /MD /O2 /Ob2 /DNDEBUG 
--     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  /fp:fast /FS         /arch:AVX  /arch:AVX /arch:AVX2 /MDd /Zi /Ob0 /Od /RTC1 
--     Linker flags (Release):      /machine:x64  /INCREMENTAL:NO 
--     Linker flags (Debug):        /machine:x64  /debug /INCREMENTAL 
--     ccache:                      NO
--     Precompiled headers:         NO
--     Extra dependencies:          cudart_static.lib nppc.lib nppial.lib nppicc.lib nppicom.lib nppidei.lib nppif.lib nppig.lib nppim.lib nppist.lib nppisu.lib nppitc.lib npps.lib cublas.lib cudnn.lib cufft.lib -LIBPATH:"C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.2/lib/x64"
--     3rdparty dependencies:
-- 
--   OpenCV modules:
--     To be built:                 aruco bgsegm bioinspired calib3d ccalib core cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev cvv datasets dnn dnn_objdetect dnn_superres dpm face features2d flann fuzzy gapi hfs highgui img_hash imgcodecs imgproc intensity_transform line_descriptor ml objdetect optflow phase_unwrapping photo plot python3 quality rapid reg rgbd saliency shape stereo stitching structured_light superres surface_matching text tracking ts video videoio videostab viz xfeatures2d ximgproc xobjdetect xphoto
--     Disabled:                    world
--     Disabled by dependency:      -
--     Unavailable:                 alphamat cnn_3dobj freetype hdf java js matlab ovis python2 sfm
--     Applications:                tests perf_tests apps
--     Documentation:               NO
--     Non-free algorithms:         YES
-- 
--   Windows RT support:            NO
-- 
--   GUI: 
--     QT:                          YES (ver 5.14.1)
--       QT OpenGL support:         NO
--     Win32 UI:                    YES
--     VTK support:                 YES (ver 8.2.0)
-- 
--   Media I/O: 
--     ZLib:                        build (ver 1.2.11)
--     JPEG:                        build-libjpeg-turbo (ver 2.0.4-62)
--     WEBP:                        build (ver encoder: 0x020f)
--     PNG:                         build (ver 1.6.37)
--     TIFF:                        build (ver 42 - 4.0.10)
--     JPEG 2000:                   build Jasper (ver 1.900.1)
--     OpenEXR:                     build (ver 2.3.0)
--     HDR:                         YES
--     SUNRASTER:                   YES
--     PXM:                         YES
--     PFM:                         YES
-- 
--   Video I/O:
--     DC1394:                      NO
--     FFMPEG:                      YES (prebuilt binaries)
--       avcodec:                   YES (58.54.100)
--       avformat:                  YES (58.29.100)
--       avutil:                    YES (56.31.100)
--       swscale:                   YES (5.5.100)
--       avresample:                YES (4.0.0)
--     GStreamer:                   NO
--     DirectShow:                  YES
--     Media Foundation:            YES
--       DXVA:                      YES
-- 
--   Parallel framework:            Concurrency
-- 
--   Trace:                         YES (with Intel ITT)
-- 
--   Other third-party libraries:
--     Intel IPP:                   2020.0.0 Gold [2020.0.0]
--            at:                   G:/venvs/build_cv430/opencv/build/3rdparty/ippicv/ippicv_win/icv
--     Intel IPP IW:                sources (2020.0.0)
--               at:                G:/venvs/build_cv430/opencv/build/3rdparty/ippicv/ippicv_win/iw
--     Lapack:                      NO
--     Eigen:                       NO
--     Custom HAL:                  NO
--     Protobuf:                    build (3.5.1)
-- 
--   NVIDIA CUDA:                   YES (ver 10.2, CUFFT CUBLAS FAST_MATH)
--     NVIDIA GPU arch:             75
--     NVIDIA PTX archs:
-- 
--   cuDNN:                         YES (ver 7.6.5)
-- 
--   OpenCL:                        YES (NVD3D11)
--     Include path:                G:/venvs/build_cv430/opencv/3rdparty/include/opencl/1.2
--     Link libraries:              Dynamic load
-- 
--   Python 3:
--     Interpreter:                 G:/venvs/build_cv430/Scripts/python.exe (ver 3.8.2)
--     Libraries:                   C:/Python/Python38/libs/python38.lib (ver 3.8.2)
--     numpy:                       G:/venvs/build_cv430/lib/site-packages/numpy/core/include (ver 1.18.2)
--     install path:                G:/venvs/build_cv430/Lib/site-packages/cv2/python-3.8
-- 
--   Python (for build):            G:/venvs/build_cv430/Scripts/python.exe
-- 
--   Java:                          
--     ant:                         NO
--     JNI:                         NO
--     Java wrappers:               NO
--     Java tests:                  NO
-- 
--   Install to:                    C:/lib/OpenCV430
-- -----------------------------------------------------------------
-- 
-- Configuring done
-- Generating done
-- Build files have been written to: G:/venvs/build_cv430/opencv/build
-- 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_aruco:BOOL=ON
BUILD_opencv_bgsegm:BOOL=ON
BUILD_opencv_bioinspired:BOOL=ON
BUILD_opencv_calib3d:BOOL=ON
BUILD_opencv_ccalib:BOOL=ON
BUILD_opencv_core:BOOL=ON
BUILD_opencv_cudaarithm:BOOL=ON
BUILD_opencv_cudabgsegm:BOOL=ON
BUILD_opencv_cudacodec:BOOL=ON
BUILD_opencv_cudafeatures2d:BOOL=ON
BUILD_opencv_cudafilters:BOOL=ON
BUILD_opencv_cudaimgproc:BOOL=ON
BUILD_opencv_cudalegacy:BOOL=ON
BUILD_opencv_cudaobjdetect:BOOL=ON
BUILD_opencv_cudaoptflow:BOOL=ON
BUILD_opencv_cudastereo:BOOL=ON
BUILD_opencv_cudawarping:BOOL=ON
BUILD_opencv_cudev:BOOL=ON
BUILD_opencv_cvv:BOOL=ON
BUILD_opencv_datasets:BOOL=ON
BUILD_opencv_dnn:BOOL=ON
BUILD_opencv_dnn_objdetect:BOOL=ON
BUILD_opencv_dnn_superres:BOOL=ON
BUILD_opencv_dpm:BOOL=ON
BUILD_opencv_face:BOOL=ON
BUILD_opencv_features2d:BOOL=ON
BUILD_opencv_flann:BOOL=ON
BUILD_opencv_fuzzy:BOOL=ON
BUILD_opencv_gapi:BOOL=ON
BUILD_opencv_hfs:BOOL=ON
BUILD_opencv_highgui:BOOL=ON
BUILD_opencv_img_hash:BOOL=ON
BUILD_opencv_imgcodecs:BOOL=ON
BUILD_opencv_imgproc:BOOL=ON
BUILD_opencv_intensity_transform:BOOL=ON
BUILD_opencv_java_bindings_generator:BOOL=ON
BUILD_opencv_js:BOOL=OFF
BUILD_opencv_line_descriptor:BOOL=ON
BUILD_opencv_ml:BOOL=ON
BUILD_opencv_objdetect:BOOL=ON
BUILD_opencv_optflow:BOOL=ON
BUILD_opencv_phase_unwrapping:BOOL=ON
BUILD_opencv_photo:BOOL=ON
BUILD_opencv_plot:BOOL=ON
BUILD_opencv_python3:BOOL=ON
BUILD_opencv_python_bindings_generator:BOOL=ON
BUILD_opencv_python_tests:BOOL=ON
BUILD_opencv_quality:BOOL=ON
BUILD_opencv_rapid:BOOL=ON
BUILD_opencv_reg:BOOL=ON
BUILD_opencv_rgbd:BOOL=ON
BUILD_opencv_saliency:BOOL=ON
BUILD_opencv_shape:BOOL=ON
BUILD_opencv_stereo:BOOL=ON
BUILD_opencv_stitching:BOOL=ON
BUILD_opencv_structured_light:BOOL=ON
BUILD_opencv_superres:BOOL=ON
BUILD_opencv_surface_matching:BOOL=ON
BUILD_opencv_text:BOOL=ON
BUILD_opencv_tracking:BOOL=ON
BUILD_opencv_ts:BOOL=ON
BUILD_opencv_video:BOOL=ON
BUILD_opencv_videoio:BOOL=ON
BUILD_opencv_videostab:BOOL=ON
BUILD_opencv_viz:BOOL=ON
BUILD_opencv_world:BOOL=OFF
BUILD_opencv_xfeatures2d:BOOL=ON
BUILD_opencv_ximgproc:BOOL=ON
BUILD_opencv_xobjdetect:BOOL=ON
BUILD_opencv_xphoto:BOOL=ON
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_BUILD_TYPE:STRING=Release
CMAKE_INSTALL_PREFIX:PATH=C:/lib/OpenCV430
CPU_BASELINE:STRING=AVX2
CPU_DISPATCH:STRING=SSE4_1;SSE4_2;AVX;FP16;AVX2;AVX512_SKX
CUDA_ARCH_BIN:STRING=7.5
CUDA_ARCH_PTX:STRING=
CUDA_FAST_MATH:BOOL=ON
CUDA_GENERATION:STRING=Turing
CUDA_HOST_COMPILER:FILEPATH=C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.25.28610/bin/Hostx64/x64/cl.exe
CUDA_TOOLKIT_ROOT_DIR:PATH=C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.2
CUDA_USE_STATIC_CUDA_RUNTIME:BOOL=ON
CV_DISABLE_OPTIMIZATION:BOOL=OFF
CV_ENABLE_INTRINSICS:BOOL=ON
CV_TRACE:BOOL=ON
Caffe_INCLUDE_DIR:PATH=Caffe_INCLUDE_DIR-NOTFOUND
Caffe_LIBS:FILEPATH=Caffe_LIBS-NOTFOUND
Ceres_DIR:PATH=Ceres_DIR-NOTFOUND
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_FAST_MATH:BOOL=ON
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=OFF
EXECUTABLE_OUTPUT_PATH:PATH=G:/venvs/build_cv430/opencv/build/bin
Eigen3_DIR:PATH=Eigen3_DIR-NOTFOUND
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
Glog_LIBS:FILEPATH=Glog_LIBS-NOTFOUND
HDF5_C_LIBRARY:FILEPATH=HDF5_C_LIBRARY-NOTFOUND
HDF5_INCLUDE_DIRS:PATH=HDF5_INCLUDE_DIRS-NOTFOUND
INSTALL_CREATE_DISTRIB:BOOL=OFF
INSTALL_C_EXAMPLES:BOOL=OFF
INSTALL_PDB:BOOL=ON
INSTALL_PDB_COMPONENT_EXCLUDE_FROM_ALL:BOOL=ON
INSTALL_PYTHON_EXAMPLES:BOOL=ON
INSTALL_TESTS:BOOL=OFF
LAPACK_CBLAS_H:STRING=
LAPACK_IMPL:STRING=Unknown
LAPACK_INCLUDE_DIR:PATH=
LAPACK_LAPACKE_H:STRING=
LAPACK_LIBRARIES:STRING=
Lept_LIBRARY:FILEPATH=Lept_LIBRARY-NOTFOUND
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
OGRE_DIR:PATH=OGRE_DIR-NOTFOUND
OPENCL_FOUND:BOOL=ON
OPENCV_CMAKE_MACRO_WIN32_WINNT:STRING=0x0601
OPENCV_CONFIG_FILE_INCLUDE_DIR:PATH=G:/venvs/build_cv430/opencv/build
OPENCV_DNN_CUDA:BOOL=ON
OPENCV_DNN_OPENCL:BOOL=ON
OPENCV_DOWNLOAD_PATH:PATH=G:/venvs/build_cv430/opencv/.cache
OPENCV_DUMP_HOOKS_FLOW:BOOL=OFF
OPENCV_ENABLE_ALLOCATOR_STATS:BOOL=ON
OPENCV_ENABLE_ATOMIC_LONG_LONG:BOOL=ON
OPENCV_ENABLE_MEMALIGN:BOOL=ON
OPENCV_ENABLE_MEMORY_SANITIZER:BOOL=OFF
OPENCV_ENABLE_NONFREE:BOOL=ON
OPENCV_EXTRA_MODULES_PATH:PATH=G:/venvs/build_cv430/opencv_contrib/modules
OPENCV_FORCE_3RDPARTY_BUILD:BOOL=OFF
OPENCV_FORCE_PYTHON_LIBS:BOOL=OFF
OPENCV_GENERATE_PKGCONFIG:BOOL=OFF
OPENCV_GENERATE_SETUPVARS:BOOL=ON
OPENCV_JAVA_SOURCE_VERSION:STRING=
OPENCV_JAVA_TARGET_VERSION:STRING=
OPENCV_MATHJAX_RELPATH:STRING=https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0
OPENCV_PYTHON3_VERSION:BOOL=OFF
OPENCV_TIMESTAMP:STRING=2020-04-06T14:00:02Z
OPENCV_WARNINGS_ARE_ERRORS:BOOL=OFF
OpenCV_HAL_DIR:PATH=OpenCV_HAL_DIR-NOTFOUND
OpenJPEG_DIR:PATH=OpenJPEG_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=G:/venvs/build_cv430/Scripts/python.exe
PYTHON3_INCLUDE_DIR:PATH=C:/Python/Python38/include
PYTHON3_INCLUDE_DIR2:PATH=
PYTHON3_LIBRARY:FILEPATH=C:/Python/Python38/libs/python38.lib
PYTHON3_LIBRARY_DEBUG:FILEPATH=PYTHON_DEBUG_LIBRARY-NOTFOUND
PYTHON3_NUMPY_INCLUDE_DIRS:PATH=G:/venvs/build_cv430/lib/site-packages/numpy/core/include
PYTHON3_PACKAGES_PATH:PATH=G:/venvs/build_cv430/Lib/site-packages
Qt5Concurrent_DIR:PATH=C:/Qt/Qt5.14.1/5.14.1/msvc2017_64/lib/cmake/Qt5Concurrent
Qt5Core_DIR:PATH=C:/Qt/Qt5.14.1/5.14.1/msvc2017_64/lib/cmake/Qt5Core
Qt5Gui_DIR:PATH=C:/Qt/Qt5.14.1/5.14.1/msvc2017_64/lib/cmake/Qt5Gui
Qt5OpenGL_DIR:PATH=C:/Qt/Qt5.14.1/5.14.1/msvc2017_64/lib/cmake/Qt5OpenGL
Qt5Test_DIR:PATH=C:/Qt/Qt5.14.1/5.14.1/msvc2017_64/lib/cmake/Qt5Test
Qt5Widgets_DIR:PATH=C:/Qt/Qt5.14.1/5.14.1/msvc2017_64/lib/cmake/Qt5Widgets
Qt5_DIR:PATH=C:/Qt/Qt5.14.1/5.14.1/msvc2017_64/lib/cmake/Qt5
Tesseract_DIR:PATH=Tesseract_DIR-NOTFOUND
Tesseract_INCLUDE_DIR:PATH=Tesseract_INCLUDE_DIR-NOTFOUND
Tesseract_LIBRARY:FILEPATH=Tesseract_LIBRARY-NOTFOUND
USE_WIN32_FILEIO:BOOL=TRUE
VTK_DIR:PATH=C:/lib/VTK/lib/cmake/vtk-8.2
WITH_1394:BOOL=ON
WITH_ADE:BOOL=ON
WITH_ARITH_DEC:BOOL=ON
WITH_ARITH_ENC:BOOL=ON
WITH_CLP:BOOL=OFF
WITH_CUBLAS:BOOL=ON
WITH_CUDA:BOOL=ON
WITH_CUDNN:BOOL=ON
WITH_CUFFT:BOOL=ON
WITH_DIRECTX:BOOL=ON
WITH_DSHOW:BOOL=ON
WITH_EIGEN:BOOL=ON
WITH_FFMPEG:BOOL=ON
WITH_FREETYPE:BOOL=OFF
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_MATLAB:BOOL=OFF
WITH_MFX:BOOL=OFF
WITH_MSMF:BOOL=ON
WITH_MSMF_DXVA:BOOL=ON
WITH_NGRAPH:BOOL=OFF
WITH_NVCUVID:BOOL=OFF
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_OPENJPEG:BOOL=ON
WITH_OPENMP:BOOL=OFF
WITH_OPENNI:BOOL=OFF
WITH_OPENNI2:BOOL=OFF
WITH_OPENVX:BOOL=OFF
WITH_PLAIDML:BOOL=OFF
WITH_PNG:BOOL=ON
WITH_PROTOBUF:BOOL=ON
WITH_PVAPI:BOOL=OFF
WITH_QT:BOOL=ON
WITH_QUIRC:BOOL=ON
WITH_TBB:BOOL=OFF
WITH_TESSERACT:BOOL=ON
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
gflags_DIR:PATH=gflags_DIR-NOTFOUND
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はビルド構成の設定項目が多いため、GUI版のCMakeだけで操作を行うと設定が大変です。そのため、基本的な設定はコマンドラインからCUI版のCMakeで行い、細かい微調整が必要な場合だけGUI版のCMakeを使う…という方法をおすすめします。

今回はCUI版のCMakeだけで全ての設定を行っていますが、GUI版のCMakeで微調整を行いたい場合は次のような手順になります。(~/buildフォルダから操作している前提)
なお、GUI版のCMakeで構成を変更した場合は、Conifigure→Generateボタンをクリックして変更内容を適用させてください。

cmake .. -G Ninja -DXXX=XX~  # CUI版のCMakeで基本設定
cmake-gui ..                  # CUI版の設定を引き継いでGUI画面で微調整

ビルド

以下のコマンドでビルド&インストールを行います。
利用している環境によっても違いますが、Ninjaを使ってビルドするとVisual Studio 2019で直接ビルドする場合に比べて大幅にビルド時間を短縮できます。(CMakeの-G "Ninja"という部分)

# OpenCVのビルド
cmake --build .

# OpenCVのインストール
cmake --build . --target install

インストールが完了すると、各ファイルは次の場所に格納されます。

# ビルドしたOpenCVのライブラリ一式("CMAKE_INSTALL_PREFIX"で指定した場所)
# DLLファイルはこのフォルダ配下のx64\vc16\binフォルダに作成されるため、
# PATHを通す場合は"C:\lib\OpenCV430\x64\vc16\bin"を指定する。
C:\lib\OpenCV430


# ===================================================================
# 以下はPython用のwheelを作成した後は不要になるため参考情報
# ===================================================================

# Python用モジュール("PYTHON3_PACKAGES_PATH"で指定した場所にcv2フォルダが作成される)
# ただし、このモジュール自体を利用することは無いため、不要ならcv2フォルダごと削除してOK。
G:\venvs\build_cv430\Lib\site-packages\cv2

# PythonにOpenCVを導入するためのLoader
# setup.pyを使って別のPython環境にOpenCVを導入するためのpython_loaderだが、
# デフォルトではビルドフォルダのモジュールを参照する設定になっているため、そのまま使うことは無い。
G:\venvs\build_cv430\opencv\build\python_loader

# Python用のpydファイルが格納されているフォルダ
G:\venvs\build_cv430\opencv\build\lib\python3

必要なファイルの多くはCMAKE_INSTALL_PREFIXで指定したフォルダ(C:\lib\OpenCV430)に格納されますが、Python用のファイルはビルドフォルダに散らばっています。
この状態だとファイルの管理や、新しいPython環境にOpenCVを導入する手順が複雑になるため、以降ではPython用のwheelパッケージを作成し、「必要な全てのファイルがCMAKE_INSTALL_PREFIXのフォルダ配下に集約された状態」にしていきます。

Python用のwheelパッケージ作成

Python用に作成したOpenCV 4.3.0(その前のバージョンも含む)のファイルには次のような問題が存在するため、今回はPython用のwheelパッケージを独自に作成して、これらの問題を解決していきたいと思います。

  • Pythonで必要なファイルはCMAKE_INSTALL_PREFIXフォルダにインストールされない
  • Pythonで必要なファイルはビルドフォルダ配下に点在した状態になる
  • 新しいPython環境にビルドしたOpenCVを導入する手順が複雑
  • 生成されたpython_loaderはビルドフォルダ配下のファイルを参照している
    (ビルドフォルダを削除すると必要なファイルが見つからなくなる)
  • VTKやQtなどのパスが追加されずにDLLが読み込めない(詳細は以下のメモ参照)

OpenCV 4.2.0の時はVTKやQtなど、パスを通していれば必要なDLLを読み込めていましたが、OpenCV 4.3.0ではパスを通していてもDLLを読み込めずに次のエラーが発生します。
ImportError: DLL load failed while importing cv2: 指定されたモジュールが見つかりません

C++からOpenCVを利用する場合はパスを通すだけで問題なく利用できており、Dependencies(Dependency Walkerの後継)で依存性を確認しても問題ないようなので、Pythonから利用する場合に特化した事象のようです。

この件についてもwheelパッケージを作成する中で対応していきます。

必要なファイルの準備

デフォルトで作成されるpython_loaderをベースにwheelパッケージ作成に必要な変更を行っていきます。作業は引き続き、ビルドに使ったコンソール画面を使用します。

# python_loaderフォルダに移動
cd G:\venvs\build_cv430\opencv\build\python_loader

# pydファイルをcv2のpython-3.8にコピー
xcopy "..\lib\python3\*.pyd" .\cv2\python-3.8 /i

# MANIFEST.inの作成(echoコマンドとリダイレクトを組み合わせて簡単に作成)
echo graft cv2/python-3.8 >MANIFEST.in

フォルダ構成は次のようになります。

python_loader
├ MANIFEST.in
├ setup.py
└─cv2
    ├ __init__.py
    ├ config.py
    ├ config-3.8.py
    ├ load_config_py2.py
    ├ load_config_py3.py
    └ python-3.8
       └ cv2.cp38-win_amd64.pyd

Pythonファイルの修正

テキストエディタを使ってpython_loaderフォルダのsetup.pyと、python_loader/cv2フォルダのconfig.py,config-3.8.pyを次のように編集します。

config.pyに設定するパスは、各自の環境に合わせて適宜読み替えてください。
また、ファイルの中に日本語のコメントを入れるとエラーになる場合があるのでご注意ください。

  • setup.py(56~57行目)
    setuptools.setup()の引数にinclude_package_data=Truezip_safe=Falseを追加します。
    zip_safe=Falseは必須ではありませんが、念のため設定しています。
  • cv2/config.py
    BINARIES_PATHSに依存している実行ファイル(ビルドしたOpenCV、CUDA,VTK,Qtなど)のパスを追加します。パスの区切り文字はスラッシュ”/”を使用してください。
    パスを直接書いても良いのですがos.getenvを使って環境変数で参照場所を変更できるようにしておくと便利です。os.getenvos.getenv(環境変数名, 環境変数が見つからないときの値)という書き方になります。
  • cv2/config-3.8.py
    PYTHON_EXTENSIONS_PATHSにpydファイルの格納フォルダを指定します。
    今回はwheelを使って、それぞれのPython仮想環境にpydファイルも配置する想定なので、動的に各仮想環境のパスが設定されるようにしています。
import os
import sys
import platform
import setuptools

SCRIPT_DIR=os.path.dirname(os.path.abspath(__file__))

def main():
    os.chdir(SCRIPT_DIR)

    package_name = 'opencv'
    package_version = os.environ.get('OPENCV_VERSION', '4.3.0')  # TODO

    long_description = 'Open Source Computer Vision Library Python bindings'  # TODO

    setuptools.setup(
        name=package_name,
        version=package_version,
        url='https://github.com/opencv/opencv',
        license='BSD',
        description='OpenCV python bindings',
        long_description=long_description,
        long_description_content_type="text/markdown",
        packages=setuptools.find_packages(),
        maintainer="OpenCV Team",
        install_requires="numpy",
        classifiers=[
          'Development Status :: 5 - Production/Stable',
          'Environment :: Console',
          'Intended Audience :: Developers',
          'Intended Audience :: Education',
          'Intended Audience :: Information Technology',
          'Intended Audience :: Science/Research',
          'License :: BSD License',
          'Operating System :: MacOS',
          'Operating System :: Microsoft :: Windows',
          'Operating System :: POSIX',
          'Operating System :: Unix',
          'Programming Language :: Python',
          'Programming Language :: Python :: 2',
          'Programming Language :: Python :: 2.7',
          'Programming Language :: Python :: 3',
          'Programming Language :: Python :: 3.4',
          'Programming Language :: Python :: 3.5',
          'Programming Language :: Python :: 3.6',
          'Programming Language :: Python :: 3.7',
          'Programming Language :: Python :: 3.8',
          'Programming Language :: C++',
          'Programming Language :: Python :: Implementation :: CPython',
          'Topic :: Scientific/Engineering',
          'Topic :: Scientific/Engineering :: Image Recognition',
          'Topic :: Software Development',
          'Topic :: Software Development :: Libraries',
        ],
        # Additional parameters.
        include_package_data=True,
        zip_safe=False,
    )

if __name__ == '__main__':
    main()
import os

BINARIES_PATHS = [
    #'G:/venvs/build_cv430/opencv/build/bin'
    os.path.join(os.getenv("CV_PATH", "C:/lib/OpenCV430"), "x64/vc16/bin"),
    os.path.join(os.getenv("VTK_PATH", "C:/lib/VTK"), "bin"),
    os.path.join(os.getenv("QT_PATH", "C:/Qt/Qt5.14.1/5.14.1/msvc2017_64"), "bin"),
    os.path.join(os.getenv("CUDA_PATH", "C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v10.2"), "bin",
    ),
] + BINARIES_PATHS
import os

PYTHON_EXTENSIONS_PATHS = [
    # 'G:/venvs/build_cv430/opencv/build/lib/python3'
    os.path.join(os.path.dirname(os.path.abspath(__file__)), "python-3.8")
] + PYTHON_EXTENSIONS_PATHS

wheelパッケージ作成

ファイルの編集が完了したら、コンソール画面に戻ってwheelパッケージを作成します。

# wheelの導入
pip install wheel

# wheelパッケージの作成(python_loaderフォルダで作業を行う)
# distフォルダにwhlファイルが作成される
python setup.py bdist_wheel

# 作成したwhlファイルを再利用しやすい場所にコピー(任意)
# 今回はOpenCVをインストールしたC:\lib\OpenCV430配下のwheelhouseフォルダにコピー
xcopy .\dist\*.whl C:\lib\OpenCV430\wheelhouse /i

これで、OpenCV 4.3.0のビルドとwheelパッケージの作成が完了です。コンソール画面は利用しないのでexitで終了してOKです。また、ビルドに使用したG:\venvs\build_cv430フォルダも不要であれば削除してもかまいません。

サンプルプログラム用の画像ファイルなどは、インストール先のフォルダにコピーされないので、ビルド時にINSTALL_PYTHON_EXAMPLESを有効にした場合は、ビルドフォルダを削除する前に以下のコマンドでサンプルデータをコピーしておくと良いでしょう。削除した後にサンプルデータを入手したい場合は、OpenCVのgitリポジトリから直接ダウンロードできます。

# サンプルプログラム用のデータをPythonのサンプルフォルダにコピー
xcopy G:\venvs\build_cv430\opencv\samples\data C:\lib\OpenCV430\samples\python /i /s

PythonからOpenCVを使う手順

Python仮想環境の作成とインストール

新しいPython環境に独自にビルドしたOpenCVを導入する手順です。今回はG:\venvs\cvに新しいPythonの仮想環境を作成する例になります。

コマンドプロンプト(普通のコマンドプロンプトでOK)を開いて、以下の手順で導入します。

# 仮想環境を作成して有効化
python -m venv g:\venvs\cv
g:\venvs\cv\Scripts\activate.bat

# pipのアップデート(任意)
python -m pip install --upgrade pip

# 作成したOpenCVのwheelを指定してインストール
# numpyも依存関係に設定しているので自動でインストールされる
pip install C:\lib\OpenCV430\wheelhouse\opencv-4.3.0-py3-none-any.whl

# 動作確認(ビルド情報が表示される)
python -c "import cv2; print(cv2.getBuildInformation())"

import cv2の部分でDLLが読み込めずエラーになる場合、wheelパッケージ作成の時に編集したconfig.pyに依存している実行ファイルへのパスが全て追加されているか確認してみてください。

Pythonのサンプル

ビルド時にINSTALL_PYTHON_EXAMPLESを有効にしていた場合、OpenCVのインストール先にPythonのサンプルも追加されています。サンプルコードはdemo.pyから起動できます。

# Pythonサンプルの起動
# 起動する前に、OpenCVをインストールしたPython仮想環境を有効にしておく必要があります
cd /d C:\lib\OpenCV430\samples\python
python demo.py