Фазовая корреляция для сопоставления с шаблоном - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь реализовать сопоставление шаблонов с использованием фазовой корреляции.Я уже сделал это в пространственной области. Вы можете увидеть здесь

Мой шаблон изображения imagePart и изображение, на котором я нахожу его imageBig.

Теперь я пытаюсь использовать его с помощью DFTувеличить скорость.Я следую этим шагам в соответствии с предложением Криса Луенго

  1. Дополните шаблон (плавающее изображение) размером другого изображения
    (с нулями).
  2. Вычислите БПФ обоих.

  3. Переверните знак мнимого компонента одного из результатов (комплексное сопряжение).

  4. Умножьте два.

  5. Вычислить IFFT результата.

  6. Найти местоположение пикселя с наибольшим значением.

Мой код:

int r_big,c_big,r_part,c_part;
Mat imagePart_pad,imageBig_padded, imagePart_padded, mul_output;
int m,n;
Mat complexI_big, complexI_part;
void corr_frq()
{

  r_big=imageBig.rows;
  c_big= imageBig.cols;

  r_part=imagePart.rows;
  c_part=imagePart.cols;

  //Pad template to match size of big image.
  copyMakeBorder(imagePart,imagePart_pad,0,(r_big-r_part),0,(c_big-c_part),BORDER_CONSTANT,Scalar(0));

  m = getOptimalDFTSize( imageBig.rows );
  n = getOptimalDFTSize( imageBig.cols );

  copyMakeBorder(imageBig, imageBig_padded, 0, m - imageBig.rows, 0, n - imageBig.cols, BORDER_CONSTANT, Scalar::all(0));
  copyMakeBorder(imagePart_pad, imagePart_padded, 0, m - imageBig.rows, 0, n - imageBig.cols, BORDER_CONSTANT, Scalar::all(0));

   Mat planes[] = {Mat_<float>(imageBig_padded), Mat::zeros(imageBig_padded.size(), CV_32F)};
   Mat planes2[] = {Mat_<float>(imagePart_padded), Mat::zeros(imagePart_padded.size(), CV_32F)};



   merge(planes, 2, complexI_big);
   merge(planes2, 2, complexI_part);


  dft(complexI_big,complexI_big);
  dft(complexI_part,complexI_part);

   mulSpectrums(complexI_big, complexI_part, mul_output, 0, true );



   cv::Mat inverseTransform;
   cv::dft(mul_output, inverseTransform, cv::DFT_INVERSE|cv::DFT_REAL_OUTPUT);
   normalize(inverseTransform, inverseTransform, 0, 1, CV_MINMAX);
   imshow("Reconstructed", inverseTransform);
   waitKey(0);

  imshow("image part pad",imagePart_pad);

 // waitKey(0);

}

После выполнения вышеописанной операции я получаю это output

Если это не дает максимальный выходной сигнал наместоположение изображения, где imagePart (отметка отмечена галочкой).Я что-то не так делаю?

...