GPU 上的 OpenCV MatchTemplate
Posted
技术标签:
【中文标题】GPU 上的 OpenCV MatchTemplate【英文标题】:OpenCV MatchTemplate on GPU 【发布时间】:2015-06-19 13:50:31 【问题描述】:在我的 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】:我之前尝试过将 OpenCV 的 matchTemplate()
函数移植到 GPU 上。
他们实际上给出了their documentation for the method 中的方程式。这称为“标准化互相关”。
天真的方法是将其简单地移植到 GPU(我将其作为像素着色器进行)。结果证明它比 OpenCV 的 CPU 方法慢。为什么?他们实际上使用了一种称为“快速归一化互相关”的方法,正如 ILM 的 J.P Lewis 在this paper 中所述。
诀窍是在频域中进行相关并利用convolution theorem:频域中的逐点乘法相当于空间域中的卷积。对我们来说,这意味着时间复杂度大大降低,我们只需要添加一个 FFT。
【讨论】:
以上是关于GPU 上的 OpenCV MatchTemplate的主要内容,如果未能解决你的问题,请参考以下文章
Ubuntu16.04 安装配置 Caffe 过程 (GPU版+CUDA 9.0+cuDNN 9.0+OpenCV 3.4.1)