软件版本信息
- 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源代码
1.2 下载OpenCV-contrib源代码
OpenCV版本与OpenCV-contrib版本一致,4.5.3。
1.3 安装cuda11.4
1.4 安装cuDNN
进入网页
选择v8.2.2
下载
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头文件
下载
复制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 根据自己的显卡型号找到对于算力,相见下面地址
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 findnvcuvid.h
opencv build withNvcuvid
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