Я пытаюсь реализовать сопоставление шаблонов с использованием фазовой корреляции. Я уже сделал это в пространственной области. Вы можете увидеть здесь
Мой шаблон изображения imagePart
и изображение, на котором я нахожу это imageBig
,
Сейчас я пытаюсь использовать DFT для увеличения скорости. Я следую за этими шагами как предложено Крисом Луэнго
Вычислить БПФ обоих.
Переверните знак мнимой составляющей одного из результатов (комплексное сопряжение).
Умножьте два.
Вычислить 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
(галочка есть). Я делаю что-то неправильно?
Задача ещё не решена.
Других решений пока нет …