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

2024-04-16 08:36

本文主要是介绍自编译支持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
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:${PKG_CONFIG_PATH}
./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 cv2if __name__ == '__main__':rtsp_url = 'rtsp://admin:123456@192.168.1.100/'decoder = cv2.cudacodec.createVideoReader(rtsp_url)#不设置的化默认是BGRA,为了方便后续处理,指定为BGRdecoder.set(cv2.cudacodec.COLOR_FORMAT_BGR)count = 0while 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

这篇关于自编译支持CUDA硬解的OPENCV和FFMPEG的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/908298

相关文章

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

opencv 滚动条

参数介绍:createTrackbar( trackbarname , "hello" , &alpha_slider ,alpha_max ,  on_trackbar )  ;在标签中显示的文字(提示滑动条的用途) TrackbarName创建的滑动条要放置窗体的名字 “hello”滑动条的取值范围从 0 到 alpha_max (最小值只能为 zero).滑动后的值存放在

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据

Windows环境利用VS2022编译 libvpx 源码教程

libvpx libvpx 是一个开源的视频编码库,由 WebM 项目开发和维护,专门用于 VP8 和 VP9 视频编码格式的编解码处理。它支持高质量的视频压缩,广泛应用于视频会议、在线教育、视频直播服务等多种场景中。libvpx 的特点包括跨平台兼容性、硬件加速支持以及灵活的接口设计,使其可以轻松集成到各种应用程序中。 libvpx 的安装和配置过程相对简单,用户可以从官方网站下载源代码