opencv系列之基于NVIDIA显卡的opencv-python硬解方案

2022/3/6 14:15:19

本文主要是介绍opencv系列之基于NVIDIA显卡的opencv-python硬解方案,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

文章目录

  • 前言
  • 正文
    • 前置安装
    • 安装VPF

前言

ffmpeg编译使用cuvid硬解方案试过了,不过解码出来的像素格式为YUV420, opencv中使用需要转成BGR,转色彩空间这部占用的CPU过高。

因此需要将转色彩空间这步也用GPU来处理,NVIDIA 开源了适用于 Python 的视频处理框架「VideoProcessingFramework(VPF)」。该框架为开发人员提供了一个简单但功能强大的 Python 工具,可用于硬件加速的视频编码、解码和处理类等任务。

同时,由于 Python 绑定下的 C ++ 代码,它使开发者可以在数十行代码中实现较高的 GPU 利用率。解码后的视频帧以 NumPy 数组或 CUDA 设备指针的形式公开,以简化交互过程及其扩展功能。

目前,VPF 并未对 NVIDIA Video Codec SDK 附加任何限制,开发者可充分利用 NVIDIA 专业级 GPU 的功能。

说明参考 VPF:适用于 Python 的开源视频处理框架,加速视频任务、提高 GPU 利用率

同时,VPF also supports exporting GPU memory objects such as decoded video frames to PyTorch tensors without Host to Device copies.
对于PyTorch推理及其友好。

正文

下面看看如何编译安装
参考 Ubuntu上安装NVIDIA VideoProcessingFramework (VPF)

前置安装

①安装与GPU匹配的CUDA和英伟达显卡驱动,需要注意版本对应。
②下载NVIDIA Video Codec SDK并解压备用,官网下载需要注册
③编译安装ffmpeg,我编译了ffmpeg的cuvid版本, 还不清楚的可以翻看以前的文章 经测试需要ffmpeg3.x版本

安装VPF

# Clone repo and start building process
cd ~/installs
git clone https://github.com/NVIDIA/VideoProcessingFramework.git

# Export path to CUDA compiler (you may need this sometimes if you install drivers from Nvidia site):
export CUDACXX=/usr/local/cuda-11.3/bin/nvcc

# Now the build itself
cd VideoProcessingFramework
mkdir -p install
mkdir -p build
cd build

# If you want to generate Pytorch extension, set up corresponding CMake value GENERATE_PYTORCH_EXTENSION  

cmake ..   -DFFMPEG_DIR:PATH="/usr/local/ffmpeg3.4.9"  \
-DVIDEO_CODEC_SDK_INCLUDE_DIR:PATH="/usr/local/include"   \
-DGENERATE_PYTHON_BINDINGS:BOOL="1"   \
-DGENERATE_PYTORCH_EXTENSION:BOOL="0"  \
-DPYTHON_LIBRARY=/home/hw/anaconda3/envs/cd_test/lib/libpython3.8.so   \
-DCMAKE_INSTALL_PREFIX:PATH="../install" \
-DPYTHON_EXECUTABLE=/home/hw/anaconda3/envs/cd_test/bin/python3 \
-DPYTHON_INCLUDE_DIR=/home/hw/anaconda3/envs/cd_test/include/python3.8


# 编译安装
make -j6  && sudo make install

# 验证是否成功
cd ../install/bin
conda activate cd_test
$ python3 SampleDecode.py 0 rtsp://localhost:8554/handwriting1 output.mp4
This sample decodes input video to raw NV12 file on given GPU.
Usage: SampleDecode.py $gpu_id $input_file $output_file.
[h264 @ 0x557242ed1f80] co located POCs unavailable
[rtsp @ 0x557242ecdc00] max delay reached. need to consume packet
[rtsp @ 0x557242ecdc00] RTP: missed 19 packets
[rtsp @ 0x557242ecdc00] max delay reached. need to consume packet
[rtsp @ 0x557242ecdc00] RTP: missed 2 packets

查看了下Sample源码,使用ffmpeg做了解封装,然后再用VPF的API做硬解码

如果需要在其他工程中使用VPF,则拷贝编译好的PyNvCodec.cpython-38-x86_64-linux-gnu.so文件到工程主目录下,或者在工程代码中使用sys.path.append(’/root/user/installs/VideoProcessingFramework/install/bin’)来添加,还可以将生成的.so文件拷贝到使用的Python包路径(例如cp PyNvCodec.cpython-38-x86_64-linux-gnu.so /root/conda/envs/env_name/lib/python3.8/site-packages/)。



这篇关于opencv系列之基于NVIDIA显卡的opencv-python硬解方案的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程