OpenCV with CUDA ビルドの備忘録

# やること
OpenCV with CUDA をビルドする  
※OpenCVとOpenCV contribをダウンロードし、一緒にビルドしてあげる必要があるそう。  

# 環境
VisualStudio 2017  
CUDA 11.3  
Windows10  
※OpenCVは、C++で使用することを想定している。  

# 各手順

1. CMake GUIインストール
   以下に従い、最新版をインストール
    [CMake【インストール編】](https://qiita.com/openfields/items/78ee99ce6e7100b7b3d6)
    [cmake のインストール（Windows 上）](https://www.kkaneko.jp/tools/win/cmake.html)  

2. 1回目のconfigure実行までは以下を参考にして行う。  
    [OpenCV + OpenCV Contribをビルド 【Windows編】](https://swallow-incubate.com/archives/blog/20200508/)  

3. 以下を参考に、Pythonのインストール。Python インストール後、要再起動  
 https://www.kkaneko.jp/tools/win/windows_opencv.html
上記参考サイトでは、pipで以下のコマンドをたたいていたが、
pip install -U pip setuptools
pip install -U numpy pylint flake8
pip install h5py
pip uninstall python-opencv
追加で、pip install h5py も行う。

4. 2回目のconfigure実行時は、以下を参考にして行う。  
    [OpenCV 4.1.0をCUDA対応でビルド](https://blog.goo.ne.jp/pearlwing/e/01f8a3178a0ece4394532899f38aba35)  
    ・しかし、参考ページとは異なり、WITH_TBBはONにしていない。また、私の場合、以下の赤字の項目に加えて、WITH_CUDA, WITH_OPENGLをON、OPENCV_EXTRA_MODULE_PATHに、opencv_contribフォルダ内のmodulesフォルダへのパスを設定した。  
    ・CUDA_ARCH_BIN, CUDA_ARCH_PTXはGPUの[copute capability](https://developer.nvidia.com/cuda-gpus)を設定する。  
    ・CUDA_GENERATIONは各自のGPUの世代を設定する。  
![Opencv with cuda img1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1077648/e7a38974-639f-6198-57ae-3f60319d57c6.png)  

5. 2回目のconfigure実行後、generateを行い、opencvをビルドする。  
    詳細は、以下を参照  
    [OpenCV + OpenCV Contribをビルド 【Windows編】](https://swallow-incubate.com/archives/blog/20200508/)  

※以上、ビルドが完了すると、opencvのビルド用フォルダ内に、installフォルダがあることが確認できる。このinstallフォルダ内のincludeフォルダ内にヘッダ、x64→vc15フォルダ内に、bin, libが入っている。  

参考までに、ビルド結果、1つ失敗したが問題なかった。


# 注意点
色んな情報を参考にし、ビルドを試みたが、かなりはまったため、注意点も記載する。  

・環境変数でPROXYの設定を行い、再起動しておくこと(PROXY環境下の場合)  
    →これを行わないと、configureとかのログで、proxyで、アクセスに失敗したといったログが表示されていた。  

・OpenCV関連をCドライブ以下に配置した場合は、一応CMAKE guiを管理者権限で実行すること  
     → 管理者権限でない場合、データの書き込みがうまくいかず、configure等でエラーが発生する場合があるらしい。  
    [CMakeを用いたOpenCVビルド](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11109845916)  

・使用しているCUDAに合わせたOpenCVをインストールすること。  
     → 最初は、OpenCV4.5.1を使おうとしたが、configureが通らなかった。  
    ※以下に、OpenCV-CUDAの対応関係が記載されているが、CUDA11.3にマッチしたOpenCVの記載はなかった、、、とりあえず、使っているCUDAにあったOpenCVをインストールする必要があるのはわかった。  
    [OpenCVをCUDA付きでビルドする際にサポートされる範囲](https://qiita.com/tomoaki_teshima/items/294c9ffb03a3dcc4cfef)  
     → 私の場合、以下の記事を参考にし、OpenCVは4.5.2を使用した。  
    [OpenCV 4.5.2 + CUDA11.3 + RTX3070 チューニングビルド](https://zenn.dev/pinto0309/scraps/9ac10e054a2205)  

・1回目のconfigure押下後に、表示される画面で、赤線部がx64になっていることを確認すること  
     → 参考記事では、デフォがx64になっていたが、私の環境では、なぜかデフォがWin32だった、、、その場合、generateでエラーが起き、ビルドもできない。  
![Opencv with cuda img2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1077648/26846fbb-2812-271b-757d-44f815e99ec9.png)  

・私の環境では、「VS studioのプロジェクトのプロパティ->デバッグ->環境」に、以下、h5pyへのpathを追加しなければ、opencv with cudaを用いたVisualStudioでの処理実行時に、「hdf5.dll, zlib.dlが存在しない」とエラーが出てきてしまった。

「VS studioのプロジェクトのプロパティ->デバッグ->環境」に、以下、h5pyへのpathを追加しなければ、先ほどと同様に、処理実行時に、「hdf5.dll, zlib.dlが存在しない」とエラーが出てきてしまった。

「C:\Program Files\Python39\Lib\site-packages\h5py」

・また、以下のように、cudaの中に備わっている画像処理ライブラリ(NPP)を使えるようにしなければ、プログラム実行時に、
　npp系のdllがないとエラーが出る。

a.「VS studioのプロジェクトのプロパティ->デバッグ->環境」に、以下のようなcudaのbinディレクトリへのpathの追加

「$(CUDA_PATH)\bin」

b.「VS studioのプロジェクトのプロパティ->C/C++->全般->追加のインクルードディレクトリ」に、以下のようなcudaのincludeディレクトリへのpathの追加

「$(CUDA_PATH)\include」

c.「VS studioのプロジェクトのプロパティ->リンカー->全般->追加のライブラリディレクトリ」に、以下のようなcudaのlibディレクトリへのpathの追加

「$(CUDA_PATH)\lib」
「$(CUDA_PATH)\lib\x64」

d.「VS studioのプロジェクトのプロパティ->リンカー->入力->追加の依存ファイル」に、以下のようなcudaの中に備わっている画像処理ライブラリ名の追加

「nppc.lib
　nppial.lib
　nppicc.lib
　nppidei.lib
　nppif.lib
　nppig.lib
　nppim.lib
　nppist.lib
　nppisu.lib
　nppitc.lib
　npps.lib」