最近在搞视频动作识别和时序定位,在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} )
完结#