编译opencv cuda 版本

因为要测试人脸识别算法,于是需要安装opencv的cuda的版本

本次编译机器环境 (Intel® Core™ i7-6700K CPU @ 4.00GHz × 8 GeForce GTX 1060 6GB/PCIe/SSE2)
系统环境: ubuntu 18.04
gcc 6.0
g++ 6.0
cuda 10.0
nvcc 10.0

编译前安装

# 安装编译工具
sudo apt-get install build-essential
# 安装依赖包
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
# 安装可选包
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
1. 下载opencv和opencv_contrib代码 
2. 将opencv_contrib源码放到opencv文件夹
3. cd opencv
4. mkdir build 
5. cd build
6. cmake  -D CMAKE_BUILD_TYPE=RELEASE                            \
          -D CMAKE_INSTALL_PREFIX=~/Software/OpenCV              \
          -D WITH_CUDA=ON                                        \
          -D CUDA_GENERATION=Pascal                              \
          -D ENABLE_FAST_MATH=1                                  \
          -D CUDA_FAST_MATH=1                                    \
          -D WITH_CUBLAS=1                                       \
          -D WITH_CUDNN=ON                                       \
          -D WITH_OPENCL=ON                                      \
          -D INSTALL_PYTHON_EXAMPLES=ON                          \
          -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules \ 
          -D BUILD_EXAMPLES=ON .. 
8. make -j8
9. make install

注:

  • opencvopencv_contrib下载链接
  • 安装目录并不是大多数的/usr/local/ 而是安装在我的个人文件夹
  • 其中WITH_CUDA=ON是一个编译cuda模块的开关

cmake之后会有这样的显示,显示有那些模块将会被编译

--   OpenCV modules:
--   To be built:                 aruco bgsegm bioinspired calib3d ccalib core
	 						      cudaarithm cudabgsegm cudacodec cudafeatures2d
							      cudafilters cudaimgproc cudalegacy cudaobjdetect
							      cudaoptflow cudastereo cudawarping cudev 
							      datasets dnn dnn_objdetect dnn_superres dpm face
							      features2d flann freetype fuzzy gapi hdf hfs 
							      highgui img_hash imgcodecs imgproc line_descriptor 
							      ml objdetect optflow phase_unwrapping photo plot
							      python2 python3 quality reg rgbd saliency sfm shape
							      stereo stitching structured_light superres
							      surface_matching text tracking ts video videoio
							      videostab xfeatures2d ximgproc xobjdetect xphoto
--   Disabled:                    world
--   Disabled by dependency:      -
--   Unavailable:                 cnn_3dobj cvv java js matlab ovis viz xfeatures2d
--   Applications:                tests perf_tests examples apps
--   Documentation:               NO
--   Non-free algorithms:         NO

安装过程出现的问题

问题一:

cc: error trying to exec 'cc1plus': execvp: No such file or directory
CMake Error at cuda_compile_1_generated_gpu_mat.cu.o.Release.cmake:219 (message):
Error generating
  /home/z/Software/opencv_412/build/modules/core/CMakeFiles/cuda_compile_1.dir/src
  /cuda/./cuda_compile_1_generated_gpu_mat.cu.o
modules/core/CMakeFiles/opencv_core.dir/build.make:63: recipe for target 'modules/
core/CMakeFiles/cuda_compile_1.dir/src/cuda/cuda_compile_1_generated_gpu_mat.cu.o' 
failed make[2]: *** [modules/core/CMakeFiles/cuda_compile_1.dir/src/cuda
/cuda_compile_1_generated_gpu_mat.cu.o] Error 1

原因: 因为gcc 和g++版本不一致, 将gcc 和个g++ 切换为一致版本, 并且建议使用较低版本的gcc 和g++ 否则可能会报错,而ubuntu18.04自带两个版本的gcc和g++

sudo update-alternatives --install /usr/bin/gcc  gcc /usr/bin/gcc-6 70
sudo update-alternatives --install /usr/bin/g++  g++ /usr/bin/g++-6 70

update-alternatives 是用于管理gcc 和g++ 版本的工具, 通过查看

ls /usr/bin | grep gcc
ls /usr/bin | grep g++

可以发现gcc g++ 其实只是一个只是一个软连接, 链接到别处,通过update-alternatives 中间工具指向真正的gcc和g++ 在让/usr/bin/gcc /usr/bin/g++指向这个工具,就可以在不同版本之间切换

问题二

ERROR: Fermi, Kepler, Maxwell, Pascal, Volta, Turing, Auto Generations are
  suppered.

原因: 需要添加cuda的显卡的架构

-D CUDA_GENERATION=Pascal

具体的:参考一下网站
linux平台编译cuda版本opencv 维基百科的CUDA, 重点关注那个表格

Build OpenCV with CUDA support

问题三

fatal error: features2d/test/test_detectors_regression.impl.hpp: 
No such file or directory

解决方法:
/opencv_412/opencv/modules/features2d/test/test_descriptors_regression.impl.hpp 拷贝到 /home/z/Software/opencv_412/opencv/opencv_contrib/modules/xfeatures2d/test

问题四

boostdesc_bgm.i: No such file or directory
  • 参考编译OpenCV以及openc_contrib提示缺少boostdesc_bgm.i文件出错的解决
  • 采用的是源码编译的方式,所以可以查看 build 文件夹下的日志文件 CMakeDownloadLog.txt,在日志文件CMakeDownloadLog.txt中搜索 boostdesc_bgm.i 关键词 (不是在文件夹中搜索),
    发现这个文件下载失败了。日志文件里就有它的下载地址,直接复制其下载地址到网页可以看该到文件的源码,直接拷贝源码并生存同名文件,放在 opencv_contrib/modules/xfeatures2d/src/ 路径下即可

总的来说,编译opencv前前后后话了一天的时间,中间因为一些问题一时间搜不到答案,于是暂停了.
中间出现过一个错误,cuda的版本是cuda10.0 但是系统环境下指向的是nvcc9.1的cuda编译器,导致出现莫名其妙的错误,知道我使用cuda程序的时候,发现nvcc版本于cuda版本不匹配,才解决这个问题,因此编译opecv最终才得以成功, 但是当你成功编译opencv的时候,能了解到的东西就值了!