VPI - 视觉编程接口

3.2 版本

模板匹配

概述

模板匹配是一种在较大图像中查找模板图像最佳匹配位置的方法。我们使用归一化互相关来计算最佳匹配。

以下示例展示了左侧的源图像和中间的模板图像。右侧显示的是输出图像的匹配得分。

输入模板输出得分转换为 U8

实现

该算法计算源图像内模板每个可能位置的归一化互相关(得分)。得分最高的位置被选为源图像和模板图像之间最佳匹配的位置。

互相关计算如下

\begin{align*} R(x, y) &= \frac { \sum_{x\prime, y\prime}( (T(x\prime, y\prime) - I(x+x\prime, y+y\prime)) \cdot M(x\prime, y\prime))^2 } { \sqrt{ \sum_{x\prime, y\prime} (T(x\prime, y\prime) \cdot M(x\prime, y\prime))^2 \cdot \sum_{x\prime, y\prime} (I(x+x\prime, y+y\prime) \cdot M(x\prime, y\prime))^2} } \end{align*}

其中
\(T(x\prime, y\prime)\) 指的是模板图像。
\(I(x+x\prime, y+y\prime)\) 指的是源图像。
\(M(x\prime, y\prime)\) 指的是掩码。
\(x\prime\) 和 \(y\prime\) 是模板图像内的像素坐标。

如果源图像的分辨率为 W \(\times\) H,模板图像为 w \(\times\) h,则输出图像的分辨率为 (W - w + 1) \(\times\) (H - h + 1)。如果模板大小超过 400 像素,卷积将在傅里叶空间中计算,否则在原始空间中计算。

C API 函数

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

函数描述
vpiCreateTemplateMatching vpiSubmitTemplateMatching 创建负载。
vpiTemplateMatchingSetSourceImage 设置源图像。
vpiTemplateMatchingSetTemplateImage 设置模板图像。
vpiSubmitTemplateMatching 使用提供的模板运行模板匹配算法。
注意
此算法需要系统中安装以下库
  • libnppc.so.11
  • libnppial.so.11
  • libnppidei.so.11
  • libnppist.so.11

用法

语言
  1. 导入 VPI 模块
    import vpi
  2. 使用 CUDA 后端在输入图像中匹配模板图像。它使用归一化互相关。
    with vpi.Backend.CUDA
    output = vpi.templateMatching(input, templ)
  1. 初始化阶段
    1. 包含定义模板匹配函数的头文件。
      声明实现模板匹配算法的函数。
    2. 定义输入图像对象。
      VPIImage input = /*...*/;
      struct VPIImageImpl * VPIImage
      图像句柄。
      Definition: Types.h:256
    3. 定义模板图像对象。
      VPIImage templ = /*...*/;
    4. 创建具有所需大小和格式的输出图像。
      int32_t srcW, srcH;
      vpiImageGetSize(input, &srcW, &srcH);
      int32_t templW, templH;
      vpiImageGetSize(templ, &templW, &templH);
      VPIImage output;
      vpiImageCreate(srcW - templW + 1, srcH - templH + 1, VPI_IMAGE_FORMAT_F32, 0, &output);
      #define VPI_IMAGE_FORMAT_F32
      具有一个 32 位浮点通道的单平面。
      Definition: ImageFormat.h:136
      VPIStatus vpiImageCreate(int32_t width, int32_t height, VPIImageFormat fmt, uint64_t flags, VPIImage *img)
      创建具有指定标志的空图像实例。
      VPIStatus vpiImageGetSize(VPIImage img, int32_t *width, int32_t *height)
      以像素为单位获取图像尺寸。
    5. 创建流,算法将提交到该流中执行。
      VPIStream stream;
      vpiStreamCreate(0, &stream);
      struct VPIStreamImpl * VPIStream
      流的句柄。
      Definition: Types.h:250
      VPIStatus vpiStreamCreate(uint64_t flags, VPIStream *stream)
      创建流实例。
    6. 创建负载,其中包含处理所需的所有临时缓冲区。它将在 CUDA 后端上创建。
      VPIPayload payload;
      struct VPIPayloadImpl * VPIPayload
      算法负载的句柄。
      Definition: Types.h:268
      @ VPI_BACKEND_CUDA
      CUDA 后端。
      Definition: Types.h:93
      VPIStatus vpiCreateTemplateMatching(uint64_t backends, int32_t imageWidth, int32_t imageHeight, VPIPayload *payload)
      为 vpiSubmitTemplateMatching 创建负载。
  2. 处理阶段
    1. 设置输入图像。
      VPIStatus vpiTemplateMatchingSetSourceImage(VPIStream stream, uint64_t backend, VPIPayload payload, VPIImage srcImage)
      设置源图像。
    2. 设置模板图像。
      vpiTemplateMatchingSetTemplateImage(stream, VPI_BACKEND_CUDA, payload, templ, NULL);
      VPIStatus vpiTemplateMatchingSetTemplateImage(VPIStream stream, uint64_t backend, VPIPayload payload, VPIImage templImage, VPIImage mask)
      设置模板图像。
    3. 将算法与所有参数一起提交到流。它将由 CUDA 算法执行。
      VPIStatus vpiSubmitTemplateMatching(VPIStream stream, uint64_t backend, VPIPayload payload, VPIImage output, VPITemplateMatchingMethod method)
      使用提供的模板运行模板匹配算法。
      @ VPI_TEMPLATE_MATCHING_NCC
      归一化互相关。
    4. 可选地,等待直到处理完成。
      vpiStreamSync(stream);
      VPIStatus vpiStreamSync(VPIStream stream)
      阻塞调用线程,直到此流队列中的所有已提交命令完成(队列为空)。
  3. 清理阶段
    1. 释放流以及输入和输出图像持有的资源。
      vpiImageDestroy(output);
      void vpiImageDestroy(VPIImage img)
      销毁图像实例。
      void vpiStreamDestroy(VPIStream stream)
      销毁流实例并释放所有硬件资源。

有关完整示例,请参阅 模板匹配

有关更多信息,请参阅 VPI - 视觉编程接口 的 “C API 参考” 部分中的 模板匹配算法

性能

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

 - 

参考

  1. Briechle, K., & Hanebeck, U. D. (2001, March). Template matching using fast normalized cross correlation. In Optical Pattern Recognition XII (Vol. 4387, pp. 95-102). SPIE.
  2. Chen, C. S., Huang, C. L., Yeh, C. W., & Chang, W. C. (2016). An accelerating CPU based correlation-based image alignment for real-time automatic optical inspection. Computers & Electrical Engineering, 49, 207-220.