opencv系列之基于NVIDIA显卡的opencv-python硬解方案
Posted 狂奔的CD
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv系列之基于NVIDIA显卡的opencv-python硬解方案相关的知识,希望对你有一定的参考价值。
文章目录
前言
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硬解方案的主要内容,如果未能解决你的问题,请参考以下文章
NVIDIA 30系列等等族福音 : AMD RX 6800/6900发布