目录
1.编译cmake
2.配置
3. 编译
4. opencv4.2使用中的问题
1. c++11标准的支持
2. cuda支持
前言:opencv4.2版本19年12月发布,其最重要的改变是增加了对DNN模块cuda加速,使得深度学习调用DNN接口可以获取GPU的加速。但opencv4.2版本中DNN的加速模块放在了opencv_contrib中,因此要使用opencv4.2进行cuda加速,就必须联合编译opencv_contrib,联合编译opencv_contrib与往期版本步骤类似,由于我编译的是release版本亦或是最新版源码的问题,联合编译的过程出现了许多坑,本文记录了编译过程中的问题,以防自己再次踩坑,也给需要的人提供一些参考。
我的环境:ubuntu16.04+g++5.4.0+cmake3.6.0
之前写过一篇文章《cmake安装》,可以参考下。
除了cmake之外我不知道还有没有其他的编译方式,但官方源码既然给出了cmakelist.txt文件,肯定也是推荐用cmake方式编译的。
(在编译opencv4.2时,如果不进行联合编译opencv_contirb,在进行配置环节时就会报错,错误时找不到"\modules\cudev"文件,所以我猜测可能时必须进行联合编译的。)
(1)下载opencv与opencv_contrib,分别解压,将opencv_contrib放置于opencv解压后的文件夹内,如下图所示:
(2)新建build文件夹,用于存放编译过程中间文间,进入build文件夹内,打开终端,输入配置命令:
cmake -DCMAKE_BUILD_TYPE=RELEASE \
-DCMAKE_INSTALL_PREFIX=/usr/local \
-DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib4.2.0/modules .. \
-DWITH_CUDA=1 \
-DENABLE_FAST_MATH=1 \
-DCUDA_FAST_MATH=1 \
-DWITH_CUBLAS=1 \
-DCUDA_GENERATION=Pascal ..
再次,千万千万提醒一句:这一步非常非常重要!配置错了,编译处理的结果可能就不是你想要的,后面的编译过程很长,所以这一步非常重要。
配置注意点:
配置完成后,执行编译命令编译命令:"sudo make -j1",我比较推荐单线程,虽慢但稳。
在编译过程会出现一些问题,问题都出现在opencv_contirb中,来看第一个问题,见下图:
缺少boostdesc_bgm.i这个文件,下面链接百度云盘下载这个文件后,放入到"..\modules\xfeatures2d\src"目录下,继续编译。(注:下载的所有文件都需要拷贝,以下文件都需要。)
百度云资料:https://pan.baidu.com/s/1SmRMg_aydPYOJ1jKNjGZPw,密码: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"目录下,再修改对应的文件,再继续编译,接下来就没有任何问题了。
等待编译结束后,安装.so库,"sudo make install"。
4.2版本的opencv在使用时候需要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文件:
修改前:
修改后(红色框):
程序运行如出现下图的提示:
则说明你的CUDA并未开启,很可能是你的opencv并没有安装CUDA。
如有不足之处,希望各位同行指正。