安装opencv支持cuda加速 Ubuntu18.04

软件版本信息

  • Ubuntu18.04 LST
  • CUDA Version: 11.4
  • Nvidia GPU Driver Version: 470.57.02
  • cudDNN: 8.2.2.26
  • opencv: 4.5.3
  • opencv_contrib: 4.5.3
  • Video_Codec_SDK: 11.0.10

目标:编译 支持GPU硬件解码的opencv,支持C++和python3。
 

1.准备

1.0 安装nvidia gpu driver

sudo apt-get update -y
sudo apt-get upgrade -y
ubuntu-drivers devices
sudo apt-get install nvidia-driver-470
重启 reboot
测试 nvidia-smi 

1.1 下载OpenCV源代码

https://github.com/opencv/opencv/releases

1.2 下载OpenCV-contrib源代码

https://github.com/opencv/opencv_contrib/releases

 OpenCV版本与OpenCV-contrib版本一致,4.5.3。

1.3 安装cuda11.4

参考 cuda 11.4安装 in Ubuntu18.04

1.4 安装cuDNN

进入网页

https://developer.nvidia.com/rdp/cudnn-download

选择v8.2.2

Download cuDNN v8.2.2 (July 6th, 2021), for CUDA 11.4

下载

cuDNN Runtime Library for Ubuntu18.04 x86_64 (Deb)
cuDNN Developer Library for Ubuntu18.04 x86_64 (Deb)
cuDNN Code Samples and User Guide for Ubuntu18.04 x86_64 (Deb)

下载完成后,按以下顺序分别安装三个安装包(一定要按顺序安装)

sudo dpkg -i libcudnn8_8.2.2.26-1+cuda11.4_amd64.deb
sudo dpkg -i libcudnn8-dev_8.2.2.26-1+cuda11.4_amd64.deb
sudo dpkg -i libcudnn8-samples_8.2.2.26-1+cuda11.4_amd64.deb

1.5 安装必要的依赖包

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install build-essential cmake cmake-gui unzip pkg-config
sudo apt-get install libjpeg-dev libpng-dev libtiff-dev
sudo apt-get install libv4l-dev libxvidcore-dev libx264-dev
sudo apt-get install libgtk-3-dev
sudo apt-get install libatlas-base-dev gfortran
sudo apt install python3-pip python3-dev python3-numpy

1.6 安装ffmpeg

Run the following command:

sudo apt install libavutil-dev libavcodec-dev libavformat-dev libavdevice-dev libavfilter-dev libavresample-dev libswscale-dev libswresample-dev libpostproc-dev ffmpeg

1.7 安装GStreamer

Run the following command:

apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio

1.8 复制 Video_Codec_SDK_11.0.10 中Nvcuvid头文件

下载

NVIDIA VIDEO CODEC SDK - Get Started | NVIDIA Developer

复制nvcuid/cuviddec头文件

sudo cp ./Video_Codec_SDK_11.0.10/Interface/nvcuvid.h /usr/local/cuda/include
sudo cp ./Video_Codec_SDK_11.0.10/Interface/cuviddec.h /usr/local/cuda/include

2.cmake

创建build目录进入

cd opencv-4.5.3
mkdir build
cd build/

执行cmake,或者用cmake-gui

cmake  \
-D CMAKE_BUILD_TYPE=RELEASE  \
-D CMAKE_INSTALL_PREFIX=/usr/local/  \
-D OPENCV_EXTRA_MODULES_PATH=xxx/opencv/opencv_contrib-4.5.3/modules  \
-D OPENCV_GENERATE_PKGCONFIG=ON  \
-D OPENCV_ENABLE_NONFREE=ON  \
-D CUDA_CUDA_LIBRARY=/usr/lib/x86_64-linux-gnu/libcuda.so  \
-D CUDA_ARCH_BIN='5.0 5.2 6.1'  \
-D CUDA_FAST_MATH=1  \
-D WITH_CUDA=ON  \
-D WITH_TBB=ON  \
-D WITH_V4L=ON  \
-D WITH_OPENGL=ON  \
-D WITH_CUBLAS=1  \
-D WITH_NVCUVID=ON  \
-D WITH_GSTREAMER=ON  \
-D WITH_FFMPEG=ON  \
-D WITH_GTK=ON  \
-D BUILD_NEW_PYTHON_SUPPORT=ON  \
-D BUILD_opencv_python2=OFF  \
-D BUILD_NEW_PYTHON_SUPPORT=ON  \
-D BUILD_PYTHON_SUPPORT=ON  \
-D BUILD_OPENCV_PYTHON3=ON  \
-D BUILD_EXAMPLES=OFF  \
-D BUILD_opencv_cudacodec=ON  \
-D PYTHON_EXECUTABLE=/usr/bin/python3  \
-D PYTHON_DEFAULT_EXECUTABLE=/usr/bin/python3  \
-D PYTHON_INCLUDE_DIR=/usr/include/python3.6m  \
-D PYTHON_LIBRARY=/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu/libpython3.6m.so  \
-D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/lib/python3/dist-packages/numpy/core/include  \
-D INSTALL_C_EXAMPLES=OFF  \
-D INSTALL_PYTHON_EXAMPLES=OFF  \
-D ENABLE_FAST_MATH=1  \
..

