概述
模板匹配是一种在较大图像中查找模板图像最佳匹配位置的方法。我们使用归一化互相关来计算最佳匹配。
以下示例展示了左侧的源图像和中间的模板图像。右侧显示的是输出图像的匹配得分。
实现
该算法计算源图像内模板每个可能位置的归一化互相关(得分)。得分最高的位置被选为源图像和模板图像之间最佳匹配的位置。
互相关计算如下
\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 函数
有关实现该算法的限制、约束和后端的列表,请查阅以下函数的参考文档
注意 此算法需要系统中安装以下库
libnppc.so.11
libnppial.so.11
libnppidei.so.11
libnppist.so.11
用法
语言
C/C++
Python
导入 VPI 模块
使用 CUDA 后端在输入图像中匹配模板图像。它使用归一化互相关。with vpi.Backend.CUDA
output = vpi.templateMatching(input, templ)
初始化阶段
包含定义模板匹配函数的头文件。
定义输入图像对象。
struct VPIImageImpl * VPIImage
图像句柄。
定义模板图像对象。
创建具有所需大小和格式的输出图像。int32_t srcW, srcH;
int32_t templW, templH;
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)
以像素为单位获取图像尺寸。
创建流,算法将提交到该流中执行。
struct VPIStreamImpl * VPIStream
流的句柄。
VPIStatus vpiStreamCreate(uint64_t flags, VPIStream *stream)
创建流实例。
创建负载,其中包含处理所需的所有临时缓冲区。它将在 CUDA 后端上创建。
struct VPIPayloadImpl * VPIPayload
算法负载的句柄。
@ VPI_BACKEND_CUDA
CUDA 后端。
VPIStatus vpiCreateTemplateMatching(uint64_t backends, int32_t imageWidth, int32_t imageHeight, VPIPayload *payload)
为 vpiSubmitTemplateMatching 创建负载。
处理阶段
设置输入图像。
VPIStatus vpiTemplateMatchingSetSourceImage(VPIStream stream, uint64_t backend, VPIPayload payload, VPIImage srcImage)
设置源图像。
设置模板图像。
VPIStatus vpiTemplateMatchingSetTemplateImage(VPIStream stream, uint64_t backend, VPIPayload payload, VPIImage templImage, VPIImage mask)
设置模板图像。
将算法与所有参数一起提交到流。它将由 CUDA 算法执行。
VPIStatus vpiSubmitTemplateMatching(VPIStream stream, uint64_t backend, VPIPayload payload, VPIImage output, VPITemplateMatchingMethod method)
使用提供的模板运行模板匹配算法。
@ VPI_TEMPLATE_MATCHING_NCC
归一化互相关。
可选地,等待直到处理完成。
VPIStatus vpiStreamSync(VPIStream stream)
阻塞调用线程,直到此流队列中的所有已提交命令完成(队列为空)。
清理阶段
释放流以及输入和输出图像持有的资源。
void vpiImageDestroy(VPIImage img)
销毁图像实例。
void vpiStreamDestroy(VPIStream stream)
销毁流实例并释放所有硬件资源。
有关完整示例,请参阅 模板匹配 。
有关更多信息,请参阅 VPI - 视觉编程接口 的 “C API 参考” 部分中的 模板匹配算法 。
性能
有关如何使用下面的性能表的信息,请参阅 算法性能表 。 在比较测量结果之前,请查阅 比较算法运行时间 。 有关性能基准测试方式的更多信息,请参阅 性能基准 。
清除过滤器
设备
Jetson AGX Orin
- 流
1
2
4
8
参考
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.
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.