模板匹配的相位相关

时间:2018-10-12 10:56:52

标签: c++ opencv image-processing correlation template-matching

我正在尝试使用相位相关性来实现模板匹配。我已经在空间领域做到了。 You can see here

我的模板图片是imagePart,我在其中找到的图片是imageBig

现在我正在尝试使用DFT来提高速度。我正在按照Cris Luengo的建议进行操作

  1. 将模板(浮动图片)填充到其他图片的大小
    (带有零)。
  2. 计算两者的FFT。

  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(刻度符号为)的图像位置提供最大输出。我在做错什么吗?

0 个答案:

没有答案