GPU上的OpenCV MatchTemplate

时间:2015-06-19 13:50:31

标签: c# opencv image-processing opencvsharp

在我的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上的示例已被注释掉,似乎无法正常工作。

1 个答案:

答案 0 :(得分:1)

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

他们实际上在their documentation for the method中给出方程式。这称为“规范化互相关。”

enter image description here

天真的方法是简单地将其移植到GPU(我将其作为像素着色器)。结果比OpenCV的CPU方法慢。为什么?他们实际上正在使用一种名为“快速归一化互相关”的方法,如{IL-05}中来自ILM的this paper所述。

技巧是在频域中进行相关并利用convolution theorem:频域中的逐点乘法等效于空间域中的卷积。对我们而言,这意味着时间复杂度大大降低,我们必须添加的是FFT。