2015-06-19 7 views
1

В моем проекте C# мне нужен быстрый алгоритм сопоставления шаблонов. Теперь у меня есть реализация OpenCV. Упрощенный код:OpenCV MatchTemplate на GPU

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. Это называется «нормализованная взаимная корреляция».

enter image description here

Наивный подход просто порт, что в ГПУ (я сделал это в качестве пиксельных шейдеров). Это оказалось медленнее, чем метод CPU OpenCV. Зачем? Они на самом деле используют метод, называемый «быстрая нормализованная кросс-корреляция», как указано в this paper J.P Lewis от ILM.

Трюк состоит в том, чтобы выполнять корреляцию в частотной области и использовать convolution theorem: точечное умножение в частотной области эквивалентно свертке в пространственной области. Для нас это означает, что временная сложность значительно сокращается, и все, что мы должны добавить, это БПФ.

Смежные вопросы