Computer Vision

OpenCV 4.1.0(CUDA 10.0, VTK 8.2.0, Qt5.12.2)をWindowsでビルドしてPythonから使う方法

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用にアップデートしたものです。

ビルド環境

今回は、以下の環境を利用して、OpenCV 4.1.0をソースからビルドします。

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 codeC:/build/opencv410/opencvWhere to build the binariesC:/build/opencv410/opencv/buildを指定してConfigureボタンをクリックします。コンパイラはVisual Studio 15 2017、x64を選択してください。

環境によって設定項目も変わってきますが、「設定変更→Configureボタンをクリック」という作業を何度か繰り返しながら以下のように設定します。(ポイントになる部分には赤い矢印を付けています)

OpenCV 4.1.0 Build settings

OPENCV_EXTRA_MODULES_PATHに、opencv_contribのmodulesフォルダを指定します。(パスの区切りにはスラッシュ/を使用)

Python 3用のパッケージを作成するため、PYTHON3_NUMPY_INCLUDE_DIRSPYTHON3_PACKAGES_PATHに、上の手順で作成した仮想環境build_opencv410numpyのincludeフォルダと、site-packagesフォルダを指定します。

CMAKE_INSTALL_PREFIXOpenCVのインストール先になるので好みに応じて書き換えてください。CPUやCUDAのアーキテクチャは、利用している環境に合わせて設定を行います。(最初はCUDA_ARCH_PTXにも7.5と値を設定していたのですが、Configureで空白に戻るので、空白のままにしています)

CUDA、VTK、QT、Python3を利用するため、WITH_CUDAWITH_VTKWITH_QTOPENCV_PYTHON3_VERSIONBUILD_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 Batch build

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でランチャーを経由して各種サンプルを起動できるようになっています。