跳转到内容

适用于视频的 NVIDIA GPUDirect#

Basler 支持 NVIDIA GPUDirect for Video 技术。您可以通过 Basler Framegrabber API 访问和控制 NVIDIA GPUDirect for Video 技术的使用。NVIDIA GPUDirect for Video 专门针对使用 NVIDIA 图形处理器 (GPU) 的系统进行过优化。

该技术允许以低延迟将视频帧高效传输到 NVIDIA GPU Memory 中。它使您能够完全控制以子帧传输时间将视频流式传输到 GPU 中。

GPUDirect for Video 技术可通过运行在以下操作系统的主机 PC 上的 Basler Framegrabber API 使用:Windows

  • OpenGL (Open Graphics Library),或
  • CUDA (Compute Unified Device Architecture),这是由 NVIDIA 开发的并行编程框架。

NVIDIA GPUDirect for Video 专为使用 NVIDIA 图形处理单元 (GPU) 的系统而定制。该技术允许以低延迟将视频帧高效传输到 NVIDIA GPU Memory 中。它使您能够完全控制以子帧传输时间将视频流式传输到 GPU 中。

有关详细信息,请参阅制造商网站上的 NVIDIA GPUDirect for Video 技术和 GPUDirect 技术概述部分。

要求#

若要结合使用 Basler 图像采集卡和 GPUDirect for Video 技术,您的系统必须满足以下要求:

硬件#

有关支持的 NVIDIA GPU 的最新列表,请参见此处。

您选择的 Basler 图像采集卡。

软件#

  • Basler Framegrabber SDK:5.10.0 或更高版本
  • 宿主机 PC 操作系统:Windows 10 (64bit)
  • 并行计算平台/API(参见 安装):
    • CUDA (Compute Unified Device Architecture),版本 11.6,或
    • OpenGL (Open Graphics Library)
  • 推荐的 IDE:Visual Studio 15.x 或更高版本

信息

您可能需要额外的 DLL 和头文件才能运行 GPUDirect for Video。有关更多信息,请联系 Basler 技术支持。

GPUDirect for Video 技术的支持已在 Windows 10 下进行了测试,并且可以保证在此 Windows 版本上运行。

安装#

前提条件#

  • GPU 硬件:主机 PC 上已插入支持 GPUDirect for Video 技术的 NVIDIA GPU。
  • Parallel Computing Platform/API:主机 PC 上已安装以下软件包之一:
    • CUDA (Compute Unified Device Architecture),NVIDIA 的并行编程框架
    • OpenGL (Open Graphics Library)
  • 采集卡硬件:您选择的 Basler 采集卡已连接到您的主计算机。有关如何连接采集卡的的信息,请参阅连接采集卡。
  • Framegrabber SDK:已安装 Basler Framegrabber SDK 5.10.0 或更高版本。有关如何安装运行时软件的信息,请参阅安装 Framegrabber SDK。
  • 小程序:您选择的小程序已烧录到您的采集卡上(仅适用于 marathon 采集卡)并被选为活动小程序。有关如何烧录 marathon 采集卡的信息,请参阅烧录。有关如何将小程序选为活动小程序的信息,请参阅更改活动小程序。
  • GPUDirect for Video 支持文件:Basler 为您提供以下文件:
    • siso_gpudirect.dll:库文件
    • siso_gpudirect.h:包含始终所需的通用函数的头文件
    • siso_gpudirect_cuda.h:使用 CUDA 时所需的头文件
    • siso_gpudirect_gl.h:在 OpenGL 中工作时所需的头文件。

安装 GPUDirect for Video 支持#

要在主控 PC 上安装 GPUDirect for Video 支持:

  1. 将库文件 siso_gpudirect.dll 复制到 Basler Framegrabber SDK 安装目录的子文件夹 bin 中,例如 C:\Program Files\Basler\FramegrabberSDK_5.XX.X\bin。
  2. 将头文件复制到 Basler Framegrabber SDK 安装目录的子文件夹 include 中,例如 C:\Program Files\Basler\FramegrabberSDK_5.XX.X\include。

将文件复制到安装目录中提到的子文件夹后,您就可以通过 Basler Framegrabber API 使用 GPUDirect for Video 的功能。

函数参考#

