2

在我的 C# 项目中,我需要快速的模板匹配算法。我现在拥有的是 OpenCV 实现。简化的代码是:

 using OpenCvSharp;
 using OpenCvSharp.CPlusPlus;
 // ...

 var image = new Mat("Image.png");
 var template = new Mat("Template.png");

 double minVal, maxVal;
 Point minLoc, maxLoc;
 var result = image.MatchTemplate(template, MatchTemplateMethod.CCoeffNormed);
 result.MinMaxLoc(out minVal, out maxVal, out minLoc, out maxLoc);
 Console.WriteLine("maxLoc: {0}, maxVal: {1}", maxLoc, maxVal);

我想在 GPU 上进行相同的计算以显着加快它们的速度,但找不到如何做到这一点的示例。github上的示例已被注释掉,似乎不起作用。

4

1 回答 1

1

我之前尝试过将 OpenCV 的matchTemplate()功能移植到 GPU 上。

他们实际上在他们的文档中给出了该方法的方程式。这称为“归一化互相关”。

在此处输入图像描述

天真的方法是将其简单地移植到 GPU(我将其作为像素着色器进行)。结果证明它比 OpenCV 的 CPU 方法慢。为什么?他们实际上使用了一种称为“快速归一化互相关”的方法,正如ILM 的 JP Lewis在本文中概述的那样。

诀窍是在频域中进行相关并利用卷积定理:频域中的逐点乘法等效于空间域中的卷积。对我们来说,这意味着时间复杂度大大降低,我们只需要添加一个 FFT。

于 2015-06-19T14:45:58.493 回答