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を使ってビルドを行っています。
さて、ここでサイトに従って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を使ってそのままコンパイルするとエラーが生じる
調べてみたところ、下記のサイトに同じエラーの解決策が示してありました。
どうやらコンパイラのせいでエラーが生じているみたいです。
私は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の値に関してはこちらから調べてください。
Cudaに対応したOpenCVのビルド方法は下記サイトが一番詳しいです。