Cudaに対応したOpenCVのビルド方法（OpenCV with Cuda）

# Cudaに対応したOpenCVのビルド方法
Cudaに対応したOpenCVを使おうとしたところ、少し苦戦したので備忘録代わりにおいておきます。

# OpenCVでCudaを使うにはビルド時に指定する必要がある

通常通りにOpenCVを導入した後にGPUを使わせようと思っても以下のエラーが出て使えません。
```
what():  OpenCV(4.8.0-dev) /home/Desktop/include/opencv/modules/core/include/opencv2/core/private.cuda.hpp:106: error: (-216:No CUDA support) The library is compiled without CUDA support in function 'throw_no_cuda'
```

OpenCVをCudaに対応させるには、コンパイルをする前にcmakeでCudaを使うように設定を変える必要があります。


条件の指定方法は下記のサイトを参考にしてください。
今回私はCuda11.6、OpenCV4.5.5を使ってビルドを行っています。

https://chantastu.hatenablog.com/entry/2023/03/19/105908

さて、ここでサイトに従ってmakeを行うと、以下のようなエラーが出ました。

```
  435 |         function(_Functor&& __f)
      |                                                                                                                                                 ^ 
/usr/include/c++/11/bits/std_function.h:435:145: note:         ‘_ArgTypes’
/usr/include/c++/11/bits/std_function.h:530:146: error: parameter packs not expanded with ‘...’:
  530 |         operator=(_Functor&& __f)
      |                                                                                                                                                  ^ 
/usr/include/c++/11/bits/std_function.h:530:146: note:         ‘_ArgTypes’

CMake Error at cuda_compile_1_generated_gpu_mat_nd.cu.o.Release.cmake:280 (message):
  Error generating file  /home/Downloads/install_opencv_with_cuda/opencv/build/modules/core/CMakeFiles/cuda_compile_1.dir/src/cuda/./cuda_compile_1_generated_gpu_mat_nd.cu.o
```

# C++11を使ってそのままコンパイルするとエラーが生じる

調べてみたところ、下記のサイトに同じエラーの解決策が示してありました。

https://github.com/NVIDIA/apex/issues/1491

https://github.com/NVlabs/instant-ngp/issues/119

どうやらコンパイラのせいでエラーが生じているみたいです。
私はg++10を使ってコンパイルするようにしました。
とりあえず自分用に、opencvのインストールからmakeまですべてのコマンドを載せておきます。

```
wget -O opencv.zip https://github.com/opencv/opencv/archive/refs/tags/4.5.5.zip
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/refs/tags/4.5.5.zip
unzip opencv.zip
unzip opencv_contrib.zip
cd opencv && mkdir build && cd build

CC=/usr/bin/gcc-10 CXX=/usr/bin/g++-10 CUDA_PATH="/usr/local/cuda-11.6" CFLAGS="-I/usr/local/cuda-11.6/include" LDFLAGS="-L/usr/local/cuda-11.6/lib64" \
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D INSTALL_C_EXAMPLES=OFF \
-D WITH_TBB=ON \
-D BUILD_opencv_cudacodec=OFF \
-D ENABLE_FAST_MATH=1 \
-D CUDA_FAST_MATH=1 \
-D WITH_CUDA=ON \
-D WITH_CUBLAS=1 \
-D WITH_V4L=ON \
-D WITH_QT=OFF \
-D WITH_OPENGL=ON \
-D WITH_GSTREAMER=ON \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_PC_FILE_NAME=opencv.pc \
-D OPENCV_ENABLE_NONFREE=ON \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
-D BUILD_EXAMPLES=ON \
-D WITH_CUDNN=ON \
-D OPENCV_DNN_CUDA=ON \
-D CUDA_ARCH_BIN=8.6 .. 

CC=/usr/bin/gcc-10 CXX=/usr/bin/g++-10 CUDA_PATH="/usr/local/cuda-11.6" CFLAGS="-I/usr/local/cuda-11.6/include" LDFLAGS="-L/usr/local/cuda-11.6/lib64" make -j16

sudo make install
```
CUDA_ARCH_BINの値に関してはこちらから調べてください。

https://developer.nvidia.com/cuda-gpus

Cudaに対応したOpenCVのビルド方法は下記サイトが一番詳しいです。

https://medium.com/@sb.jaduniv/how-to-install-opencv-4-2-0-with-cuda-10-1-on-ubuntu-20-04-lts-focal-fossa-bdc034109df3