光流
光流队列
VK_NV_optical_flow
向 VkQueueFlagBits 添加了一个光流队列类型位 VK_QUEUE_OPTICAL_FLOW_BIT_NV
。具有 VK_QUEUE_OPTICAL_FLOW_BIT_NV
声明队列功能的队列支持光流操作。与其他队列类型一样,应用程序必须使用 vkGetPhysicalDeviceQueueFamilyProperties 来查询物理设备是否支持光流队列。当实现报告队列系列的 VK_QUEUE_OPTICAL_FLOW_BIT_NV
位时,它声明了对 设备和队列中描述的 Vulkan 队列操作的一般支持。
光流图像格式
要枚举特定光流用法支持的图像格式,请调用
// Provided by VK_NV_optical_flow
VkResult vkGetPhysicalDeviceOpticalFlowImageFormatsNV(
VkPhysicalDevice physicalDevice,
const VkOpticalFlowImageFormatInfoNV* pOpticalFlowImageFormatInfo,
uint32_t* pFormatCount,
VkOpticalFlowImageFormatPropertiesNV* pImageFormatProperties);
-
physicalDevice
是正在查询的物理设备。 -
pOpticalFlowImageFormatInfo
是指向 VkOpticalFlowImageFormatInfoNV 结构的指针,该结构指定返回信息的光流用法。 -
pImageFormatProperties
是指向 VkOpticalFlowImageFormatPropertiesNV 结构数组的指针,其中返回支持的格式和图像参数。
如果 pImageFormatProperties
为 NULL
,则在 pFormatCount
中返回给定的 physicalDevice
支持的光流属性的数量。否则,pFormatCount
必须指向应用程序设置为 pImageFormatProperties
数组中元素数量的变量,并且在返回时,该变量将被实际写入 pImageFormatProperties
的值数量覆盖。如果 pFormatCount
的值小于支持的光流属性数量,则最多将 pFormatCount
个值写入 pImageFormatProperties
,并且将返回 VK_INCOMPLETE
而不是 VK_SUCCESS
,以指示未返回所有可用的值。
在创建用作光流帧的图像之前,请使用 vkGetPhysicalDeviceFormatProperties2 和 vkGetPhysicalDeviceImageFormatProperties2 并使用报告的格式之一查询支持的图像创建参数,并将 VkOpticalFlowImageFormatInfoNV 添加到 VkPhysicalDeviceImageFormatInfo2 的 pNext
链。
当使用 vkGetPhysicalDeviceImageFormatProperties2 查询用于光流操作的图像的参数时,VkOpticalFlowImageFormatInfoNV::usage
字段必须包含在 VkOpticalFlowUsageFlagBitsNV 中定义的一个或多个位。
|
VkOpticalFlowImageFormatInfoNV 结构定义如下:
// Provided by VK_NV_optical_flow
typedef struct VkOpticalFlowImageFormatInfoNV {
VkStructureType sType;
const void* pNext;
VkOpticalFlowUsageFlagsNV usage;
} VkOpticalFlowImageFormatInfoNV;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
usage
是一个 VkOpticalFlowUsageFlagBitsNV 的位掩码,用于描述图像的预期光流用途。
可以在 VkOpticalFlowImageFormatInfoNV::usage
中设置的位,用于控制光流用途,包括:
// Provided by VK_NV_optical_flow
typedef enum VkOpticalFlowUsageFlagBitsNV {
VK_OPTICAL_FLOW_USAGE_UNKNOWN_NV = 0,
VK_OPTICAL_FLOW_USAGE_INPUT_BIT_NV = 0x00000001,
VK_OPTICAL_FLOW_USAGE_OUTPUT_BIT_NV = 0x00000002,
VK_OPTICAL_FLOW_USAGE_HINT_BIT_NV = 0x00000004,
VK_OPTICAL_FLOW_USAGE_COST_BIT_NV = 0x00000008,
VK_OPTICAL_FLOW_USAGE_GLOBAL_FLOW_BIT_NV = 0x00000010,
} VkOpticalFlowUsageFlagBitsNV;
-
VK_OPTICAL_FLOW_USAGE_INPUT_BIT_NV
指定图像可以用作光流操作的输入或参考帧。 -
VK_OPTICAL_FLOW_USAGE_OUTPUT_BIT_NV
指定图像可以用作光流操作的输出流矢量图。 -
VK_OPTICAL_FLOW_USAGE_HINT_BIT_NV
指定图像可以用作光流操作的提示流矢量图。 -
VK_OPTICAL_FLOW_USAGE_COST_BIT_NV
指定图像可以用作光流操作的输出成本图。 -
VK_OPTICAL_FLOW_USAGE_GLOBAL_FLOW_BIT_NV
指定图像可以用作光流操作的全局流矢量。
// Provided by VK_NV_optical_flow
typedef VkFlags VkOpticalFlowUsageFlagsNV;
VkOpticalFlowUsageFlagsNV
是一个位掩码类型,用于设置零个或多个 VkOpticalFlowUsageFlagBitsNV 的掩码。
// Provided by VK_NV_optical_flow
typedef struct VkOpticalFlowImageFormatPropertiesNV {
VkStructureType sType;
const void* pNext;
VkFormat format;
} VkOpticalFlowImageFormatPropertiesNV;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
format
是一个 VkFormat,用于指定可以与指定的光流图像用途一起使用的格式。
光流会话
光流会话对象
光流会话对象被抽象化并由 VkOpticalFlowSessionNV 句柄表示
// Provided by VK_NV_optical_flow
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkOpticalFlowSessionNV)
创建光流会话
要创建光流会话对象,请调用:
// Provided by VK_NV_optical_flow
VkResult vkCreateOpticalFlowSessionNV(
VkDevice device,
const VkOpticalFlowSessionCreateInfoNV* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkOpticalFlowSessionNV* pSession);
-
device
是创建光流会话对象的逻辑设备。 -
pCreateInfo
是一个指向 VkOpticalFlowSessionCreateInfoNV 结构的指针,该结构包含指定光流会话创建的参数。 -
pAllocator
控制主机内存分配,如内存分配章节中所述。 -
pSession
是一个指向 VkOpticalFlowSessionNV 句柄的指针,该句柄指定当此函数返回VK_SUCCESS
时将创建的光流会话对象。
VkOpticalFlowSessionCreateInfoNV 结构定义如下:
// Provided by VK_NV_optical_flow
typedef struct VkOpticalFlowSessionCreateInfoNV {
VkStructureType sType;
void* pNext;
uint32_t width;
uint32_t height;
VkFormat imageFormat;
VkFormat flowVectorFormat;
VkFormat costFormat;
VkOpticalFlowGridSizeFlagsNV outputGridSize;
VkOpticalFlowGridSizeFlagsNV hintGridSize;
VkOpticalFlowPerformanceLevelNV performanceLevel;
VkOpticalFlowSessionCreateFlagsNV flags;
} VkOpticalFlowSessionCreateInfoNV;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
width
是要绑定到此光流会话的输入或参考帧的宽度(以像素为单位)。 -
height
是要绑定到此光流会话的输入或参考帧的高度(以像素为单位)。 -
imageFormat
是要绑定到此光流会话的输入和参考帧的 VkFormat。 -
flowVectorFormat
是要绑定到此光流会话的流矢量图(输出或提示)的 VkFormat。 -
costFormat
是要绑定到此光流会话的成本图的 VkFormat。 -
outputGridSize
是 VkOpticalFlowGridSizeFlagsNV 的一个位,指定要绑定到此光流会话的输出流和成本图的网格大小。输出流和成本图的大小由VkOpticalFlowSessionCreateInfoNV
::width
和VkOpticalFlowSessionCreateInfoNV
::height
除以VkOpticalFlowSessionCreateInfoNV
::outputGridSize
确定。 -
hintGridSize
是 VkOpticalFlowGridSizeFlagsNV 的一个位,指定要绑定到此光流会话的提示流矢量图的网格大小。提示图的大小由VkOpticalFlowSessionCreateInfoNV
::width
和VkOpticalFlowSessionCreateInfoNV
::height
除以VkOpticalFlowSessionCreateInfoNV
::hintGridSize
确定。 -
performanceLevel
是用于此光流会话的 VkOpticalFlowPerformanceLevelNV。 -
flags
是用于此光流会话的 VkOpticalFlowSessionCreateFlagsNV。
VkOpticalFlowSessionCreatePrivateDataInfoNV 结构仅供 NV 内部使用,其定义如下:
// Provided by VK_NV_optical_flow
typedef struct VkOpticalFlowSessionCreatePrivateDataInfoNV {
VkStructureType sType;
void* pNext;
uint32_t id;
uint32_t size;
const void* pPrivateData;
} VkOpticalFlowSessionCreatePrivateDataInfoNV;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
id
是数据的标识符,该数据在VkOpticalFlowSessionCreatePrivateDataInfoNV
::pPrivateData
中指定的内存位置传递。 -
size
是在VkOpticalFlowSessionCreatePrivateDataInfoNV
::pPrivateData
中指定的内存位置传递的数据的大小(以字节为单位)。 -
pPrivateData
是指向 NV 内部数据的指针。
光流向量是按块生成的,每个 NxN 像素块(称为网格)有一个向量。
可以在 VkOpticalFlowSessionCreateInfoNV::outputGridSize
和 VkOpticalFlowSessionCreateInfoNV::hintGridSize
中设置,或者在 VkPhysicalDeviceOpticalFlowPropertiesNV::supportedOutputGridSizes
和 VkPhysicalDeviceOpticalFlowPropertiesNV::supportedHintGridSizes
中返回的用于控制光流网格大小的位是:
// Provided by VK_NV_optical_flow
typedef enum VkOpticalFlowGridSizeFlagBitsNV {
VK_OPTICAL_FLOW_GRID_SIZE_UNKNOWN_NV = 0,
VK_OPTICAL_FLOW_GRID_SIZE_1X1_BIT_NV = 0x00000001,
VK_OPTICAL_FLOW_GRID_SIZE_2X2_BIT_NV = 0x00000002,
VK_OPTICAL_FLOW_GRID_SIZE_4X4_BIT_NV = 0x00000004,
VK_OPTICAL_FLOW_GRID_SIZE_8X8_BIT_NV = 0x00000008,
} VkOpticalFlowGridSizeFlagBitsNV;
-
VK_OPTICAL_FLOW_GRID_SIZE_1X1_BIT_NV
指定网格为 1x1 像素。 -
VK_OPTICAL_FLOW_GRID_SIZE_2X2_BIT_NV
指定网格为 2x2 像素。 -
VK_OPTICAL_FLOW_GRID_SIZE_4X4_BIT_NV
指定网格为 4x4 像素。 -
VK_OPTICAL_FLOW_GRID_SIZE_8X8_BIT_NV
指定网格为 8x8 像素。
// Provided by VK_NV_optical_flow
typedef VkFlags VkOpticalFlowGridSizeFlagsNV;
VkOpticalFlowGridSizeFlagsNV
是用于设置零个或多个 VkOpticalFlowGridSizeFlagBitsNV 的掩码的位掩码类型。
光流公开了应用程序可以根据所需的性能和质量要求选择的性能级别。
光流性能级别类型定义如下:
// Provided by VK_NV_optical_flow
typedef enum VkOpticalFlowPerformanceLevelNV {
VK_OPTICAL_FLOW_PERFORMANCE_LEVEL_UNKNOWN_NV = 0,
VK_OPTICAL_FLOW_PERFORMANCE_LEVEL_SLOW_NV = 1,
VK_OPTICAL_FLOW_PERFORMANCE_LEVEL_MEDIUM_NV = 2,
VK_OPTICAL_FLOW_PERFORMANCE_LEVEL_FAST_NV = 3,
} VkOpticalFlowPerformanceLevelNV;
-
VK_OPTICAL_FLOW_PERFORMANCE_LEVEL_SLOW_NV
是性能较慢但质量较高的级别。 -
VK_OPTICAL_FLOW_PERFORMANCE_LEVEL_MEDIUM_NV
是具有中等性能和中等质量的级别。 -
VK_OPTICAL_FLOW_PERFORMANCE_LEVEL_FAST_NV
是一个预设值,它具有更高的性能,但质量较低。
在 VkOpticalFlowSessionCreateInfoNV::flags
中可以设置的位,用于控制光流会话操作,包括:
// Provided by VK_NV_optical_flow
typedef enum VkOpticalFlowSessionCreateFlagBitsNV {
VK_OPTICAL_FLOW_SESSION_CREATE_ENABLE_HINT_BIT_NV = 0x00000001,
VK_OPTICAL_FLOW_SESSION_CREATE_ENABLE_COST_BIT_NV = 0x00000002,
VK_OPTICAL_FLOW_SESSION_CREATE_ENABLE_GLOBAL_FLOW_BIT_NV = 0x00000004,
VK_OPTICAL_FLOW_SESSION_CREATE_ALLOW_REGIONS_BIT_NV = 0x00000008,
VK_OPTICAL_FLOW_SESSION_CREATE_BOTH_DIRECTIONS_BIT_NV = 0x00000010,
} VkOpticalFlowSessionCreateFlagBitsNV;
-
VK_OPTICAL_FLOW_SESSION_CREATE_ENABLE_HINT_BIT_NV
指定将使用带有外部流向量的 VkImageView 作为运动搜索的提示,并且必须绑定到VK_OPTICAL_FLOW_SESSION_BINDING_POINT_HINT_NV
。 -
VK_OPTICAL_FLOW_SESSION_CREATE_ENABLE_COST_BIT_NV
指定前向流的代价将在一个 VkImageView 中生成,该视图必须绑定到VK_OPTICAL_FLOW_SESSION_BINDING_POINT_COST_NV
。此外,如果还设置了VK_OPTICAL_FLOW_SESSION_CREATE_BOTH_DIRECTIONS_BIT_NV
,则反向流的代价将在一个 VkImageView 中生成,该视图必须绑定到VK_OPTICAL_FLOW_SESSION_BINDING_POINT_BACKWARD_COST_NV
。代价是帧中每个网格的流向量的置信度。代价表示流向量的(不)准确程度。较高的代价值表示流向量不太准确,反之亦然。 -
VK_OPTICAL_FLOW_SESSION_CREATE_ENABLE_GLOBAL_FLOW_BIT_NV
指定全局流向量将从前向流中估计,并在单个像素的 VkImageView 中输出,该视图必须绑定到VK_OPTICAL_FLOW_SESSION_BINDING_POINT_GLOBAL_FLOW_NV
。 -
VK_OPTICAL_FLOW_SESSION_CREATE_ALLOW_REGIONS_BIT_NV
指定可以在 VkOpticalFlowExecuteInfoNV 中指定感兴趣的区域。 -
VK_OPTICAL_FLOW_SESSION_CREATE_BOTH_DIRECTIONS_BIT_NV
指定除了始终生成的前向流之外,还会生成反向流。
VkOpticalFlowSessionCreateFlagsNV
是一个位掩码类型,用于设置零个或多个 VkOpticalFlowSessionCreateFlagBitsNV 的掩码。
// Provided by VK_NV_optical_flow
typedef VkFlags VkOpticalFlowSessionCreateFlagsNV;
销毁光流会话
要销毁光流会话对象,请调用
// Provided by VK_NV_optical_flow
void vkDestroyOpticalFlowSessionNV(
VkDevice device,
VkOpticalFlowSessionNV session,
const VkAllocationCallbacks* pAllocator);
-
device
是用于创建光流会话的设备。 -
session
是要销毁的光流会话。 -
pAllocator
控制主机内存分配,如内存分配章节中所述。
将 Vulkan 图像视图绑定到光流会话
要将 Vulkan 图像绑定到光流会话对象,请调用
// Provided by VK_NV_optical_flow
VkResult vkBindOpticalFlowSessionImageNV(
VkDevice device,
VkOpticalFlowSessionNV session,
VkOpticalFlowSessionBindingPointNV bindingPoint,
VkImageView view,
VkImageLayout layout);
-
device
是拥有光流会话对象session
的设备。 -
session
是要绑定图像视图的光流会话对象。 -
bindingPoint
指定要绑定图像视图的绑定点 VkOpticalFlowSessionBindingPointNV。 -
view
是要绑定的 VkImageView。 -
layout
必须指定在 vkCmdOpticalFlowExecuteNV 在VkDevice
上计算光流向量时,从view
可访问的图像子资源的布局。
光流会话绑定点定义如下:
// Provided by VK_NV_optical_flow
typedef enum VkOpticalFlowSessionBindingPointNV {
VK_OPTICAL_FLOW_SESSION_BINDING_POINT_UNKNOWN_NV = 0,
VK_OPTICAL_FLOW_SESSION_BINDING_POINT_INPUT_NV = 1,
VK_OPTICAL_FLOW_SESSION_BINDING_POINT_REFERENCE_NV = 2,
VK_OPTICAL_FLOW_SESSION_BINDING_POINT_HINT_NV = 3,
VK_OPTICAL_FLOW_SESSION_BINDING_POINT_FLOW_VECTOR_NV = 4,
VK_OPTICAL_FLOW_SESSION_BINDING_POINT_BACKWARD_FLOW_VECTOR_NV = 5,
VK_OPTICAL_FLOW_SESSION_BINDING_POINT_COST_NV = 6,
VK_OPTICAL_FLOW_SESSION_BINDING_POINT_BACKWARD_COST_NV = 7,
VK_OPTICAL_FLOW_SESSION_BINDING_POINT_GLOBAL_FLOW_NV = 8,
} VkOpticalFlowSessionBindingPointNV;
-
VK_OPTICAL_FLOW_SESSION_BINDING_POINT_INPUT_NV
指定输入帧的绑定点。 -
VK_OPTICAL_FLOW_SESSION_BINDING_POINT_REFERENCE_NV
指定输入参考帧的绑定点。 -
VK_OPTICAL_FLOW_SESSION_BINDING_POINT_HINT_NV
指定可选的外部提示流向量的绑定点。 -
VK_OPTICAL_FLOW_SESSION_BINDING_POINT_FLOW_VECTOR_NV
指定默认前向流计算的输出流向量的绑定点。 -
VK_OPTICAL_FLOW_SESSION_BINDING_POINT_BACKWARD_FLOW_VECTOR_NV
指定可选的反向流计算的可选输出流向量图的绑定点。 -
VK_OPTICAL_FLOW_SESSION_BINDING_POINT_COST_NV
指定默认前向流计算的可选输出代价图的绑定点。 -
VK_OPTICAL_FLOW_SESSION_BINDING_POINT_BACKWARD_COST_NV
指定可选的反向流计算的可选输出代价图的绑定点。 -
VK_OPTICAL_FLOW_SESSION_BINDING_POINT_GLOBAL_FLOW_NV
指定默认前向流计算的可选全局流值的绑定点。
光流执行
流估计的默认方向是前向,它计算从输入帧到参考帧的光流。可选地,还可以额外计算反向流估计。输出流向量 (Vx, Vy) 表示输入帧的当前像素 (x, y) 可以在参考帧中的位置 (x+Vx, y+Vy) 找到。反向流向量 (Vx, Vy) 表示参考帧的当前像素 (x, y) 可以在输入帧中的位置 (x+Vx, y+Vy) 找到。
要从两个输入帧计算光流向量,请调用
// Provided by VK_NV_optical_flow
void vkCmdOpticalFlowExecuteNV(
VkCommandBuffer commandBuffer,
VkOpticalFlowSessionNV session,
const VkOpticalFlowExecuteInfoNV* pExecuteInfo);
-
commandBuffer
是将要记录命令的命令缓冲区。 -
session
是此命令在其上操作的光流会话对象。 -
pExecuteInfo
Info 是指向 VkOpticalFlowExecuteInfoNV 的指针。
VkOpticalFlowExecuteInfoNV 结构定义如下
// Provided by VK_NV_optical_flow
typedef struct VkOpticalFlowExecuteInfoNV {
VkStructureType sType;
void* pNext;
VkOpticalFlowExecuteFlagsNV flags;
uint32_t regionCount;
const VkRect2D* pRegions;
} VkOpticalFlowExecuteInfoNV;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
为NULL
或指向扩展此结构的结构的指针。 -
flags
是用于此命令的 VkOpticalFlowExecuteFlagsNV。 -
regionCount
是在pRegions
中指定的感兴趣区域的数量。 -
pRegions
是指向regionCount
个VkRect2D
感兴趣区域的指针。
在 VkOpticalFlowExecuteInfoNV::flags
中可以设置的位,用于控制光流执行,有
// Provided by VK_NV_optical_flow
typedef enum VkOpticalFlowExecuteFlagBitsNV {
VK_OPTICAL_FLOW_EXECUTE_DISABLE_TEMPORAL_HINTS_BIT_NV = 0x00000001,
} VkOpticalFlowExecuteFlagBitsNV;
-
VK_OPTICAL_FLOW_EXECUTE_DISABLE_TEMPORAL_HINTS_BIT_NV
指定不使用先前生成的流向量的时间提示。 如果启用时间提示,则来自先前 vkCmdOpticalFlowExecuteNV 调用的光流向量将自动用作当前 vkCmdOpticalFlowExecuteNV 调用的提示,以利用视频序列中的时间相关性。 如果事先知道没有时间相关性(例如,场景变化、独立的连续帧对),则应禁用时间提示。
VkOpticalFlowExecuteFlagsNV
是一种位掩码类型,用于设置零个或多个 VkOpticalFlowExecuteFlagBitsNV 的掩码。
// Provided by VK_NV_optical_flow
typedef VkFlags VkOpticalFlowExecuteFlagsNV;