методы CV_TM_CCOEFF и CV_TM_CCOEFF_NORMED в OpenCV

284
01 ноября 2017, 03:36

Хочу реализовать аналогичную функцию matchTemplate, которая есть в openCV. Данная функция принимает на вход тип метода, который определяет меру схожести двух изображений. Методы CV_TM_SQDIFF, CV_TM_SQDIFF_NORMED, CV_TM_CCORR, CV_TM_CCORR_NORMED реализовала с помощью БПФ, используя библиотеку fftw.

Но как реализовать методы CV_TM_CCOEFF и CV_TM_CCOEFF_NORMED ума не приложу. При вычислении значения функции R(x, y) мы должны постоянно из значений изображения и шаблона вычитать среднее значения, полученное по размерам шаблона. Но как это сделать с помощью БПФ, если, грубо говоря, в частотной области мы просто перемножаем значения изображения и шаблона (плюс, минус аналогичные действия в зависимости от типа метода сравнения).

Чтобы было более понятен мой вопрос, думаю, стоит привести простой код: В пространственной области у меня метод, например, CV_TM_CCOEFF, выглядел бы так:

for(int j = 0; j < H-h; ++j){
   for(int i = 0; i < W-w; ++i){
       double avarageImage = 0, avarageTemplate = 0;
       for(int y = j; y < j+h; ++y){
           for(int x = i; x < i+w; ++x){
               avarageImage  += Image[x, y];
               avarageTemplate  += Template[x-i, y-j];
           }
       }
       avarageImage /= (w*h);
       avarageTemplate  /= (w*h);
       double s = 0;
       for(int y = j; y < j+h; ++y){
           for(int x = i; x < i+w; ++x){
               s += (Image[x, y]-avarageImage)*(Template[x-i, y-j]-avarageTemplate);
           }
       }
       // Ищем максимальное значение s и запоминаем i, j - это и будет у нас положение шаблона в изображении
     }
}

В частотной области, грубо говоря, у нас остается только два внешних цикла, а два внутренних заменяется умножением Image на сопряженное Template. И тогда как быть с усреднением?

READ ALSO
QTableView обработка выделения строк

QTableView обработка выделения строк

Совсем запутался с обработкой выделения строк в QTableView

316
Наличие или отсутствие точки с запятой в теле функции

Наличие или отсутствие точки с запятой в теле функции

При определении функции с пустым телом, как правильнее написать её код и зависит ли от этого "логика" самой функции? Если разницы нет, то есть...

252
Шаблоны переменных в C++14

Шаблоны переменных в C++14

Изучая новый стандарт C++, натолкнулся на нововведение «шаблоны переменных»

233
класс property в c++ [требует правки]

класс property в c++ [требует правки]

для чего используеться класс property в c++?

215