您可以通过 Basler Framegrabber API 使用 CUDA 或 OpenGL 来控制 GPUDirect for Video。

使用 CUDA 的先决条件#

  • 库文件 siso_gpudirect.dll 已复制到 Framegrabber SDK 安装目录的子文件夹 bin 中。
  • 头文件 siso_gpudirect.h 和 siso_gpudirect_cuda.h 已复制到 Framegrabber SDK 安装目录的子文件夹 include 中。

使用 OpenGL 的先决条件#

  • 库文件 siso_gpudirect.dll 已复制到 Framegrabber SDK 安装目录的子文件夹 bin 中。
  • 头文件 siso_gpudirect.h 和 siso_gpudirect_gl.h 已复制到 Framegrabber SDK 安装目录的子文件夹 include 中。

可用函数#

通过 Basler Framegrabber API 控制 GPUDirect for Video 技术的函数在 CUDA 和 OpenGL 中是相同的。Basler Framegrabber API 提供以下函数:

功能 GDInitLib
描述 全局初始化。在任何其他初始化函数之前调用此函数。
参数
  • [in] Fg_Struct* iFgHandle:
    有效采集卡实例的句柄。参见库文档 fglib 请参见 Framegrabber API Manual。
  • [in] GD_CONTEXT iFlag:
    在此定义您将使用的技术。可选值 (GD_CTX_LIST):
    • GD_CTX_CUDA:表示与 CUDA 配合使用
    • GD_CTX_OPENGL: 表示与 OpenGL 一起使用
    • GD_CTX_D3D9:不支持
    • GD_CTX_D3D11:不支持
功能 GDCloseLib
描述 当不再需要该库的任何功能时,您必须调用此函数来清除来自 GDInitLib 函数调用。每次调用 GCCloseLib 必须伴随先前的调用 GDInitLib.
参数 无
功能 GDGetContextInfo
描述 使用此函数获取有关当前 Context 的信息。
参数
  • [in] GD_CONTEXT_INFO_CMD iInfoCmd:
    使用此参数指示您要获取的信息。唯一可用值: GD_CONTEXT_STRIDE_LENGTH。:
    Stride length 定义如下:当视频图像存储在 Memory 中时,Memory buffer 可能会在每一行像素之后包含额外的填充字节。填充字节会影响图像在 Memory 中的存储方式,但不会影响图像的显示方式。Stride 是指 Memory 中某一行的像素到下一行像素的字节数。Stride 也称为 pitch。如果存在填充字节,则 stride 会比图像宽度更宽,如以下插图所示。包含具有相同尺寸的视频帧的两个 buffer 可以具有不同的 stride。如果您处理视频图像,则必须考虑 stride。Stride Length:
    Source: https://msdn.microsoft.com/en-us/library/windows/desktop/aa473780(v=vs.85).aspx:
    确保您定义的图像尺寸符合填充约束。
  • [out] void * pBuffer<:/br>The information provided (i.e. input value), for example, the value of the stride length, is written into this buffer. If pBuffer = NULL, piSize 提供缓冲区保存信息(即输出值)所需的大小。
  • [in/out] size_t * piSize:
    调用此函数时,您必须定义以下各项的大小: pBuffer 在此参数中。如果尺寸太小(对于传递的缓冲区长度),则 size 会自动调整以适应缓冲区的大小。调用后,该参数将保存已写入的字节数 pBuffer.
功能 GDRevokeBuffer
描述 从采集引擎中移除已注册的 buffer。此函数将释放与该 buffer 相关的所有内部已分配资源。只有当 buffer 未在任何队列中排队时,才能对其进行撤销。
参数 [in] BUFFER_HANDLE:
指向该 buffer 的 Handle。buffer 本身已通过函数 GDAllocateSourceBuffer, GDAnnounceCUDAArray, GDAnnounceTextureGL或 GDAnnounceBufferGL.
功能 GDStartAcquisition
描述 启动采集引擎。
参数 无
功能 GDStartAcquisitionEx
描述 启动采集引擎。
参数
  • [in] unsigned int apcTimeout:
    设置采集引擎的超时持续时间(以秒为单位)。
    默认:5 秒。
  • [in] unsigned int apcFlags:
    用于启用或禁用采集引擎特定功能的 Flags。
    请参见 为异步模式注册回调函数 以获取 Flags 列表。
    默认: GD_ACQUISITION_DEFAULT_FLAGS
    → 这会计算为: FG_APC_IGNORE_TIMEOUTS | FG_APC_DELIVER_ERRORS.
    Flag 详情:
    • FG_APC_DELIVER_ERRORS:所需对象: GDGetLastError 以正常运行。
    • FG_APC_IGNORE_TIMEOUTS:确保采集引擎持续运行,即使在指定的时间内未收到图像数据,时间见 apcTimeout.
