sudo apt install libjpeg-dev  libgtk-3-dev

1 基本概念

  • opencv_contrib: 是 OpenCV 项目中的一个扩展模块集合。OpenCV(Open Source Computer Vision Library)是一个开源计算机视觉和机器学习软件库,而 opencv_contrib 包含了 OpenCV 主库中没有包括的额外模块和算法。这些模块通常由社区成员贡献,可能包括实验性、前沿或不太常用的功能。

  • OpenCL: 是一种用于编写跨平台并行编程的开放标准,主要由 Khronos Group 维护。它允许在异构计算环境中编写代码,这些环境包括 CPU、GPU、FPGA 以及其他加速器。OpenCL 的主要特点包括:跨平台支持(OpenCL 支持多种硬件平台,包括不同厂商的 CPU、GPU 和 FPGA)

  • DNN:OpenCV 中的 dnn 模块是专门用于深度神经网络(Deep Neural Networks, DNN)的模块。这个模块允许用户在 OpenCV 中加载和使用各种预训练的神经网络模型,用于任务如图像分类、物体检测、人脸识别、姿态估计等。

2 下载地址

1.OpenCV GitHub: https://github.com/opencv/opencv

2.OpeCV contrib GitHub: https://github.com/opencv/opencv_contrib

3 生成Makefile文件

分别解压两个文件之后,进入

  1. cd opencv-4.9.0

  2. mkdir build && cd build

  3. cmake-gui ..

     # 编译后安装路径前缀
     -D CMAKE_INSTALL_PREFIX=/usr/local/opencv-4.9.0 
    
     # OpenCV扩展模块路径
     -D OPENCV_EXTRA_MODULES_PATH=/home/lieryang/Downloads/opencv-4.9.0/opencv_contrib-4.9.0/modules
    
     # 生成opencv.pc文件
     -D OPENCV_GENERATE_PKGCONFIG=ON
    
     # 启用包含非自由许可的模块
     -D OPENCV_ENABLE_NONFREE=ON
    
     # CUBLAS 是 NVIDIA 提供的 CUDA Basic Linear Algebra Subprograms 库,是一个用于在 NVIDIA GPU 上加速执行基本线性代数运算的高性能库。
     -D WITH_CUBLAS=1
    
     # 使用CUDA
     -D WITH_CUDA=ON
    
     # DNN使用CUDA
     -D OPENCV_DNN_CUDA=ON
        
     # CUDA工具包路径
     -D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-12.2
    
     # CUDA加速数学运算
     -D ENABLE_FAST_MATH=ON
     -D CUDA_FASH_MATH=ON
        
    
     # GPU计算能力
     -D CUDA_ARCH_BIN=8.9
    
     # 中间代码使用情况很少,可以保持默认,好像也可以同计算能力相同
     -D CUDA_ARCH_PTX=
    
    
    

CUDA_ARCH_BIN:对应的是GPU计算能力。可以通过https://developer.nvidia.com/cuda-gpus#compute查看GPU计算能力。

alt text

alt text

PTX:这是CUDA的一种汇编语言,叫做Parallel Thread Execution,简称PTX;PTX是一种中间语言,可以在不同的GPU上运行;PTX是NVIDIA官方支持的最底层,有相关的文档(见Parallel Thread Execution ISA)和完善的工具链(NVCC,cuobjdump,PTXAS等等),也可以在driver api中load,甚至支持cuda C中inline PTX assembly。

alt text

4 问题

4.1 没有在CUDA文件夹中导入NVIDIA编解码SDK

alt text

NVIDIA VIDEO CODEC SDK:https://developer.nvidia.com/nvidia-video-codec-sdk/download

alt text

# 拷贝动态库和头文件到cuda文件夹
cd ~/Downloads/Video_Codec_SDK_12.2.72/Lib/linux/stubs/x86_64
sudo cp * /usr/local/cuda-12.2/lib64/stubs
cd ~/Downloads/Video_Codec_SDK_12.2.72/Interface
sudo cp * /usr/local/cuda-12.2/include

Nvidia在新的 Video Codec SDK 12.2 中更改了nvEncodeAPI.h接口 pixelBitDepthMinus8

我修改了NvEncoder.cpp:

第 119 行:

pIntializeParams->encodeConfig->encodeCodecConfig.hevcConfig.inputBitDepth  = pIntializeParams->encodeConfig->encodeCodecConfig.hevcConfig.outputBitDepth = (m_eBufferFormat == NV_ENC_BUFFER_FORMAT_YUV420_10BIT || m_eBufferFormat == NV_ENC_BUFFER_FORMAT_YUV444_10BIT) ? NV_ENC_BIT_DEPTH_10 : NV_ENC_BIT_DEPTH_8;

第 174 行至:

if (yuv10BitFormat && pEncoderParams->encodeConfig->encodeCodecConfig.hevcConfig.outputBitDepth != NV_ENC_BIT_DEPTH_10)