支持硬件加速的opencv编译

news2025/2/22 15:27:27

背景

为了降低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”,修改前如下图:

修改后,如下图:

执行如下命令,生成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编译安装成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/669028.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

扫雷小游戏【C语言】

目录 前言 一、基本实现逻辑 二、实现步骤 1. 我们希望在进入游戏时有一个菜单让我们选择 2. 我们希望可以重复的玩(一把玩完了还可以接着玩) 3. 采用多文件形式编程 4.要扫雷先得有棋盘(创建棋盘R*N) 5.初始化棋盘 6.打…

0014-TIPS-pawnyable : Double-Fetch pt_regs

原文 Linux Kernel PWN | 040302 Pawnyable之双取 Double Fetch 题目下载 漏洞代码 #include <linux/module.h> #include <linux/kernel.h> #include <linux/cdev.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/sl…

chatgpt赋能python:Python搜索本地文件指南

Python搜索本地文件指南 在进行开发或者日常使用中&#xff0c;需要对本地的文件进行搜索操作是常见的需求。如果你正在学习Python编程&#xff0c;接下来的内容会为你提供一些如何使用Python进行本地文件搜索的指南。 搜索文件 在Python中搜索本地文件可以使用os模块。该模…

杂记 | 使用FRP搭建内网穿透服务

文章目录 01 需求场景02 项目地址03 文件介绍04 编写配置文件4.1 编写frps.ini4.2 编写frpc.ini 05 测试 01 需求场景 1、有一台云服务器&#xff0c;Linux&#xff08;CentOS7&#xff09;系统 2、云服务器有公网ip&#xff0c;公网可以访问 3、本地电脑是家用笔记本&#xf…

AN10833-MIFARE type identification procedure.pdf

1.2范围 本文档描述了如何区分MIFARE接口卡IC系列的成员。ISO/IEC 14443-3描述了类型A的初始化和防冲突程序&#xff0c;该程序为所有MIFARE卡提供卡类型信息。 MIFARE卡与ISO/IEC 14443-3兼容。因此&#xff0c;已经存在的应用可以很容易地扩展到分别使用较新的MIFARE芯片和所…

017、数据库管理之监控

监控工具 TiDB数据库的监控体系TiDB Dashboard数据库监控系统数据流转监控系统访问地址 报警系统报警级别指标系统常用监控指标Service Port Status 常用监控指标PD的常用监控指标TiDB-Server的常用监控指标TiKV 的常用监控指标Dashboard的常用指标 实验&#xff1a; 通过监控工…

Flink 学习六 Flink 窗口计算API

Flink 学习六 Flink 窗口计算API 1.窗口 (window)概念和分类 窗口 window 是处理无限流的核心就是把无界的数据流,按照一定的规则划分成一段一段的有界的数据流(桶),然后再这个有界的数据流里面去做计算; 2.分类体系 2.1 滚动窗口 相邻窗口之间是没有数据重合 window 大小…

Geocomputation (2)Attribute data operations

Geocomputation &#xff08;2&#xff09;Attribute data operations 属性数据操作 来源&#xff1a;https://github.com/geocompx/geocompy 1.准备 #| echo: false import pandas as pd import matplotlib.pyplot as plt pd.options.display.max_rows 6 pd.options.disp…

chatgpt赋能python:Python搜索函数:快速、高效的搜索利器

Python 搜索函数&#xff1a;快速、高效的搜索利器 如果你经常使用 Python 编程语言&#xff0c;那么你应该知道搜索数据集的重要性。用于搜索的函数在 Python 中是关键而常用的工具。Python 搜索函数是一种高效、快速的搜索利器&#xff0c;它可以让你轻松地找到你需要的数据…

C生万物 | 聊聊枚举与联合体的用法

文章目录 枚举1、枚举类型的定义2、枚举的使用3、枚举的优点 联合体1、联合体类型的定义2、联合体的特点3、联合体大小的计算一道经典面试题&#xff1a;判断当前计算机的大小端存储 总结与提炼 本文&#xff0c;我们就来谈谈C语言中的枚举和联合体&#xff0c;因为这两块知识点…

