我正在尝试使用相位相关性来实现模板匹配。我已经在空间领域做到了。 You can see here
我的模板图片是imagePart
,我在其中找到的图片是imageBig
。
现在我正在尝试使用DFT来提高速度。我正在按照Cris Luengo的建议进行操作
计算两者的FFT。
翻转结果之一的虚部符号(复共轭)。
将两者相乘。
计算结果的IFFT。
查找具有最大值的像素的位置。
我的代码是:
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);
}
是否应该在imagePart
(刻度符号为)的图像位置提供最大输出。我在做错什么吗?