OpenCV 4.3.0をCUDA等のオプションを有効にしてWindows 10でビルドする手順のまとめです。
これまでにもOpenCVをビルドする手順を何度か紹介してきましたが、今回はビルド構成の設定にかかる手間を減らし、より簡単にビルドできる手順にしています。また、ビルドにはNinjaを使用し、マルチコア環境でのビルド時間を大幅に短縮できるようにしています。
Contents
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をビルドする前に、下記のソフトウェアを導入しておく必要があります。
- Microsoft Visual Studio Community 2019(導入方法はこちらを参照)
- CUDA 10.2 + cuDNN 7.6.5(導入方法はこちらを参照)
- VTK 8.2.0(導入方法はこちらを参照)
- Qt 5.14.1(導入方法はこちらを参照)
- Python 3.8.2(Python.orgからダウンロードしてインストール)
- CMake 3.17.0(ここからダウンロードしてインストール)
- Ninja 1.10.0(ここからダウンロードして任意の場所に展開)
- git(Git for Windowsなどgitコマンドが使えればOK)
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=True
とzip_safe=False
を追加します。zip_safe=False
は必須ではありませんが、念のため設定しています。cv2/config.py
BINARIES_PATHS
に依存している実行ファイル(ビルドしたOpenCV、CUDA,VTK,Qtなど)のパスを追加します。パスの区切り文字はスラッシュ”/”を使用してください。
パスを直接書いても良いのですがos.getenv
を使って環境変数で参照場所を変更できるようにしておくと便利です。os.getenv
はos.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