Jetson Linux API 参考

32.7.4 版本
v4l2cuda (CUDA 格式转换)

概述

此示例使用 V4L2 图像捕获和 NVIDIA® CUDA® 格式转换。

构建和运行

前提条件

  • 您已按照构建和运行中的步骤 1-3 进行操作。
  • 您已安装
    • CUDA 工具包
  • 支持 YUYV 输出格式的 USB 摄像头已插入您的目标设备。

构建

  • 输入
       $ cd v4l2cuda
       $ make
    

清理所有生成的文件

  • 输入

    make clean

运行

  • 输入
    $ ./capture-cuda [options]
    

查看支持的选项

  • 输入
    $ ./capture-cuda --help
    


流程

这是 capture-cuda 的整体流程

            V4L2                          CUDA
USB camera ------> captured image (YUYV) ------> converted image (RGB)

如下图所示,缓冲区流程因 V4L2 捕获模式和 CUDA 内存管理而异。

V4L2 内存映射缓冲区 (V4L2_MEMORY_MMAP) 在内核空间中分配。应用程序在用户空间中映射它们,并将它们复制到 CUDA 设备分配的内存中以进行 CUDA 处理。

应用程序分配 V4L2 用户空间缓冲区 (V4L2_MEMORY_USERPTR)。在这种情况下,驱动程序直接填充用户空间内存。当您分配 CUDA 可映射内存(使用 cudaHostAlloc)时,CUDA 设备可以直接访问 V4L2 捕获的缓冲区,而无需内存复制。

使用内存映射缓冲区(-m 选项)

$ ./capture-cuda -d /dev/video0 -m

   _                       _              _           _
  | |  mmap        copy   | |  convert   | |  copy   | |  write
  |_| ------> ptr ------> |_| =========> |_| ------> |_| -------> file
        |
kernel  |  user

使用内存映射缓冲区和零拷贝 CUDA 内存(-m 和 -z 选项)

$ ./capture-cuda -d /dev/video0 -m -z

   _                       _              _
  | |  mmap        copy   | |  convert   | |  write
  |_| ------> ptr ------> |_| =========> |_| -------> file
        |
kernel  |  user

使用应用程序分配的缓冲区(-u 选项)

$ ./capture-cuda -d /dev/video0 -u

               _           _              _           _
    userptr   | |  copy   | |  convert   | |  copy   | |  write
   ---------> |_| ------> |_| =========> |_| ------> |_| -------> file
        |
kernel  |  user

使用应用程序分配的缓冲区和零拷贝 CUDA 内存(-u 和 -z 选项)

$ ./capture-cuda -d /dev/video0 -u -z

               _              _
    userptr   | |  convert   | |  write
   ---------> |_| =========> |_| -------> file
        |
kernel  |  user
. All rights reserved.