支持硬件加速的opencv编译

背景

为了降低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编译.docx》

安装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”,修改前如下图:

支持硬件加速的opencv编译_第1张图片

修改后,如下图:

支持硬件加速的opencv编译_第2张图片

执行如下命令,生成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命令中参数路劲是否准确。

支持硬件加速的opencv编译_第3张图片

需要保证ffmpeg为YES,NVIDIA CUDA 为YES,且包含NVCUVID NVCUVENC,Python3对应的条目值准确(条目值为实际安装的路径)

执行如下命令进行安装

make -j 16

make install

make -j 后的数字需要参考本机的核数填写,不能超过本机的核数,本文编译时使用32核机器,核数查询可以通过nproc命令查询。

安装完成后支持CUDA硬件加速的opencv编译安装成功。

你可能感兴趣的:(opencv,计算机视觉,python)