1、我的电脑配置:Ubuntu 16.04+ Cuda 9.0 +cudnn 7.6.2+ Opencv 2.4.9 + Opencv3.4.3
2、 跑很多工程的时候普遍用到了GPU加速,因此在自己的电脑上安装了CUDA和加入了gpu模块的Opencv,因为很多工程是Opencv2或3的版本,所以干脆直接在电脑上安装了这两个版本,使用时直接切换就行
3、 这里先介绍安装的整个过程,如果按照命令安装过程中出现了问题再直接在本文最后查找有没有相似的问题和解决方案
这里就不再啰嗦了,详细安装方式可以参考我的另一篇记录文章。
由于Opencv 2.4.9和Opencv 3.4.3的依赖项相同,所以都写在这里:
sudo apt-get install build-essential 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
采用源码安装方式,所以先下载Opencv 2.4.9源码. 然后解压后进入到opencv 2.4.9文件夹下依次输入以下命令:
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -DCUDA_CUDA_LIBRARY=/usr/local/cuda/lib64/stubs/libcuda.so -D CMAKE_LIBRARY_PATH=/usr/local/cuda/lib64/stubs -D WITH_CUDA=ON -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=ON -D WITH_QT=ON -D WITH_OPENGL=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D WITH_CUBLAS=1 -D CUDA_GENERATION=Fermi ..
make -j4
sudo make install
采用源码安装方式,所以先下载Opencv 3.4.3源码. 使用opencv3运行人脸识别时会出现问题,是因为opencv3中缺乏opencv_contrib模块,下载opencv_contrib-3.4.3(下载与opencv对应版本)模块,解压并移动到opencv3.4.3文件夹. 进入到opencv 3.4.3文件夹下依次输入以下命令:
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local/opencv3 -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib-3.4.3/modules/ -DCUDA_CUDA_LIBRARY=/usr/local/cuda/lib64/stubs/libcuda.so -D CMAKE_LIBRARY_PATH=/usr/local/cuda/lib64/stubs -D WITH_CUDA=ON -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=ON -D WITH_QT=ON -D WITH_OPENGL=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D WITH_CUBLAS=1 -D CUDA_GENERATION=Fermi ..
make -j4
sudo make install
这是安装Opencv 2和Opencv3的整个过程,顺利安装完成那就再好不过了,但是不出意外的话直接编译安装一定会出错. 没关系,如果出现错误,就在本文最后查看有没有相似的问题和解决方案.
解决方法: 更改 opencv-2.4.9/cmake/OpenCVDetectCUDA.cmake 文件,把文件中如下内容:
if(CUDA_GENERATION STREQUAL “Fermi”)
set(__cuda_arch_bin “2.0 2.1(2.0)”)
elseif(CUDA_GENERATION STREQUAL “Kepler”)
if(${CUDA_VERSION} VERSION_LESS “5.0”)
set(__cuda_arch_bin “3.0”)
else()
set(__cuda_arch_bin “3.0 3.5”)
endif()
改为:
if(CUDA_GENERATION STREQUAL “Fermi”)
set(__cuda_arch_bin “3.0 3.5”)
elseif(CUDA_GENERATION STREQUAL “Kepler”)
if(${CUDA_VERSION} VERSION_LESS “5.0”)
set(__cuda_arch_bin “3.0”)
else()
set(__cuda_arch_bin “3.0 3.5”)
endif()
参考博客:ubuntu16.04 在cuda9.0环境下编译安装opencv2.4.13.7
解决方法: 此问题与5.1问题相似,也需修改opencv-2.4.9/cmake/OpenCVDetectCUDA.cmake 文件:
if(NOT DEFINED __cuda_arch_bin)
if(ANDROID)
set(__cuda_arch_bin “3.2”)
set(__cuda_arch_ptx “”)
else()
if(${CUDA_VERSION} VERSION_LESS “5.0”)
set(__cuda_arch_bin “1.1 1.2 1.3 2.0 2.1(2.0) 3.0”)
else()
set(__cuda_arch_bin “1.1 1.2 1.3 2.0 2.1 3.0 3.5”)
endif()
set(__cuda_arch_ptx “3.0”)
endif()
endif()
改为:
if(NOT DEFINED __cuda_arch_bin)
if(ANDROID)
set(__cuda_arch_bin “3.2”)
set(__cuda_arch_ptx “”)
else()
if(${CUDA_VERSION} VERSION_LESS “5.0”)
set(__cuda_arch_bin “1.1 1.2 1.3 2.0 2.1(2.0) 3.0”)
else()
set(__cuda_arch_bin “3.0 3.5”)
endif()
set(__cuda_arch_ptx “3.0”)
endif()
endif()
如果出现下图问题:
这是由于在CUDA 9中NVIDIA把 libnppi.so换成libnppc.so libnppial.so libnppicc.so libnppicom.so libnppidei.so libnppif.so libnppig.so libnppim.so libnppist.so libnppisu.so libnppitc.so libnpps.so .
解决方法: 修改opencv-2.4.9/cmake/FindCUDA.cmake 文件中的几处内容即可:
第一处:
unset(CUDA_nppi_LIBRARY CACHE)
修改为:
unset(CUDA_nppial_LIBRARY CACHE)
unset(CUDA_nppicc_LIBRARY CACHE)
unset(CUDA_nppicom_LIBRARY CACHE)
unset(CUDA_nppidei_LIBRARY CACHE)
unset(CUDA_nppif_LIBRARY CACHE)
unset(CUDA_nppig_LIBRARY CACHE)
unset(CUDA_nppim_LIBRARY CACHE)
unset(CUDA_nppist_LIBRARY CACHE)
unset(CUDA_nppisu_LIBRARY CACHE)
unset(CUDA_nppitc_LIBRARY CACHE)
第二处:
find_cuda_helper_libs(nppi)
改为:
find_cuda_helper_libs(nppial)
find_cuda_helper_libs(nppicc)
find_cuda_helper_libs(nppicom)
find_cuda_helper_libs(nppidei)
find_cuda_helper_libs(nppif)
find_cuda_helper_libs(nppig)
find_cuda_helper_libs(nppim)
find_cuda_helper_libs(nppist)
find_cuda_helper_libs(nppisu)
find_cuda_helper_libs(nppitc)
紧接着第二处修改位置的下面就是第三处要修改地方:
set(CUDA_npp_LIBRARY "${CUDA_nppc_LIBRARY};${CUDA_nppi_LIBRARY};${CUDA_npps_LIBRARY}")
改为:
set(CUDA_npp_LIBRARY "${CUDA_nppc_LIBRARY};${CUDA_nppial_LIBRARY};${CUDA_nppicc_LIBRARY};${CUDA_nppicom_LIBRARY};${CUDA_nppidei_LIBRARY};${CUDA_nppif_LIBRARY};${CUDA_nppig_LIBRARY};${CUDA_nppim_LIBRARY};${CUDA_nppist_LIBRARY};${CUDA_nppisu_LIBRARY};${CUDA_nppitc_LIBRARY};${CUDA_npps_LIBRARY}")
参考博客:ubuntu16.04 在cuda9.0环境下编译安装opencv2.4.13.7
如果出现下图问题,则说明是NCVPixelOperations.hpp文件出现问题,我是在这里下载的,用下载好的文件将opencv-2.4.9/modules/gpu/src/nvidia/core文件夹下的NCVPixelOperations.hpp文件替换掉即可,亲测有效.
出现错误如下图所示:
解决方法: 在/opencv-2.4.9/modules/gpu/src文件夹下找到graphcuts.cpp文件,打开文件,将:
if !defined (HAVE_CUDA) || defined (CUDA_DISABLER)
修改为:
if !defined (HAVE_CUDA) || defined (CUDA_DISABLER) || (CUDART_VERSION >= 8000)
参考博客:caffe学习(三):caffe开发环境安装(Ubuntu)
解决方法: 修改opencv-3.4.3/cmake/OpenCVDetectCUDA.cmake 文件:
set(__cuda_arch_ptx "")
if(CUDA_GENERATION STREQUAL "Fermi")
set(__cuda_arch_bin "2.0")
elseif(CUDA_GENERATION STREQUAL "Kepler")
set(__cuda_arch_bin "3.0 3.5 3.7")
elseif(CUDA_GENERATION STREQUAL "Maxwell")
set(__cuda_arch_bin "5.0 5.2")
elseif(CUDA_GENERATION STREQUAL "Pascal")
set(__cuda_arch_bin "6.0 6.1")
elseif(CUDA_GENERATION STREQUAL "Volta")
set(__cuda_arch_bin "7.0")
elseif(CUDA_GENERATION STREQUAL "Auto")
修改为:
set(__cuda_arch_ptx "")
if(CUDA_GENERATION STREQUAL "Fermi")
set(__cuda_arch_bin "3.0")
elseif(CUDA_GENERATION STREQUAL "Kepler")
set(__cuda_arch_bin "3.0 3.5 3.7")
elseif(CUDA_GENERATION STREQUAL "Maxwell")
set(__cuda_arch_bin "5.0 5.2")
elseif(CUDA_GENERATION STREQUAL "Pascal")
set(__cuda_arch_bin "6.0 6.1")
elseif(CUDA_GENERATION STREQUAL "Volta")
set(__cuda_arch_bin "7.0")
elseif(CUDA_GENERATION STREQUAL "Auto")
**解决方法: ** 这里只需不编译example即可,将camke命令换为
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local/opencv3 -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib-3.4.3/modules/ -DCUDA_CUDA_LIBRARY=/usr/local/cuda/lib64/stubs/libcuda.so -D CMAKE_LIBRARY_PATH=/usr/local/cuda/lib64/stubs -D WITH_CUDA=ON -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=OFF -D WITH_QT=ON -D WITH_OPENGL=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D WITH_CUBLAS=1 -D CUDA_GENERATION=Fermi ..
问题描述如下:
Pangolin X11: Unable to retrieve framebuffer options
解决方法: 将源码目录Pangolin/src/display/device下的display_x11.cpp文件注释其中的两行代码即可,修该完这个文件后需要重新编译安装pangolin. 更改如下:
static int visual_attribs[] =
{
GLX_X_RENDERABLE , True,
GLX_DRAWABLE_TYPE , GLX_WINDOW_BIT,
GLX_RENDER_TYPE , GLX_RGBA_BIT,
GLX_X_VISUAL_TYPE , GLX_TRUE_COLOR,
GLX_RED_SIZE , 8,
GLX_GREEN_SIZE, 8,
GLX_BLUE_SIZE, 8,
GLX_ALPHA_SIZE, 8,
GLX_DEPTH_SIZE, 24,
GLX_STENCIL_SIZE, 8,
GLX_DOUBLEBUFFER , glx_doublebuffer ? True : False,
//GLX_SAMPLE_BUFFERS , glx_sample_buffers,
//GLX_SAMPLES , glx_sample_buffers > 0 ? glx_samples : 0,
None
};
参考博客:Pangolin X11: Unable to retrieve framebuffer options
以上就是我在安装Opencv GPU模块时遇到的所有问题,电脑环境配置不同可能还会遇到一些新的问题,所以并不保证以上解决方案能解决所有电脑安装时的问题. 而且可能后面真正跑工程的时候,还遇到一些关于opencv中cuda头文件找不到的情况,可能就要再cmake后面的加一些参数项重新编译opencv了,这块儿理解的不深,所以也就不说了. 希望我的填坑过程分享可以帮到大家,同时也感谢上面博主们的资料.