6月21日第壹简报,星期三,农历五月初四

6月21日第壹简报&#xff0c;星期三&#xff0c;农历五月初四坚持阅读&#xff0c;静待花开1. 中国LPR“对称降息”10个基点&#xff0c;房贷迎今年首次“降息”。2. 孟加拉国正式申请加入金砖国家&#xff0c;中方&#xff1a;欢迎更多伙伴早日加入金砖大家庭。3. 历时近2年波…

7、DuiLib动态创建控件

文章目录 1、动态创建控件2、纯代码方式动态创建控件3、基于构建好的 XML 动态创建控件&#xff08;CDialogBuilder&#xff09; 1、动态创建控件 在实际业务场景中&#xff0c;并不是所有界面元素都可以通过 XML 预先定义好的&#xff0c;有时候我们需要根据数据库或者服务器…

【计算机组成原理】主存储器

目录 一、存储体系基本概念 二、主存储器的基本组成 三、SRAM和DRAM 四、只读存储器ROM 五、主存储器与CPU的连接 六、双端口RAM和多模块存储器 一、存储体系基本概念 一个二进制位&#xff08;bit&#xff09;是构成存储器的最小单位&#xff1b;字节&#xff08;8bit&…

总结uwsgi的安装、配置与设置开机自启

一、uwsgi的安装与测试 1、uwsgi安装 pip install uwsgi# 查看uwsgi版本号 uwsgi –version 如果服务器安装anconda&#xff0c;有可能安装不上去&#xff0c;建议使用以下命令&#xff1a; conda install -c conda-forge uwsgi 2、测试uwsgi 创建test.py文件,并写下以下…

C++基础(2)——函数高级和函数对象

前言 本文主要介绍了C中函数高级相关的内容 3.1&#xff1a;函数默认参数 在函数定义的时候可以给形参赋初值&#xff0c;如果函数在调用的时候有传入参数&#xff0c;就使用传入的参数&#xff0c;如果没有就用默认的。 注意事项 1&#xff1a;如果某个参数有了默认值&…

Scilab安装与入门

说明&#xff1a;Scilab主要是用于信号处理&#xff0c;我本次用它来进行滤波仿真 地址&#xff1a; Scilab 2023.1.0 | Scilab https://www.scilab.org/download/scilab-2023.1.0 下载好了&#xff0c;进行安装看看 下一步&#xff0c;接受许可协议 选择安装路径到D盘下了…

chatgpt赋能python:Python数值互换:让你的编程更加高效

Python数值互换&#xff1a;让你的编程更加高效 Python是一种高级编程语言&#xff0c;其灵活性和易于学习的特点使其在科学计算、数据分析和人工智能等领域变得非常流行。作为Python的用户&#xff0c;很多时候你可能需要将数值类型之间进行转换&#xff0c;这样可以提高你的…

第6章 面向对象

第6章 面向对象 6.1. Scala包 ​ 包的命名 ​ 包的导入 Scala中基本的import导入语法和Java完全一致 import java.util.List import java.util._ // Scala中使用下划线代替Java中的星号Java中import导入的语法比较单一&#xff0c;Scala对此进行扩展&#xff0c;Scala中的im…

Cadence Allegro PCB设计88问解析(二十八) 之 Allegro中使用Anti Etch分割平面

一个学习信号完整性仿真的layout工程师 最近看到关于Anti Etch的设置&#xff0c;因为本人之前在layout设计是使用过这个命令。后来去到别的公司就不用了&#xff0c;从网上看到说这个命令是用来负片设计的。在这里在说下正片和负片的概念&#xff1a; 正片&#xff1a;是指在a…

Git团队代码规范

Git团队代码规范 1. 分支的定义2. 约束2.1 远程命名2.2 拉取代码2.3 新建Issues2.3 代码规范2.4 MR提交 本文章讲解Git代码管理中团队应该遵守的一些规则&#xff0c;让大家可以愉快的一起开发工作。 本篇文章需要结合Git代码提交规范-实践篇 一起食用哟~ 上一节我们已经讲了如…