功能 GDStopAcquisition
描述 停止采集引擎。
参数 无
功能 GDAllocateSourceBuffer
描述 此函数为单个源 buffer 分配 Memory,将此 buffer 注册到采集引擎,并返回引用该单个 buffer 的 buffer Handle。
参数
  • [in] uint32_t width:图像宽度
  • [in] uint32_t height:图像高度
  • [in] GDBufferTypes type:使用此参数定义 Pixel Format。可选值:
    • GD_UNSIGNED_BYTE
    • GD_BYTE
    • GD_UNSIGNED_SHORT
    • GD_SHORT
    • GD_UNSIGNED_INT
    • GD_INT
    • GD_FLOAT
    • GD_HALF_FLOAT
    • GD_UNSIGNED_BYTE_3_3_2
    • GD_UNSIGNED_BYTE_2_3_3_REV
    • GD_UNSIGNED_SHORT_5_6_5
    • GD_UNSIGNED_SHORT_5_6_5_REV
    • GD_UNSIGNED_SHORT_4_4_4_4
    • GD_UNSIGNED_SHORT_4_4_4_4_REV
    • GD_UNSIGNED_SHORT_5_5_5_1
    • GD_UNSIGNED_SHORT_1_5_5_5_REV
    • GD_UNSIGNED_INT_8_8_8_8
    • GD_UNSIGNED_INT_8_8_8_8_REV
    • GD_UNSIGNED_INT_10_10_10_2
    • GD_UNSIGNED_INT_2_10_10_10_REV
  • [out] BUFFER_HANDLE*:句柄
功能 GDRegisterEvent
描述 将 Event 对象注册到特定的 iEventID.
参数
  • [输入] EVENT_TYPE iEventID:
    可选值:
    • EVENT_ERROR:关于模块错误的通知。
    • EVENT_COPY_FINISHED:新填充的缓冲区的通知。事件数据存储在 EVENT_NEW_BUFFER_DATA。或者,您可以使用函数 GDMemcpy.
  • [out] EVENT_HANDLE* phEvent:
    使用此 Handle 通过函数获取 Events GDEventGetData.
功能 GDEventGetData
描述 从与事件句柄关联的事件数据队列中检索下一个事件数据条目。
参数
  • [in] EVENT_HANDLE phEvent:
    您已经通过以下函数创建了此句柄 GDRegisterEvent.
  • [out] void * pBuffer:
    提供的信息(即输出值)被写入此缓冲区。如果 pBuffer = NULL, piSize 提供缓冲区保存信息(即输出值)所需的大小。
  • [in/out] size_t * piSize:
    调用此函数时,您必须定义以下各项的大小: pBuffer 在此参数中。如果尺寸太小(对于传递的缓冲区长度),则 size 会自动调整以适应缓冲区的大小。调用后,该参数将保存已写入的字节数 pBuffer.
  • [in] uint64_t iTimeout<:/br/> The function doesn't deliver any output until the time-out is over (in this case, the function returns state GD_ERR_TIMEOUT ),或者直到指定事件发生为止。
功能 GDMemcpy
描述 将帧grabber传输的下一帧复制到 GPU 中。如果您想触发复制过程,请使用此函数。结果以 EVENT_NEW_BUFFER_DATA 类型。
参数
  • [out] void * pBuffer:
    该值被写入此缓冲区。如果 pBuffer = NULL, piSize 提供缓冲区保存所需的大小 EVENT_NEW_BUFFER_DATA 类型。
  • [in/out] size_t * piSize:
    调用此函数时,您必须定义以下各项的大小: pBuffer 在此参数中。如果尺寸太小(对于传递的缓冲区长度),则 size 会自动调整以适应缓冲区的大小。调用后,该参数将保存已写入的字节数 pBuffer.
