自编译支持CUDA硬解的OPENCV和FFMPEG

1 整体思路

查阅opencv的官方文档,可看到有个cudacodec扩展,用他可方便的进行编解码。唯一麻烦的是需要自行编译opencv。
同时,为了考虑后续方便,顺手编译了FFMPEG,并将其与OPENCV绑定。
在之前的博文“鲲鹏主机+昇腾Atlas 300I Pro+龙蜥8.6 全国产化主机使用NPU推理YoloV5环境安装全过程”中已经干过一次了,类似的来搞一把。

2 准备环境

2.1 安装CMake

同之前的博文,CMake官网下载后安装

./cmake-3.29.0-rc4-linux-aarch64.sh --skip-license --prefix=/usr

2.2 安装nv-codec-headers(可选)

如果不需要FFMPEG,可以无视这步。
注意他对CUDA版本和驱动版本的依赖。所以需要根据本机版本选择合适的分支。
官网传送门

以笔者本机为例,可见驱动版本为510.39.01,CUDA版本为11.6:

$ nvidia-smi 
Mon Apr 15 01:30:12 2024       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 510.39.01    Driver Version: 510.39.01    CUDA Version: 11.6     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla T4            On   | 00000000:01:00.0 Off |                    0 |
| N/A   54C    P0    28W /  70W |    303MiB / 15360MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A   1492699      C   /usr/local/bin/ollama             301MiB |
+-----------------------------------------------------------------------------+

那么选择11.1版本是合适的。同时Video Codec SDK的版本为11.1.5。

在这里插入图片描述
安装比较简单,常规的make && make install 即可。

2.3 安装Nvidia Codec SDK

官网传送门在此

注意他对CUDA版本和驱动版本的依赖,以及nv-codec-headers 对他版本的依赖。因此不能无脑下最新的,需要由此寻找合适的历史版本。
下载完的压缩包中的Read_Me.pdf中有详细的版本要求介绍,也可以根据nv-codec-headers里要求的版本型号进行处理。(应当是一致的)

在这里插入图片描述
解压后,将Interface目录下的头文件,拷贝到你的CUDA安装目录即可,默认路径为/usr/local/cuda/include。千万不要去理那些动态库,那个是配套他的测试DEMO编译用的,可以不用管。

2.4 签出opencv和opencv-contrib

统一使用最近的4.9.0的tag

export GIT_SSL_NO_VERIFY=true
git clone https://github.com/opencv/opencv.git
cd opencv
git checkout 4.9.0
cd ..
git clone https://github.com/opencv/opencv_contrib.git
git checkout 4.9.0
cd ..

3 编译安装

3.1 FFMPEG

可以直接用Video Codec SDK里面配套的FFMPEG 4.4,避免不必要的麻烦

cd Video_Codec_SDK_11.1.5/Samples/External/FFmpeg/src
unzip ffmpeg-4.4.zip
./configure --enable-shared --enable-pic --enable-cuda --enable-cuvid --enable-nvenc --enable-nvdec --enable-nonfree --enable-libnpp --extra-cflags=-I/usr/local/cuda/include/ --extra-ldflags=-L/usr/local/cuda/lib64/
make && make install

测试转码,如果没啥报错且文件可用,就表示OK了。

ffmpeg -c:v h264_cuvid -i old.mp4 -c:v h264_nvenc new.mp4

3.2 编译OPENCV

在编译之前,需要先查阅Nvidia官网获得你的cuda_arch_bin版本。以笔者本机为例。Tesla T4的数值为7.5
在这里插入图片描述

cd opencv
mkdir build
cd build
cmake -D WITH_FFMPEG=ON \
-D FFMPEG_INCLUDE_DIRS=/usr/local/include \
-D FFMPEG_LIBRARIES="/usr/local/lib/libavcodec.so;/usr/local/lib/libavformat.so;/usr/local/lib/libavutil.so;/usr/local/lib/libswscale.so;/usr/local/lib/libswresample.so" \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
-D WITH_CUDA=ON -D WITH_CUDACODEC=ON \
-D CUDA_ARCH_BIN=7.5 \
-D BUILD_opencv_python3=yes -D BUILD_opencv_python2=no \
-D PYTHON3_EXECUTABLE=/root/miniconda3/bin/python3.11 \
-D PYTHON3_INCLUDE_DIR=/root/miniconda3/include/python3.11/ \
-D PYTHON3_LIBRARY=/root/miniconda3/lib/libpython3.11.so \
-D PYTHON3_NUMPY_INCLUDE_DIRS=/root/miniconda3/lib/python3.11/site-packages/numpy/core/include/ -D PYTHON3_PACKAGES_PATH=/root/miniconda3/lib/python3.11/site-packages \
-D PYTHON3_DEFAULT_EXECUTABLE=/root/miniconda3/bin/python3.11 \
..
make 
make install

