跳转到内容

适用于视频的 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 OS,并且在

  • OpenGL (Open Graphics Library),或
  • CUDA (Compute Unified Device Architecture)(NVIDIA 推出的并行编程框架)下运行。

NVIDIA GPUDirect for Video 专门针对使用 NVIDIA 图形处理器 (GPU) 的系统进行量身定制。该技术允许以低延迟高效地将视频帧传输到 NVIDIA GPU Memory 中。它赋予您完全的控制权,能够以子帧传输时间将视频流式传输到 GPU 中。

有关详细信息,请参阅厂商网站的 NVIDIA GPUDirect for Video technology 和 GPUDirect Technology Overview 章节。

要求#

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

硬件#

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

您选择的 Basler 图像采集卡。

软件#

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

信息

您可能需要额外的 DLL 和头文件才能使 GPUDirect for Video 正常运行。有关更多信息,请联系 Basler Technical Support。

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

安装#

前提条件#

  • GPU 硬件:宿主机 PC 上已插入支持 GPUDirect for Video 技术的 NVIDIA GPU。
  • 并行计算平台/API:宿主机 PC 上已安装以下软件包之一:
    • CUDA(Compute Unified Device Architecture):Nvidia 推出的并行编程框架
    • OpenGL (Open Graphics Library)
  • 采集卡硬件:已将您选择的 Basler 采集卡连接到宿主机 PC。有关如何连接采集卡的详细信息,请参阅 Connecting the Frame Grabber。
  • Framegrabber SDK:已安装 Basler Framegrabber SDK 5.10.0 或更高版本。有关如何安装运行时软件的信息,请参阅 Installing the Framegrabber SDK。
  • Applet:您选择的 applet 已烧录到采集卡中(仅适用于 marathon 采集卡)并被选为活动 applet。有关如何烧录 marathon 采集卡的详细信息,请参阅 Flashing。有关如何将某个 applet 选择为活动 applet 的详细信息,请参阅 Changing the Active Applet。
  • 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。

将文件复制到安装的上述子文件夹后,即可通过 Framegrabber API 使用 GPUDirect for Video 的功能。

函数参考#

您可以通过 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 中。

可用函数#

通过 Framegrabber API 控制 GPUDirect for Video 技术的函数对于 CUDA 和 OpenGL 是相同的。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
描述 使用此函数可以获取有关当前上下文的信息。
参数
  • [in] GD_CONTEXT_INFO_CMD iInfoCmd:
    使用此参数指定您要获取的信息。唯一可用值为: GD_CONTEXT_STRIDE_LENGTH. :
    步长定义如下:当视频图像存储在内存中时,内存缓冲区可能在每行像素后包含额外的填充字节。这些填充字节会影响图像在内存中的存储方式,但不会影响图像的显示方式。步长是指内存中一行像素到下一行像素之间的字节数。步长也称为间距。如果存在填充字节,则步长会大于图像的宽度,如下图所示。两个包含尺寸相同的视频帧的缓冲区可以具有不同的步长。处理视频图像时,必须考虑步长。步幅:
    来源: 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
描述 从采集引擎中移除已声明的缓冲区。此函数将释放与该缓冲区关联的所有内部分配资源。只有当缓冲区未在任何队列中排队时,才能撤销该缓冲区。
参数 [in] BUFFER_HANDLE:
处理对缓冲区的引用。缓冲区本身已通过函数声明。 GDAllocateSourceBuffer, GDAnnounceCUDAArray, GDAnnounceTextureGL或 GDAnnounceBufferGL.
功能 GDStartAcquisition
描述 启动采集引擎。
参数 无
功能 GDStartAcquisitionEx
描述 启动采集引擎。
参数
  • [in] unsigned int apcTimeout:
    设置采集引擎的超时持续时间(以秒为单位)。
    默认:5秒。
  • [in] unsigned int apcFlags:
    用于启用或禁用采集引擎特定功能的标志。
    请参阅 Registering a Callback Function for Asynchronous Mode 以获取标志列表。
    默认: GD_ACQUISITION_DEFAULT_FLAGS
    → 计算结果为: FG_APC_IGNORE_TIMEOUTS | FG_APC_DELIVER_ERRORS.
    标志详情:
    • FG_APC_DELIVER_ERRORS:必需 GDGetLastError 正常运作。
    • FG_APC_IGNORE_TIMEOUTS确保即使在指定时间内未收到任何图像数据,采集引擎也能继续运行。 apcTimeout.
功能 GDStopAcquisition
描述 停止采集引擎。
参数 无
功能 GDAllocateSourceBuffer
描述 此函数为单个源缓冲区分配 Memory,将该缓冲区声明给采集引擎,并返回一个引用该单个缓冲区的缓冲区句柄。
参数
  • [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
描述 将事件对象注册到特定的 iEventID.
参数
  • [输入] EVENT_TYPE iEventID:
    可能的值:
    • EVENT_ERROR:模块错误通知。
    • EVENT_COPY_FINISHED:新填充缓冲区的通知。事件数据存储在 EVENT_NEW_BUFFER_DATA中。或者,您可以使用函数 GDMemcpy.
  • [out] EVENT_HANDLE* phEvent:
    使用此句柄通过函数获取事件 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
描述 将采集卡传输的下一帧复制到 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 步幅:
来源: 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 或更高版本。
  • 您的电脑上已安装 CMake。
  • 您的电脑上已安装相应的库。

使用示例#

若要使用 Basler 提供的示例:

  1. 将您从 Basler 收到的示例文件夹复制到主机电脑的硬盘上。

    CUDA 示例

    对于 CUDA 示例,除电脑上已安装的库外,您只需要 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 Frame Grabbers:在示例中使用灰度 Applet

Basler NVIDIA GPUDirect for Video 支持既适用于 Color Format,也适用于灰度格式。

但是,由于这两个示例都是设计用于灰度 applet 的,因此请确保在使用示例时选择一个灰度 applet,例如 Acq_SingleCXP6X4AreaGray.dll(仅适用于 marathon frame grabbers)。