功能 GDBufferUnblock
描述 此函数取消阻塞用于复制过程的缓冲区。您作为 EVENT_NEW_BUFFER_DATA 成员收到的每个缓冲区都需要通过此函数取消阻塞(例如,以便为新的复制过程腾出缓冲区)。在取消阻塞缓冲区之前,请确保对缓冲区内容的操作已完成。
参数 [in] BUFFER_HANDLE phBuffer
功能 GDBufferGetDataPtr
描述 此函数返回指向缓冲区 Memory 位置起始点的指针。该缓冲区必须已通过 GDAllocateSourceBuffer 函数。
参数
  • [in] BUFFER_HANDLE phBuffer
  • [out] void** mDataPtr :
    包含指向由此缓冲区管理的原始数据的指针。
功能 GGDGetBufferInfo
描述 使用此函数查询与此缓冲区句柄关联的缓冲区模块的信息。
参数
  • [in] BUFFER_HANDLE hBuffer
  • [in] GD_BUFFER_INFO_CMD iInfoCmd:
    可选值:
    • GD_BUFFER_TIMESTAMP:缓冲区中最后更改的时间戳。
    • GD_BUFFER_TIMESTAMP_FREQUENCY:时间戳频率。
    • GD_BUFFER_PICNUMBER:缓冲区内容的索引。
    • GD_BUFFER_DATA_PTR:指向由缓冲区管理的原始数据的指针。
  • [out] void * pBuffer:
    该值被写入此缓冲区。如果 pBuffer = NULL, piSize 提供保存数据所需的缓冲区大小。
  • [in/out] size_t * piSize :
    调用此函数时,您必须定义以下各项的大小: pBuffer 在此参数中。如果尺寸太小(无法容纳传入的缓冲区长度),尺寸值将自动调整以匹配缓冲区的大小。调用后,此参数保存写入到中的字节数。 pBuffer.
功能 GDGetLastError
描述 使用此函数查询与发生的最后一个错误关联的消息。
参数
  • [out] char * pMsgBuffer:
    该值被写入此缓冲区。如果 pMsgBuffer = NULL, piSize 提供缓冲区保存错误消息所需的尺寸。
  • [in/out] size_t * piSize :
    调用此函数时,您必须定义以下各项的大小: pMsgBuffer 在此参数中。如果大小太小(对于传递的消息),则对应的值 size 会自动调整以适应消息的大小。调用后,此参数保存写入到中的字节数。 pBuffer.
功能 GDAnnounceTextureGL
描述 此函数将目标对象声明为复制操作的目标,并返回引用该单个缓冲区的缓冲区句柄。
参数
  • [in]GLuint texture:
    您用 openGL 创建的纹理的 ID。
  • [out]BUFFER_HANDLE* handle:
    指向此缓冲区的句柄。
功能 GDAnnounceBufferGL
描述 此函数将目标对象声明为复制操作的目标,并返回引用该单个缓冲区的缓冲区句柄。
参数
  • [in]GLuint buffer:
    您用 openGL 创建的纹理的 ID。
  • [out]BUFFER_HANDLE* handle:
    指向此缓冲区的句柄。
功能 GDAnnounceCUDAArray
描述 此函数将目标对象声明为复制操作的目标,并返回引用该单个缓冲区的缓冲区句柄。
参数
  • CUarray array:
    引用您通过 CUDA 创建的缓冲区的句柄。
  • BUFFER_HANDLE* handle:
    指向此缓冲区的句柄。

数据类型#

STRUCT 的名称 EVENT_NEW_BUFFER_DATA
描述 该事件已将源缓冲区的内容复制到目标缓冲区中。
参数
  • BUFFER_HANDLE SourceBufferHandle:
    您已通过函数创建了此缓冲区 GDAllocateSourceBuffer.
  • BUFFER_HANDLE TargetBufferHandle:
    您已通过函数创建了此缓冲区 GDAnnounceCUDAArray (CUDA),或通过函数 GDAnnounceTextureGL 或 PGDAnnounceBufferGL (OpenGL)。

枚举#