如果需要图形化交互,还需要准备一些系统库

yum install gtk2-devel 

4 代码示例

import cv2

if __name__ == '__main__':
	rtsp_url = 'rtsp://admin:123456@192.168.1.100/'
	decoder = cv2.cudacodec.createVideoReader(rtsp_url)
	#不设置的化默认是BGRA,为了方便后续处理,指定为BGR
	decoder.set(cv2.cudacodec.COLOR_FORMAT_BGR)
	count = 0
	while True:
		ret,gpu_frame = decoder.nextFrame()
		if ret :
			frame = gpu_frame.download()
			if count == 0 :
				cv2.imwrite('test_img.bmp', frame)
			frame_queue.append(np.array(frame[:, :, ::-1]))
			count += 1

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

帆软查询按钮,获取组件值。

【查询】按钮增加点击事件,通过_g().parameterEl.getWidgetByName(‘组件名’).getValue(); 获取组件值。 js脚本示例: var bm _g().parameterEl.getWidgetByName(bm).getValue(); if(!bm || bm.length 0 ) {alert ("没有选择部门,查询速度会很…

解决PyCharm安装第三方库时出现“Error updating package list: Connect timed out”问题

在使用PyCharm开发Python项目时,有时会遇到在安装第三方库时出现“Error updating package list: Connect timed out”的错误。这通常是由于网络连接不稳定或PyPI官方源访问速度较慢导致的。为解决此类问题,本文将介绍以下几种策略: 2. 设置P…

【练习】位运算思想

🎥 个人主页:Dikz12🔥个人专栏:算法(Java)📕格言:吾愚多不敏,而愿加学欢迎大家👍点赞✍评论⭐收藏 目录 1.判断字符串是否唯一 题目描述 讲解 代码实现 2.丢失的数字 题目描述…

重学Java 12 JavaBean

一、JavaBean的使用 1.标准javaBean JavaBean是Java语言编写类的一种标准规范,符合JavaBean的类,要求: ①类必须是具体的(非抽象 abstract)和公共的,public class 类名 ②并且具有无参数的构造方法&#x…

C#泛型,利用反射创建和普通创建泛型

泛型,利用反射创建和普通创建 反射 var input Activator.CreateInstance(typeof(Input<>).MakeGenericType(typeof(T))) as dynamic;typeof(T)这个位置可以塞入不同的类型 Activator.CreateInstance 反射动态创建实例&#xff1a; 这种方式使用 Activator.CreateIns…

Android Studio 之 Intent及其参数传递

一、Intent 显式Intent&#xff1a;通过组件名指定启动的目标组件,比如startActivity(new Intent(A.this,B.class)); 每次启动的组件只有一个~隐式Intent:不指定组件名,而指定Intent的Action,Data,或Category,当我们启动组件时, 会去匹配AndroidManifest.xml相关组件的Intent-…

《6G数据面架构研究》

目录 一、数据服务的定义二、6G数据服务驱动力及面临的挑战6G数据服务的业务驱动6G数据服务的技术驱动6G数据服务的网络内在驱动6G数据面面临的挑战 三、6G数据服务典型场景自动化网络运维用户体验提升通信感知数据服务 四、6G数据面架构研究数据面架构视图功能定义说明&#x…

在Windows上安装Go编译器并配置Golang开发环境

文章目录 1、安装Go语言编译程序1.1、下载GoLang编译器1.2、安装GoLang编译器 2、配置Golang IDE运行环境2.1、配置GO编译器2.1.1、GOROOT 概述2.1.2、GOROOT 作用2.1.2、配置 GOROOT 2.2、配置GO依赖管理2.2.1、Module管理依赖2.2.2、GOPATH 管理依赖 2.3、运行GO程序2.3.1、创…

CMake基础语法

目录 概述一、示例引入二、语法规则三、变量四、控制结构4.1 条件判断4.2 循环语句4.2.1 foreach循环4.2.2 while循环4.2.3 break、continue 五、函数六、文件操作七、环境配置7.1 设置交叉编译7.2 作用域7.3 属性 八、补充8.1 数学运算math 概述 首先我们都知道Makefile带来的…

堆放砖块-第12届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第47讲。 堆放砖块&#xf…

【C语言】指针篇-初识指针(1/5)

&#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&#xff1a; C笔记 &#x1f308;喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 **内存和地址(知识铺垫(了解即可))**如何理解编址**指针变量*…

海外短剧系统开发:引领全球短剧新潮流,打造跨文化娱乐新体验

随着全球化和互联网的快速发展&#xff0c;跨文化娱乐已经成为人们日常生活中不可或缺的一部分。海外短剧作为一种新颖、便捷的娱乐形式&#xff0c;正逐渐受到越来越多观众的喜爱。为了满足广大用户的需求&#xff0c;我们荣幸地推出全新的海外短剧系统开发方案&#xff0c;旨…

YOLOv8最新改进系列:融合DySample超轻量动态上采样算子,低延迟、高性能,目前最新上采样方法!!!遥遥领先!

YOLOv8最新改进系列&#xff1a;融合DySample超轻量动态上采样算子&#xff0c;低延迟、高性能&#xff0c;目前最新上采样方法&#xff01;&#xff01;&#xff01;遥遥领先&#xff01; DySample超轻量动态上采样算子全文戳这&#xff01;here! 详细的改进教程以及源码&am…

最新版守约者二级域名分发系统

主要功能 二级域名管理&#xff1a; 我们的系统提供全面的二级域名管理服务&#xff0c;让您轻松管理和配置二级域名。 域名分发&#xff1a;利用我们先进的域名分发技术&#xff0c;您可以自动化地分配和管理域名&#xff0c;确保每个用户或客户都能及时获得所需的域名资源。…

OJ刷题日记:1、双指针(2)

目录 1、11.盛最多的水 2、LCR 179.查找总价格为目标值的两个商品 3、15.三数之和 4、18.四数之和 1、11.盛最多的水 题目&#xff1a; 11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/container-with-most-water/description/ …

45---M.2 SSD电路设计

视频链接 M.2 SSD硬件电路设计01_哔哩哔哩_bilibili M.2 SSD电路设计 1、M.2简介 1.1、M.2基本介绍 M.2接口也叫NGFF&#xff0c;英文全称Next Generation Form Factor。M.2接口是为超极本&#xff08;Ultrabook&#xff09;量身定做的新一代接口标准&#xff0c;是Intel推…

【微服务-Nacos】手把手教你Nacos集群部署,不会的来找我!

前面我们介绍了Nacos单机部署和微服务接入Nacos注册中心的操作步骤&#xff0c;但单机部署是分布式应用的大忌&#xff0c;在分布式架构中&#xff0c;任何单点都可能成为系统的瓶颈。因此关于Nacos部署&#xff0c;通常都是采用集群部署来为系统带来高可用性。这里我们来介绍下…

Python大数据分析——一元与多元线性回归模型

Python大数据分析——一元与多元线性回归模型 相关分析概念示例 一元线性回归模型概念理论分析函数示例 多元线性回归模型概念理论分析示例 线性回归模型的假设检验模型的F检验理论分析示例 模型的T检验理论分析示例 相关分析 概念 a 正相关&#xff1b;b 负相关&#xff1b;c…

基于ollama搭建本地chatGPT

ollama帮助我们可以快速在本地运行一个大模型&#xff0c;再整合一个可视化页面就能构建一个chatGPT&#xff0c;可视化页面我选择了chat-ollama&#xff08;因为它还能支持知识库&#xff0c;可玩性更高&#xff09;&#xff0c;如果只是为了聊天更推荐chatbox 部署步骤 下载…

【BMW】Bayerische Motoren Werke AG

文章目录 BMW 3系 X3X1、X2、奇瑞捷豹路虎、特斯拉ES200 vs BMW 325i M 运动曜夜Price历代宝马3系列 BMW 3系 X3 3 系参数 X1、X2、奇瑞捷豹路虎、特斯拉 ES200 vs BMW 325i M 运动曜夜 &#xff08;右到左看&#xff09; Price 2024.04.13 24年4月2&#xff0c;来自小…