背景
为了降低cpu的使用率提升系统的接入能力,需要将编解码模块移至GPU处理,opencv默认的发行版中不支持GPU加速,所以需要重新编译opencv使其支持GPU硬件加速。
读者
本文的读者须具备一定的Linux使用经验,如常规软件安装等操作不在本文档中描述。
术语
cuda:统一计算设备架构(Compute Unified Device Architecture, CUDA),是由NVIDIA推出的通用并行计算架构。解决的是用更加廉价的设备资源,实现更高效的并行计算。
nvcc:NVIDIA编译器,运行于GPU的程序后缀为“.cu”,此类型文件使用nvcc编译。
nvidia-smi :NVIDIA System Management Interface program。
依赖组件
git:版本管理工具,用于获取程序源码;
g++:c++程序的编译器;
cmake:c++程序的编译管理工具;
ffmpeg:主要作用拉取rtsp视频流,如果不添加此组件,opencv只能从本机摄像机处取视频流处理,该工具源码可从github获取。
cuda运行时库:NVIDIA发布的用来使用GPU的底层依赖库,可从NVIDIA官网获取。
Video_Codec_SDK:NVIDIA提供的视频编、解码库,可从NVIDIA官网获取。
Python3:现有视频事件主要使用该语言,所以需要做对python3的绑定。
Opencv编译
opencv默认的源码程序中不支持硬件加速,其硬件加速在扩展包opencv_contrib中,因此编译前,需要从网络上下载opencv与opencv_contrib两个源码包,获取地址如下:
opencv:“https://gitee.com/opencv/opencv?_from=gitee_search”
opencv_contrib:“https://gitee.com/opencv/opencv_contrib”.
获取源码,执行如下命令
git clone https://gitee.com/opencv/opencv.git
git clone https://gitee.com/opencv/opencv_contrib.git
切换至4.7.0版本,现有视频事件平台使用4.5.3版本的opencv,该版本在硬件加速编译中存在bug,所以我们选用4.7.0版本
分别进入opencv与opencv_contrib文件夹中,执行如下命令
git checkout 4.7.0
git checkout -b v4.7.0
安装python3
有时候系统中默认的python为软连接,连接目标是python2,删除该软连接,创建新的软连接,连接至python3。
安装python3的pip,执行如下命令
apt-get install python3-pip
安装numpy,执行如下命令,【该组件安装,不要使用国内加速镜像】
pip install numpy
安装ffmpeg
参见支持硬件加速的ffmpeg编译_c++ ffmpeg 硬件加速-CSDN博客
安装cuda
wget https://developer.download.nvidia.com/compute/cuda/11.7.0/local_installers/cuda_11.7.0_515.43.04_linux.run
sudo sh cuda_11.7.0_515.43.04_linux.run
安装过程中取消第一个驱动选项,其余选项默认。
安装Video_Codec_SDK
NVIDIA官网下载Video_Codec_SDK,并解压。将解压出来的头文件拷贝至“/usr/include”下,将库文件拷贝在“/usr/lib”下。
Opencv编译
修改“opencv/cmake/OpenCVDetectCUDA.cmake”文件,在第66行添加“/usr/include”,修改前如下图:
修改后,如下图:
执行如下命令,生成Makefile文件
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/ffmpeg/lib/pkgconfig/:/usr/lib/x86_64-linux-gnu/pkgconfig/
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local/opencv4.7 \
-D CMAKE_BUILD_TYPE=Debug \
-D INSTALL_C_EXAMPLES=ON \
-D OPENCV_ENABLE_NONFREE=ON \
-D WITH_CUDA=ON \
-D WITH_FFMPEG=ON \
-D WITH_GTK_2_X=ON \
-D WITH_OPENGL=ON \
-D WITH_TBB=ON \
-D WITH_CUBLAS=1 \
-D CUDA_ARCH_BIN=8.6 \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_EXTRA_MODULES_PATH=/home/yangdong/opencv_contrib/modules \
-D CUDA_CUDA_LIBRARY=/usr/local/cuda/lib64/stubs/libcuda.so \
-D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda \
-D WITH_WEBP=OFF \
-D WITH_OPENCL=OFF \
-D ETHASHLCL=OFF \
-D ENABLE_CXX11=ON \
-D BUILD_opencv_python3=ON \
-D BUILD_opencv_python2=OFF \
-D PYTHON_DEFAULT_EXECUTABLE=$(python -c "import sys; print(sys.executable)") \
-D PYTHON3_EXECUTABLE=$(python -c "import sys; print(sys.executable)") \
-D PYTHON3_NUMPY_INCLUDE_DIRS=$(python -c "import numpy; print (numpy.get_include())") \
-D PYTHON3_PACKAGES_PATH=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") \
-D BUILD_EXAMPLES=OFF \
-D WITH_V4L=ON ..
上述cmake命令行关键参数介绍入下:
CMAKE_INSTALL_PREFIX:指定opencv安装路径;
WITH_CUDA=ON:打开cuda支持
WITH_FFMPEG=ON:打开ffmpeg支持
WITH_GTK_2_X=ON:打开gtk支持
WITH_OPENGL=ON:打开opengl支持【本次编译opengl未添加成功】
CUDA_ARCH_BIN=8.6:显卡算力值,该值需要从NVIDIA官网查询,本文档编译使用RTX3060,官网查询算力值为8.6
OPENCV_EXTRA_MODULES_PATH:opencv扩展包路劲,硬件加速代码主要在此包中
CUDA_TOOLKIT_ROOT_DIR:顾名思义,cuda toolkit路劲
BUILD_opencv_python3=ON:打开python3绑定
生成Makefile后,会生成如下提示信息,红框中的部分为关键部分,如果于下图不同,需要检查cmake命令中参数路劲是否准确。
需要保证ffmpeg为YES,NVIDIA CUDA 为YES,且包含NVCUVID NVCUVENC,Python3对应的条目值准确(条目值为实际安装的路径)
执行如下命令进行安装
make -j 16
make install
make -j 后的数字需要参考本机的核数填写,不能超过本机的核数,本文编译时使用32核机器,核数查询可以通过nproc命令查询。
安装完成后支持CUDA硬件加速的opencv编译安装成功。