C++实现图像匹配FFT算法代码
时间: 2024-06-19 18:02:51 浏览: 91
C++实现图像匹配FFT算法的代码如下:
```cpp
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
int main(int argc, char** argv) {
if (argc != 3) {
cout << "Usage: " << argv << " <src image> <template image>" << endl;
return -1;
}
Mat srcImage = imread(argv, IMREAD_GRAYSCALE);
Mat tplImage = imread(argv, IMREAD_GRAYSCALE);
if (srcImage.empty() || tplImage.empty()) {
cout << "Read image error!" << endl;
return -1;
}
// 傅里叶变换
Mat fftSrc, fftTpl;
cv::dft(srcImage, fftSrc, cv::DFT_COMPLEX_OUTPUT);
cv::dft(tplImage, fftTpl, cv::DFT_COMPLEX_OUTPUT);
// 傅里叶变换的结果需要进行中心化
cv::fftShift(fftSrc, fftSrc);
cv::fftShift(fftTpl, fftTpl);
// 求互相关
Mat ifft;
cv::mulSpectrums(fftSrc, fftTpl, ifft, 0, true);
cv::idft(ifft, ifft, cv::DFT_SCALE | cv::DFT_REAL_OUTPUT);
// 找到最大值点
Point maxLoc;
cv::minMaxLoc(ifft, NULL, NULL, NULL, &maxLoc);
// 绘制矩形框
rectangle(srcImage, maxLoc, Point(maxLoc.x + tplImage.cols, maxLoc.y + tplImage.rows), Scalar(0, 0, 255), 2);
imshow("src", srcImage);
waitKey(0);
return 0;
}
```
其中,src image是原始图像,template image是要匹配的模板图像。在程序中,首先读取这两个图像,并进行灰度化处理。然后分别对它们进行傅里叶变换,并进行中心化操作。接下来,对它们进行互相关,找到最大值点,并在原始图像上绘制矩形框。
相关问题:
1. 什么是FFT算法?
2. 傅里叶变换的作用是什么?
3. 如何求两幅图像的互相关?
阅读全文