OPENCV_EXTRA_MODULES_PATH 根据自己的电脑 opencv_contrib-4.5.3/modules 的地址

CUDA_ARCH_BIN 根据自己的显卡型号找到对于算力,相见下面地址

CUDA GPU | NVIDIA Developer

3.make

make

4.install

sudo make install

5.环境配置

5.1 动态库配置

sudo echo "/usr/local/lib" >> /etc/ld.so.conf.d/opencv4.conf
###  使配置生效
sudo ldconfig

 5.2 配置OpenCV的PKG-CONFIG环境

###  打开文件

sudo vim /etc/profile.d/pkgconfig.sh

###  在文件中添加如下内容

export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH

###  使配置生效

source /etc/profile

5.3 Python-OpenCV环境

在安装目录:/usr/local/lib/python3.6/dist-packages/cv2/python-3.6/ 中可以找到文件cv2.cpython-36m-x86_64-linux-gnu.so,即为编译好的python3的opencv库。根据安装位置的不同和Python版本的不同文件名可能略有差异。将其链接到.../python/site-packages中,即可在Python解释器中使用Opencv。

###  系统自带Python
sudo ln -s /usr/local/lib/python3.6/dist-packages/cv2/python-3.6/cv2.cpython-36m-x86_64-linux-gnu.so /usr/lib/python3/dist-packages/cv2.so


###  如果是自己安装的需要根据自己的安装位置
sudo ln -s /usr/local/lib/python3.6/dist-packages/cv2/python-3.6/cv2.cpython-36m-x86_64-linux-gnu.so <path_to_python>/lib/python3.7/dist-packages/cv2.so

6. 问题分析

6.1 cv::Exception 'throw_no_cuda'

terminate called after throwing an instance of 'cv::Exception'
  what():  OpenCV(4.5.3) /xxx/opencv-4.5.3/modules/core/include/opencv2/core/private.cuda.hpp:112: error: (-213:The function/feature is not implemented) The called functionality is disabled for current build or platform in function 'throw_no_cuda'

###  build opencv with WITH_NVCUVID = ON, only if find nvcuvid.h opencv build with Nvcuvid

sudo cp ./Video_Codec_SDK_11.0.10/Interface/nvcuvid.h /usr/local/cuda/include
sudo cp ./Video_Codec_SDK_11.0.10/Interface/cuviddec.h /usr/local/cuda/include

6.2 cmake cannot down IPPCV/wechat_qrcode/xfeatures2d

### cmake disable downloads

-D BUILD_opencv_wechat_qrcode=OFF  \
-D BUILD_opencv_xfeatures2d=OFF  \
-D BUILD_IPP_IW=OFF  \
-D WITH_IPP=OFF  \
-D BUILD_opencv_face=OFF  \

6.3 编译出错:python/src2/cv2.cpp:68:94: error: ‘to’ is not a member of ‘PyOpenCV_Converter<cv::line_descriptor::KeyLine, void>’

opencv-4.5.3/modules/python/src2/cv2.cpp:94:94: error: 'to' is not a member of 'PyOpenCV_Converter<cv::GCompileArg, void>'
 bool pyopencv_to(PyObject* obj, T& p, const ArgInfo& info) { return PyOpenCV_Converter<T>::to(obj, p, info); }

### 解决方式

-D BUILD_opencv_python2=OFF -D BUILD_opencv_python3=OFF 

6.4 Can't initialize GTK backend in function 'cvInitSystem'

window_gtk.cpp:635: error: (-2:Unspecified error) Can't initialize GTK backend in function 'cvInitSystem'

6.5 no CUDA-capable device is detected

error: (-217:Gpu API call) no CUDA-capable device is detected in function 'allocate'

参考资料:

1. 官网

OpenCV: Building OpenCV for Tegra with CUDA

2. opencv git

https://github.com/opencv/opencv/issues/17649

3. cudacodec docker

https://github.com/bml1g12/cudacodec_docker_opencv/blob/master/Dockerfile

GitHub - bml1g12/cudacodec_docker_opencv: attempt to get opencv with cudacodec working

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值