此示例使用 V4L2 图像捕获和 NVIDIA® CUDA® 格式转换。
$ 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 捕获的缓冲区,而无需内存复制。
$ ./capture-cuda -d /dev/video0 -m _ _ _ _ | | mmap copy | | convert | | copy | | write |_| ------> ptr ------> |_| =========> |_| ------> |_| -------> file | kernel | user
$ ./capture-cuda -d /dev/video0 -m -z _ _ _ | | mmap copy | | convert | | write |_| ------> ptr ------> |_| =========> |_| -------> file | kernel | user
$ ./capture-cuda -d /dev/video0 -u _ _ _ _ userptr | | copy | | convert | | copy | | write ---------> |_| ------> |_| =========> |_| ------> |_| -------> file | kernel | user
$ ./capture-cuda -d /dev/video0 -u -z _ _ userptr | | convert | | write ---------> |_| =========> |_| -------> file | kernel | user