前言:opencv4.2版本19年12月发布,其最重要的改变是增加了对DNN模块Cuda加速,使得深度学习调用DNN接口可以获取GPU的加速。但opencv4.2版本中DNN的加速模块放在了opencv_ contrib中,因此要使用opencv4.2进行cuda加速,就必须联合编译opencv_contrib,联合编译opencv_contrib与往期版本步骤类似,但opencv4.2在联合编译的过程出现了许多坑,本文记录了opencv4.2联合编译contrib过程中遇到的问题,并给出了解决方案,以防自己再次踩坑,也给需要的人提供一些参考。
目录
编译安装环境:ubuntu16.04+g++5.4.0+cmake3.6.0
1.编译cmake
之前写过一篇文章《cmake安装》,可以参考下。
除了cmake之外我不知道还有没有其他的编译方式,但官方源码既然给出了cmakelist.txt文件,肯定也是推荐用cmake方式编译的。
2. 安装依赖库
在正式开始安装前,先安装opencv相关的一些依赖库,这些依赖库不安装,可能导致安装不成功,建议先下载安装:
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
3. 配置编译选项
opencv4.2版的opencv-dnn加速是在opencv_contirb实现的,因此必须联合编译opencv_contirb,
(1)下载opencv4.2与opencv4.2版的opencv_contrib,分别解压,将opencv_contrib放在opencv解压后的文件夹内,如下图所示:
(2)配置编译选项
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=RELEASE \
-DCMAKE_INSTALL_PREFIX=/usr/local \
-DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib4.2.0/modules .. \
-DWITH_CUDA=1 \
-DWITH_CUDNN=ON \
-DOPENCV_DNN_CUDA=ON \
-DENABLE_FAST_MATH=ON \
-DCUDA_FAST_MATH=ON \
-DWITH_CUBLAS=1 \
-DOPENCV_GENERATE_PKGCONFIG=1 \
-DCUDA_GENERATION=Pascal ..
这一步非常重要!配置错了,编译结果可能就不是你想要的,后面的编译过程很长,所以这一步非常重要。
配置注意点:
- 每个换行符后面不能有空格;
- GPU显卡类型要正确,我用的是TX2平台,是pascal架构的GPU;
- 关于EXAMPLE选项的编译,很多文章都有编译,我之前编译过一次,出错了,是"samples\gpu\surf_keypoint_matcher.cpp"文件编译出错了,错误是找不到cv::cuda::SURF_CUDA(),这还不是contirb中的代码,这让我很纳闷。不知道有没有同行遇到过。
4. 执行编译,安装
配置完成后,执行编译命令编译命令:"sudo make -j1",我比较推荐单线程,虽慢但稳。
在编译过程会出现一些问题,问题都出现在opencv_contirb中,来看第一个问题,见下图:
缺少boostdesc_bgm.i这个文件,下面链接百度云盘下载这个文件后,放入到"..\modules\xfeatures2d\src"目录下,继续编译。(注:下载的所有文件都需要拷贝,以下文件都需要。)
百度云资料:百度网盘 请输入提取码,密码:z7dp
boostdesc_bgm.i
boostdesc_bgm_bi.i
boostdesc_bgm_hd.i
boostdesc_lbgm.i
boostdesc_binboost_064.i
boostdesc_binboost_128.i
boostdesc_binboost_256.i
vgg_generated_120.i
vgg_generated_64.i
vgg_generated_80.i
vgg_generated_48.i
继续编译不需要重开终端,在已开终端里直接"sudo make -j1"即可,编译过程会跳过刚才编译完成的部分。
第二个问题如下图,在目录"..\modules\xfeatures2d\test"下找不到某个hpp文件
这个hpp文件在"..\modules\features2d\test"文件下有,直接拷贝到"..\modules\xfeatures2d\test"目录下,然后修改"modules\xfeatures2d\test\test_features2d.cpp"文件中第51行,修改为如下图形式:
继续编译,然后接下来还会遇到一个缺少头文件的问题,同样在"..\modules\features2d\test"目录下能找到该头文件,将头文件复制到"..\modules\xfeatures2d\test"目录下,再修改对应的文件,再继续编译,接下来就没有任何问题了。
等待编译结束后,执行命令安装库文件:
sudo make install
5. opencv4.2使用中的问题
1. c++11标准的支持
opencv4.2在使用时候需要c++11标准的支持,一般linux系统上的g++,gcc版本都不是默认c++11标准的,默认为c++98标准的,如果你的程序在编译过程中出现如下错误,则说明你的编译器默认不是c++11标准。
opencv4.x+ requires enabled c++11 support
因此要使用opencv4.2版本需要显式的开启c++11标准,在编译源码时候必须加上”-std=c++11”。
举例makefile文件:
修改前:
修改后(红色框):
2. cuda支持
如果你的应用程序运行如出现下图的提示信息,则说明你的opencv中并没有把cuda编译进去,可能需要你重新编译了,建议排查下编译的配置项。
各位如需opencv4.2修改过的opencv_contrib欢迎下载我的资源《修改好的opencv4.2及opencv_contrib》