Windows上でOpenCV 4.1.0をCUDA、VTK、Qtを有効にしてソースコードからビルドする手順を紹介します。Python 3.7からも利用できるようにします。
この手順は、以前に書いた「OpenCV 4.0.1(CUDA 10.0, VTK 8.2.0, Qt5.12.2)をWindowsでビルドしてPythonから使う方法」をOpenCV 4.1.0、Python 3.7用にアップデートしたものです。
Contents
ビルド環境
今回は、以下の環境を利用して、OpenCV 4.1.0をソースからビルドします。
- Microsoft Windows 10 Pro
- Microsoft Visual Studio Community 2017 Version15.9.11
- Git for Windows(gitコマンドが利用できれば良い)
- CMake 3.1.4
- Python 3.7.3 for Windows(導入方法はTensorFlowのビルド方法のPython部分を参照)
- CUDA 10.0(導入方法はnVIDIA CUDA Toolkit 10 のインストールを参照)
- VTK 8.2.0(導入方法はVTK 8.2.0をWindowsでビルドを参照)
- Qt 5.12.2(導入方法はQt5.12.2のインストールを参照)
Visual Studio 2019を使うとビルドに失敗したので、Visual Studio 2017を使っています。
また、Python 3.7.3、CUDA 10.0、VTK 8.2.0、Qt 5.12.2については、環境変数PATHにパスを追加してライブラリや実行ファイルが参照できるような状態にしています。
// 環境変数PATHに追加している内容(関係する部分) // CUDA 10.0 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\libnvvp C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\extras\CUPTI\libx64 // Git for Windows C:\Program Files\Git\cmd // Qt5 C:\Qt\Qt5.12.2\5.12.2\msvc2017_64\bin // VTK C:\lib\VTK\bin // Python 3.7.3 C:\Python37\Scripts\ C:\Python37\
ビルドで利用するPython環境作成
Python3用のビルドでnumpyが必要になるため、OpenCV 4.1.0のビルドで利用するPythonの仮想環境を作成します。今回は、C:\venvs\build_opencv410
にビルド用の仮想環境を作成しました。
コマンドプロンプトで以下のコマンドを実行してビルド用の仮想環境を作成します。
rem 仮想環境の作成 python -m venv C:\venvs\build_opencv410 C:\venvs\build_opencv410\Scripts\activate rem numpyの導入 pip install numpy
導入されるパッケージは以下のようになります。
(build_opencv410) C:>pip list Package Version ---------- ------- numpy 1.16.2 pip 19.0.3 setuptools 40.8.0
OpenCVをPython用にビルドするためにはnumpyが必要になります。numpyの設定を行わないと、CMakeのオプションに「BUILD_opencv_python3」が表示されず、Python用のモジュールを作成できません。
Python 3.6.8を利用していたときは、Pythonのsite-packagesフォルダにnumpyが導入されていた(最初から入っていたのか、後から誤って入れたのかは不明)のですが、Python 3.7.3の場合はsite-packagesにはpipとsetuptoolsくらいしか入っていなかったので、OpenCVのビルド用にbuild_opencv410という仮想環境を作成してnumpyを導入しています。
OpenCV 4.1.0のビルド
ソースファイルの取得
今回はc:\build\opencv410
フォルダ配下にOpenCV 4.1.0のソースコードを取得してきます。コマンドプロンプトで以下のコマンドを実行します。
rem 作業用のフォルダ作成 mkdir c:\build\opencv410 cd /d c:\build\opencv410 rem OpenCVのソース取得 git clone https://github.com/opencv/opencv.git cd opencv git checkout 4.1.0 cd .. rem OepnCV Contribのソース取得 rem OpenCVのビルドにはcontribのopencv_cudevが必須 git clone https://github.com/opencv/opencv_contrib.git cd opencv_contrib git checkout 4.1.0 cd ..
OpenCV 4.1.0のビルドにも、OpenCV 4.0.1の時と同じようにcontribのopencv_cudevが必須になると思われます。
OpenCV 4.1.0のビルド設定
CMake GUIを起動し、Where is the source codeにC:/build/opencv410/opencv
、Where to build the binariesにC:/build/opencv410/opencv/build
を指定してConfigureボタンをクリックします。コンパイラはVisual Studio 15 2017、x64を選択してください。
環境によって設定項目も変わってきますが、「設定変更→Configureボタンをクリック」という作業を何度か繰り返しながら以下のように設定します。(ポイントになる部分には赤い矢印を付けています)
OPENCV_EXTRA_MODULES_PATH
に、opencv_contribのmodulesフォルダを指定します。(パスの区切りにはスラッシュ/を使用)
Python 3用のパッケージを作成するため、PYTHON3_NUMPY_INCLUDE_DIRS
とPYTHON3_PACKAGES_PATH
に、上の手順で作成した仮想環境build_opencv410
のnumpyのincludeフォルダと、site-packagesフォルダを指定します。
CMAKE_INSTALL_PREFIX
はOpenCVのインストール先になるので好みに応じて書き換えてください。CPUやCUDAのアーキテクチャは、利用している環境に合わせて設定を行います。(最初はCUDA_ARCH_PTX
にも7.5と値を設定していたのですが、Configureで空白に戻るので、空白のままにしています)
CUDA、VTK、QT、Python3を利用するため、WITH_CUDA
、WITH_VTK
、WITH_QT
、OPENCV_PYTHON3_VERSION
、BUILD_opencv_python3
にチェックを入れます。(一部はCMake側で自動的にチェックが有効になります)
設定項目数は多いのですが、手動で変更している内容(CMakeのShow My Changes)は次のようになります。この項目以外は、CMake側で自動で設定された値になります。
BUILD_JAVA:BOOL=0 BUILD_opencv_java_bindings_generator:BOOL=0 BUILD_PERF_TESTS:BOOL=0 BUILD_TESTS:BOOL=0 CMAKE_INSTALL_PREFIX:PATH=C:/lib/OpenCV410 CPU_BASELINE:STRING=AVX2 CPU_DISPATCH:STRING=AVX2 CUDA_ARCH_BIN:STRING=7.5 CUDA_ARCH_PTX:STRING=7.5 CUDA_FAST_MATH:BOOL=1 CUDA_GENERATION:STRING=Turing INSTALL_PYTHON_EXAMPLES:BOOL=1 OPENCV_ENABLE_NONFREE:BOOL=1 OPENCV_EXTRA_MODULES_PATH:PATH=C:/build/opencv410/opencv_contrib/modules OPENCV_PYTHON3_VERSION:BOOL=1 PYTHON3_NUMPY_INCLUDE_DIRS:PATH=C:/venvs/build_opencv410/Lib/site-packages/numpy/core/include PYTHON3_PACKAGES_PATH:PATH=C:/venvs/build_opencv410/Lib/site-packages WITH_CUDA:BOOL=1 WITH_QT:BOOL=1
設定が完了したら、GenerateボタンでVisual Studio 2017のソリューションを作成し、Open Projectボタンでソリューションファイルを開きます。(作成されたC:\build\opencv410\opencv\build\OpenCV.sln
を直接Visual Studio 2017で開いてもOKです)
OpenCV 4.1.0のビルド
Visual Studio 2017のバッチビルドで、INSTALLをリビルド(ビルドでもOK)します。
OpenCV 4.1.0を使うための設定
OpenCV 4.1.0のフォルダ構成
ビルドが完了すると、以下のようなフォルダ構成でOpenCV 4.1.0が配置されます。
OpenCVの各種ファイルは、ビルド設定のCMAKE_INSTALL_PREFIX
で指定したフォルダ(C:\lib\OpenCV410)に展開されます。また、Python 3用のモジュールは、PYTHON3_PACKAGES_PATH
で指定したフォルダ配下(C:\venvs\build_opencv410\Lib\site-packages\cv2)に配置されます。
// ビルド後のフォルダ構成(一部のフォルダは省略) // OpenCV 4.1.0の各種ファイル C:\lib\OpenCV410 ├─bin ├─etc │ ├─haarcascades │ ├─lbpcascades │ └─licenses ├─include │ └─opencv2 ├─samples └─x64 └─vc15 ├─bin └─lib // Python 3用のモジュール C:\venvs\build_opencv410 └─Lib └─site-packages └─cv2 └─python-3.7
PATH設定
OpenCVのDLLファイルが参照できるように、インストール先のbinフォルダ(C:\lib\OpenCV410\x64\vc15\bin
)を環境変数PATHに追加します。なお、依存しているCUDA、VTK、Qtなどにもパスを通しておく必要があります。
OpenCVへのパスが通っているかどうかは、whereコマンドで確認できます。もし、whereコマンドでファイルが見つからない(もしくはインストールした場所とは違う場所のOpenCVが先に表示された)場合は環境変数PATHの設定を確認してみてください。
rem whereコマンドでopencv_*.dllを確認 C:\>where opencv_*.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_aruco410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_bgsegm410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_bioinspired410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_calib3d410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_ccalib410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_core410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_cudaarithm410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_cudabgsegm410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_cudacodec410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_cudafeatures2d410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_cudafilters410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_cudaimgproc410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_cudalegacy410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_cudaobjdetect410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_cudaoptflow410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_cudastereo410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_cudawarping410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_cudev410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_cvv410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_datasets410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_dnn410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_dnn_objdetect410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_dpm410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_face410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_features2d410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_ffmpeg410_64.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_flann410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_fuzzy410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_gapi410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_hfs410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_highgui410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_imgcodecs410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_imgproc410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_img_hash410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_line_descriptor410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_ml410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_objdetect410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_optflow410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_phase_unwrapping410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_photo410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_plot410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_quality410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_reg410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_rgbd410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_saliency410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_shape410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_stereo410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_stitching410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_structured_light410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_superres410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_surface_matching410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_text410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_tracking410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_video410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_videoio410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_videostab410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_viz410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_xfeatures2d410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_ximgproc410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_xobjdetect410.dll C:\lib\OpenCV410\x64\vc15\bin\opencv_xphoto410.dll
依存しているライブラリを含めてPATHが通っていなくてdllファイルを見つけられない場合は、OpenCVの実行時に「DLL load failed: 指定されたモジュールが見つかりません」というようなエラーメッセージが表示されます。(Qtには同じようなフォルダが複数ありますが、Qtのwinrt~系のフォルダを指定するとOpenCVでdllファイルが見つからずにエラーが出ます)
OpenCV 4.1.0をPythonから利用する方法
Pythonの仮想環境作成
cv410という仮想環境を作成して、PythonからOpenCVを利用できるようにします。
rem 仮想環境を作成してアクティブ化 python -m venv C:\venvs\cv410 C:\venvs\cv410\Scripts\activate.bat rem OpenCVの導入 python C:\build\opencv410\opencv\build\python_loader\setup.py install rem 導入されたパッケージの確認 pip list Package Version ---------- ------- numpy 1.16.2 opencv 4.1.0 pip 19.0.3 setuptools 40.8.0
Python用のモジュールは、PYTHON3_PACKAGES_PATH
で指定したsite-packagesフォルダにcv2というフォルダ名で作成されるため、そのcv2フォルダを各仮想環境のsite-packagesフォルダに手動コピーしてもOpenCVを利用できるようになります。
しかし手動コピーした場合はpipで表示されないので、OpenCVのビルド時に作成されるpython_loader配下のsetup.pyを使って導入することをおすすめします。setup.py経由で導入すれば、numpyの導入も自動で行われ、pipコマンドでもopencvが表示されるようになります。
OpenCVを利用できるかどうか、以下のコマンドで確認できます。
rem OpenCVのバージョン表示 rem 正しくインストールできていれば 4.1.0 と表示される (cv410) C:\>python -c "import cv2; print(cv2.__version__)" 4.1.0 rem OpenCVのビルド情報表示 rem 正しくインストールしていればOpenCVのビルド情報が詳細に表示される (cv410) C:\>python -c "import cv2; print(cv2.getBuildInformation())"
C/C++からOpenCVを利用する場合は、OpenCVをインストールしたフォルダ配下にあるinclude、およびlibファイルを参照するようにプロジェクトを設定すればOKです。なお、実行時にはbinフォルダへのパスを通しておく(もしくは実行ファイルと同じ場所に各種dllファイルを配置しておく)必要があります。
Python用のOpenCVサンプル(デモ)
ビルド設定で、INSTALL_PYTHON_EXAMPLES
にチェックを入れていれば、C:\lib\OpenCV410\samples\python
フォルダにPythonのサンプルコードが入っています。
色々なサンプルがありますが、demo.pyが全てのサンプルを起動するランチャーになっているので、python demo.py
でランチャーを経由して各種サンプルを起動できるようになっています。