linux下opencv4.2编译cuda的那些坑

目录

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

1.编译cmake

之前写过一篇文章《cmake安装》,可以参考下。

除了cmake之外我不知道还有没有其他的编译方式,但官方源码既然给出了cmakelist.txt文件,肯定也是推荐用cmake方式编译的。

2.配置

(在编译opencv4.2时,如果不进行联合编译opencv_contirb,在进行配置环节时就会报错,错误时找不到"\modules\cudev"文件,所以我猜测可能时必须进行联合编译的。)

(1)下载opencv与opencv_contrib,分别解压,将opencv_contrib放置于opencv解压后的文件夹内,如下图所示:

linux下opencv4.2编译cuda的那些坑_第1张图片

(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 ..

再次,千万千万提醒一句:这一步非常非常重要!配置错了,编译处理的结果可能就不是你想要的,后面的编译过程很长,所以这一步非常重要。

配置注意点:

  • 每个换行符后面不能有空格;
  • GPU显卡类型要正确;
  • 关于EXAMPLE的编译,很多文章都有编译,我之前编译过一次,出错了,是"samples\gpu\surf_keypoint_matcher.cpp"文件编译出错了,错误是找不到cv::cuda::SURF_CUDA(),这还不是contirb中的代码,这让我很纳闷。不知道有没有同行遇到过,如有同样问题,希望不吝赐教。

3. 编译

配置完成后,执行编译命令编译命令:"sudo make -j1",我比较推荐单线程,虽慢但稳。

在编译过程会出现一些问题,问题都出现在opencv_contirb中,来看第一个问题,见下图:

linux下opencv4.2编译cuda的那些坑_第2张图片

缺少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行,修改为如下图形式:

linux下opencv4.2编译cuda的那些坑_第3张图片

继续编译,然后接下来还会遇到一个缺少头文件的问题,同样在"..\modules\features2d\test"目录下能找到该头文件,将头文件复制到"..\modules\xfeatures2d\test"目录下,再修改对应的文件,再继续编译,接下来就没有任何问题了。

等待编译结束后,安装.so库,"sudo make install"。

4. opencv4.2使用中的问题

1. c++11标准的支持

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文件:

修改前:

linux下opencv4.2编译cuda的那些坑_第4张图片

修改后(红色框):

linux下opencv4.2编译cuda的那些坑_第5张图片

2. cuda支持

程序运行如出现下图的提示:

则说明你的CUDA并未开启,很可能是你的opencv并没有安装CUDA。


如有不足之处,希望各位同行指正。

 

你可能感兴趣的:(OpenCV)