目的:Linux下源码编译带cuda的opencv-3.x.x
环境:
系统: Centos 7.5 x64
环境: Gefore rtx2080
Cuda 10.0
cmake 3.6.2
gcc g++ 4.8.5
opencv:3.4.0 3.3.0
问题分析:
开发过程中会经常需要使用opencv环境问题,由于项目使用的opecv with cuda版本(opencv3.4.0和3.3.0),所以以这两个版本为例编译,其他版本类似。
如果主机环境还没有安装Nvidia驱动和CUDA,则可以参考这个链接(https://blog.csdn.net/Alger_magic/article/details/111355340),也可以自行搜索查找安装方式安装。
解决步骤:
1. opencv源码下载
1.1 源码下载
下载链接(https://opencv.org/releases/)
补充说明:截至目前opencv最新版本为4.5.0/3.4.12,可在页面底部翻页寻找所需要的版本,然后选择source下载即可。
1.2 copy并解压
把源码copy到指定主机上的自定义路径,解压,准备编译。
2. 编译opencv3.4.0 with cuda
2.1 编译配置。
2.2.1 cd到源码目录,如下:
2.2.2 mkdir build_cuda,新建一个build_cuda文件夹。cd build_cuda进入该文件夹,然后执行cmake命令进行配置:
一般编译的话,只需要配置install路径、cuda选项打开、显卡架构选择等即可。
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local/opencv-3.4.0 -D WITH_TBB=ON -D WITH_V4L=ON -D WITH_QT=OFF -D WITH_OPENGL=ON -D WITH_CUDA=ON -D CUDA_GENERATION="Auto" -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D CUDA_NVCC_FLAGS="-D_FORCE_INLINES" ..
// ps: 显卡架构的话就可以直接填架构类型,或者直接填"Auto"
在实际使用过程中可能会需要用到:
一、 如果需要使用到opencv_contrib包,则需要单独下载opencv_contrib源码并配置使用,这样编译出来的opencv库就会包含contrib的一些功能包。
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local/opencv-3.4.0 -D WITH_TBB=ON -D WITH_V4L=ON -D WITH_QT=OFF -D WITH_OPENGL=ON -D WITH_CUDA=ON -D CUDA_GENERATION="Auto" -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D CUDA_NVCC_FLAGS="-D_FORCE_INLINES" -D WITH_CUBLAS=1 -D OPENCV_EXTRA_MODULES_PATH=/opencv源码目录/opencv_contrib-3.3.0/modules -D BUILD_opencv_hdf=ON ..
下载opencv_contrib对应版本,然后配置即可
https://github.com/opencv/opencv_contrib/releases
二、有时候编译的opencv里面会使用到hdf5,也需要单独下载hdf5并编译安装后配置到opencv里。
hdf5下载链接:https://support.hdfgroup.org/ftp/HDF5/prev-releases/,下载对应版本即可,下载慢的可以从文末链接获取(需要资源分为0)
hdf5安装指令:
tar zxvf hdf-1.8.21.tar.gz
cd hdf-1.8.21
./configure --prefix=/usr/local/hdf5-1.8.21
make
sudo make install
然后再进行配置opencv, 也可以简单的将hdf5 加入系统环境变量即可。
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local/opencv-3.4.0 -D WITH_TBB=ON -D WITH_V4L=ON -D WITH_QT=OFF -D WITH_OPENGL=ON -D WITH_CUDA=ON -D CUDA_GENERATION="Auto" -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D CUDA_NVCC_FLAGS="-D_FORCE_INLINES" -D WITH_CUBLAS=1 -D OPENCV_EXTRA_MODULES_PATH=/opencv源码目录/opencv_contrib-3.3.0/modules -D BUILD_opencv_hdf=ON -D HDF5_INCLUDE_DIRS=/usr/local/hdf5-1.8.21/inlcude -D HDF5_C_INCLUDE_DIR=/usr/local/hdf5-1.8.21/inlcude -D HDF5_hdf5_cpp_LIBRARY_RELEASE=/usr/local/hdf5-1.8.21/lib ..
三、如果想要编译opencv_world.so,则只需要再编译选项的最后加上-D BUILD_opencv_world=ON 即可。
FAQ:
- 编译过程中可能由于缺少某些依赖库或者内容,那么只需要根据错误提示来进行安装缺少的对应内容即可。
- 查看当前显卡详情及支持的算力。
在cuda的安装目录下(本机例usr/local/cuda-10.0/extras/demo_suite/), 执行deviceQuery, 来查看
/usr/local/cuda-10.0/extras/demo_suite/deviceQuery
- 编译过程中提示代码文件中有额外的乱字符,如图类似这种
解决办法:copy部分字符,然后在整个目录中进行搜索
,原因因该是某个cmake文件中额外输入了或者错误添加了错误字符,导致在cmake …的时候将代码文件给污染了。去除这些无用字符,重新cmake …即可。
- 编译过程中提示如下错误
问题原因:cuda9.0+不支持2.0架构
解决方案:待完善
- 使用cuda10.0+时提示找不到#include <dynlink_nvcuvid.h>,解决办法:
在源码中搜索出所有的if CUDA_VERSION >= 9000,然后改为:#if CUDA_VERSION >= 9000 && CUDA_VERSION < 10000
- 提示类似如图错误
原因是在opencv_contrib文件夹中缺少了boostdesc_bgm_bi.i 等文件,需要下载补充进去。
以本机为例,补充文件放置的路径为:opencv_contrib-3.3.0/modules/xfeatures2d/src;文件下载地址为:https://my.oschina.net/mengyoufengyu/blog/3070868
也可以直接从文末上传资源包中获取(需要积分为0)
- 同上也会有错误提示缺少vgg_generated_64.i等文件,也是补充在同一个目录opencv_contrib-3.3.0/modules/xfeatures2d/src,下载地址同上,同时文末上传资源包中也有。
csdn上传资源:
hdf5-1.8.21
https://download.csdn.net/download/Alger_magic/14003424
hdf5-1.10.7
https://download.csdn.net/download/Alger_magic/14003407
vgg_genearted / boostdesc_binboost
https://download.csdn.net/download/Alger_magic/14003460