VPI - 视觉编程接口

3.2 版本

暴力匹配器

概述

暴力匹配器算法使用作为输入提供的查询和参考描述符,并为每个查询描述符找到最近的(按距离)参考描述符。还提供了一个额外的交叉检查选项,该选项通知算法仅输出那些在两个方向上彼此最接近的匹配项,即如果 A 是一个查询描述符,B 是一个参考描述符,则 B 是 A 的最近参考描述符,A 是 B 的最近查询描述符。

实现

暴力匹配器算法计算作为输入提供的查询和参考描述符之间的距离。距离计算的范数由用户提供。用户还可以选择每个查询描述符所需的匹配数量,在这种情况下,将提供最小的 N 个(每个查询的匹配数量 <= 3)距离匹配。用户还可以选择启用或禁用交叉检查。

C API 函数

有关实现该算法的限制、约束和后端列表,请查阅以下函数的参考文档

函数描述
vpiSubmitBruteForceMatcher 在描述符上运行暴力匹配器算法。

用法

语言
  1. 初始化阶段
    1. 包含定义所需函数和结构的头文件。
      声明实现暴力匹配器算法的函数。
    2. 定义输入描述符数组。它们必须是 VPI_ARRAY_TYPE_BRIEF_DESCRIPTOR 类型。
      VPIArray queryDescriptors;
      vpiArrayCreate(numDescriptors, VPI_ARRAY_TYPE_BRIEF_DESCRIPTOR, 0, &queryDescriptors);
      VPIArray referenceDescriptors;
      vpiArrayCreate(numDescriptors, VPI_ARRAY_TYPE_BRIEF_DESCRIPTOR, 0, &referenceDescriptors);
      VPIStatus vpiArrayCreate(int32_t capacity, VPIArrayType type, uint64_t flags, VPIArray *array)
      创建一个空数组实例。
      struct VPIArrayImpl * VPIArray
      数组的句柄。
      Definition: Types.h:232
      @ VPI_ARRAY_TYPE_BRIEF_DESCRIPTOR
      VPIBriefDescriptor 元素。
      Definition: ArrayType.h:84
    3. 创建输出数组。它必须是 VPI_ARRAY_TYPE_MATCHES 类型。
      VPIArray output;
      vpiArrayCreate(numDescriptors, VPI_ARRAY_TYPE_MATCHES, 0, &output);
      @ VPI_ARRAY_TYPE_MATCHES
      VPIMatches 元素。
      Definition: ArrayType.h:85
    4. 创建将在其中提交算法以供执行的流。
      VPIStream stream;
      vpiStreamCreate(0, &stream);
      struct VPIStreamImpl * VPIStream
      流的句柄。
      Definition: Types.h:250
      VPIStatus vpiStreamCreate(uint64_t flags, VPIStream *stream)
      创建流实例。
  2. 处理阶段
    1. 提交暴力匹配器算法。它将由 CPU 后端执行。
      VPI_CHECK_STATUS(vpiSubmitBruteForceMatcher(stream, VPI_BACKEND_CPU, queryDescriptors, referenceDescriptors,
      VPI_NORM_HAMMING, maxMatchesPerQuery, output, flags));
      @ VPI_NORM_HAMMING
      汉明范数。
      Definition: Types.h:735
      VPIStatus vpiSubmitBruteForceMatcher(VPIStream stream, uint64_t backend, VPIArray queryDescriptor, VPIArray referenceDescriptor, VPINormType normType, int32_t maxMatchesPerQuery, VPIArray matches, uint32_t algoFlag)
      在描述符上运行暴力匹配器算法。
      @ VPI_BACKEND_CPU
      CPU 后端。
      Definition: Types.h:92
    2. 可选地,等待直到处理完成。
      vpiStreamSync(stream);
      VPIStatus vpiStreamSync(VPIStream stream)
      阻止调用线程,直到此流队列中的所有提交命令都完成(队列为空)...
  3. 清理阶段
    1. 释放流以及输入和输出数组所持有的资源。
      vpiArrayDestroy(queryDescriptors);
      vpiArrayDestroy(referenceDescriptors);
      vpiArrayDestroy(output);
      void vpiArrayDestroy(VPIArray array)
      销毁一个数组实例。
      void vpiStreamDestroy(VPIStream stream)
      销毁流实例并释放所有硬件资源。

有关更多信息,请参阅 VPI - 视觉编程接口 的 “API 参考” 部分中的 Brute Force Matcher

性能

有关如何使用下面的性能表的信息,请参阅 算法性能表
在比较测量结果之前,请查阅 比较算法运行时间
有关性能基准测试方式的更多信息,请参阅 性能基准

 -