Ubuntu16.04+CUDA9.0+Opencv3.4.10(带cuda编译)

最近在搞视频动作识别和时序定位,在TSN中作者提到用warp optical flow可以减少背景的运动带来的影响,更加专注前景目标的运动,为了加快处理的速度,所以决定用带cuda编译的opencv来处理原始始视频数据来提取dense_flow,不然凭我这四年前的飞行堡垒,简直怀疑人生,dense_flow可以看这里https://github.com/yjxiong/dense_flow/tree/opencv-3.1

言归正传,直接进入主题

环境

1、Ubuntu16.04
2、CUDA9.0
3、CUDNN7.6.5
4、OpenCV3.4.10

(第一次是用cuda10.1+opencv4.3不成功,不知道是不是版本问题,仅作参考)

下载OpenCV3.4.10

opencv3.4.10下载链接:https://github.com/opencv/opencv/releases
opencv_contrib-3.4.10下载链接:https://github.com/opencv/opencv_contrib/tags

unzip opencv-3.4.10.zip
unzip opencv_contrib-3.4.10.zip

解压得到两个文件夹,把opencv_contrib-3.4.10放到opencv-3.4.10中去

安装依赖的包

sudo apt-get install build-essentia
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

opencv编译

进入文件夹,创建build(用来保存cmake的结果)

cd opencv-3.4.10
mkdir build && cd build

先别急直接cmake编译,先看看大概率出错的地方,下面放上我用的编译参数:

cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local/opencv3410 \ #安装路径,因为我有多个版本的opencv,所以不直接安装在/usr/local,加以区分,看个人
-D WITH_CUDA=ON \     #带CUDA编译
-D WITH_TBB=ON \
-D ENABLE_FAST_MATH=1 \    
-D CUDA_FAST_MATH=1     #提高运算速度
-D WITH_CUBLAS=ON 
-D INSTALL_PYTHON_EXAMPLES=ON \
-D OPENCV_EXTRA_MODULES_PATH=/data/lyg_workspace/opencv3410/opencv/opencv_contrib-3.4.10/modules   #拓展模块路径,我这里是全路径
-D BUILD_EXAMPLES=OFF 
-D OPENCV_ENABLE_NONFREE=ON    #如果需要提取warp optical,这个参数必须带上,不需要的话自己决定
-D INSTALL_PYTHON_EXAMPLES=ON    
-D PYTHON_EXCUTABLE=/usr/bin/python  #我个人需要用python
-D CUDA_GENERATION=Kepler   #根据自己得CUDA和显卡架构确定
-D BUILD_TEST=OFF ..        #不编译测试脚本,不要漏了后面两点

错误1:
在这里插入图片描述
解决错误先得看哪里出错,这里说是opencv_contrib-3.4.10/modules/xfeatures2d/src/boostdesc.cpp出错,主要是没有boostdesc_bgm.i,解决办法,下载boostdesc_bgm.i
链接:https://pan.baidu.com/s/1wso7DzoQFzJhrMzOK78z_g
提取码:fa9b
下载解压后把这几个文件放到路径:opencv-3.4.10/opencv_contrib-3.4.10/modules/xfeatures2d/src ,OK!这个问题解决

错误2:
在这里插入图片描述

解决方法一:
根据fatal error前面的路径,找到…/modules/stitching这个文件夹,打开CmakeList.txt文件,在文件中加入

INCLUDE_DIRECTORIES("(前面部分是你的全路径)/opencv_contrib-3.4.10/modules/xfeatures2d/include")

解决方法二:
(网上很多都是方法一这种解决办法,然而我用了根本不行,下面是我自己的实际操作)
同样的,找到fatal error前面这个出错的matcher.hpp文件,错误不是说找不到cuda.hpp嘛,我怀疑是#include那里的问题,打开matchers.hpp,修改#include "opencv2/xfeatures2d/cuda.hpp"为:

#include "(你的全路径)/opencv-3.4.10/opencv_contrib-3.4.10/modules/xfeatures2d/include/opencv2/xfeatures2d/cuda.hpp"

保存,OK!!!我遇到的两个问题解决了,直接cmake编译,等待…

在这里插入图片描述
编译成功!!!!!!

make编译

nproc      #先查看你的计算机的最大线程
make -j16  #看你的最大线程决定
sudo make install      #sudo安装

在这里插入图片描述
安装成功!!!!

opencv配置

也可以参考https://blog.csdn.net/hjxu2016/article/details/82390434
环境配置添加库路径

sudo gedit /etc/ld.so.conf.d/opencv.conf 
#打开后可能是空文件,在文件内容最后添加
/usr/local/opencv3410/lib

更新系统库

sudo ldconfig

修改~/.bashrc

sudo gedit ~/.bashrc
export PKG_CONFIG_PATH=/usr/local/opencv3410/lib/pkgconfig
export LD_LIBRARY_PATH=/usr/local/opencv3410/lib/
#我就直接简单粗暴的写全路径,注意是你的安装路径

更新~/.bashrc使其生效

source ~/.bashrc

查看版本:

pkg-config --modversion opencv

输出3.4.10就证明可以了

CLion调用方法

在CmakeList.txt增加

find_package(OpenCV REQUIRED)
add_executable(demo main.cpp)
target_link_libraries( demo ${OpenCV_LIBS} )

完结#


版权声明:本文为weixin_38257276原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。