GD_CTX_LIST
GD_CTX_CUDA CUDA 上下文名称
GD_CTX_OPENGL OpenGL 上下文名称
GD_CTX_D3D9 不支持
GD_CTX_D3D11 不支持
GD_CONTEXT_INFO_LIST
GD_CONTEXT_STRIDE_LENGTH Stride Length:
Source: https://msdn.microsoft.com/en-us/library/windows/desktop/aa473780(v=vs.85).aspx
GDBufferTypes
GD_UNSIGNED_BYTE
GD_BYTE
GD_UNSIGNED_SHORT
GD_SHORT
GD_UNSIGNED_INT
GD_INT
GD_FLOAT
GD_HALF_FLOAT
GD_UNSIGNED_BYTE_3_3_2
GD_UNSIGNED_BYTE_2_3_3_REV
GD_UNSIGNED_SHORT_5_6_5
GD_UNSIGNED_SHORT_5_6_5_REV
GD_UNSIGNED_SHORT_4_4_4_4
GD_UNSIGNED_SHORT_4_4_4_4_REV
GD_UNSIGNED_SHORT_5_5_5_1
GD_UNSIGNED_SHORT_1_5_5_5_REV
GD_UNSIGNED_INT_8_8_8_8
GD_UNSIGNED_INT_8_8_8_8_REV
GD_UNSIGNED_INT_10_10_10_2
GD_UNSIGNED_INT_2_10_10_10_REV
EVENT_TYPE_LIST
EVENT_ERROR 模块错误通知。
EVENT_COPY_FINISHED 关于新 Fill 的缓冲区的通知。事件数据存储在 EVENT_NEW_BUFFER_DATA.
GD_BUFFER_INFO_LIST
GD_BUFFER_TIMESTAMP 缓冲区中上次更改的时间戳
GD_BUFFER_TIMESTAMP_FREQUENCY 时间戳频率
GD_BUFFER_PICNUMBER 缓冲区内容的索引
GD_BUFFER_DATA_PTR 指向由缓冲区管理的原始数据的指针

示例#

前提条件#

  • 您可以使用从 Basler 收到的示例文件夹。
  • 您的电脑上已安装 Visual Studio 15.x 或更高版本。
  • 您的 PC 上已安装 CMake。
  • 您的电脑上已安装相应的库。

使用示例#

要使用 Basler 提供的示例:

  1. 将您从 Basler 收到的 examples 文件夹复制到宿主 PC 的硬盘上。

    CUDA 示例

    对于 CUDA 示例,除了 PC 上已安装的库外,您只需要 cuda.lib 和 cudart.lib。

    OpenGL 示例:CMake 必须能够找到 glew

    确保 CMake 能够找到 glew,否则项目将无法正确构建。

    CMake 通常无需您的干预即可找到 glew。但是,如果未找到 glew:

    1. 设置相应的环境变量:

      GLUT_ROOT_PATH 例如 D:\libs\freeglut-2.8.1\win32

      GLEW_ROOT_PATH 例如 D:\libs\glew-1.13.0\glew-1.13.0\Win32

    2. 如果 CMake 仍然无法找到 glew,请手动设置 CMake 项目变量:

      GLEW_INCLUDE_DIR 例如 D:\/libs\/glew-1.13.0\/glew-1.13.0\/x64\/include

      GLEW_LIBRARY 例如 D:\/libs\/glew-1.13.0\/glew-1.13.0\/x64\/lib\/glew32.lib

      OPENGL_gl_LIBRARY 例如 opengl32

      OPENGL_glu_LIBRARY 例如 glu32

  2. 使用 CMake 创建一个项目,并将 examples\gpudirect\cuda 或 examples\gpudirect\opengl 设置为源目录。

  3. 运行示例。

在运行示例的过程中,系统会提示您选择一个 Applet。请选择灰度 Applet,例如针对 marathon frame grabber 的 Acq_SingleCXP6X4AreaGray.dll。该名称可能会被截断,您只能看到结尾部分。

对于 marathon 采集卡:在示例中使用 Grayscale Applet

Basler NVIDIA GPUDirect for Video 支持功能既适用于彩色格式,也适用于灰度格式。

但是,由于这两个示例均设计用于灰度 Applet,因此请确保选择灰度 Applet 来运行示例,例如 Acq_SingleCXP6X4AreaGray.dll(仅适用于 marathon frame grabber)。