MATLAB与DFT中的FFT2在OpenCV C 速度比较中

fft2 in MATLAB vs dft in OpenCV C++ speed comparison

本文关键字:速度 比较 OpenCV DFT 中的 FFT2 MATLAB      更新时间:2023-10-16

我想知道为什么opencvc 中的dft功能比2D矩阵的fft2慢得多。

以下C 代码来自文档:

void fft2(const Mat in, Mat &complexI) {
    Mat padded;
    int m = getOptimalDFTSize(in.rows);
    int n = getOptimalDFTSize(in.cols); 
    copyMakeBorder(in, padded, 0, m - in.rows, 0, n - in.cols, BORDER_CONSTANT, Scalar::all(0));
    Mat planes[] = {Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F)};
    merge(planes, 2, complexI);
    dft(complexI, complexI);
}
int main(){
    Mat a(5000, 5000, CV_32F);
    randn(a, 0, 1);
    Mat res;
    clock_t start = clock();
    fft2(a,res);
    cout << clock() - start;
}

MATLAB代码:

mat1 = rand(5000,5000);
tic, a = fft2(mat1); toc

两个代码的结果均相同;但是,C 代码正在采用1502毫秒,而MATLAB代码为660ms。OPENCV中似乎缺少一些优化。我想知道如何加快opencvCode。

我正在使用OPENCV 2.4.10和MATLAB R2016A在Visual Studio 2015上工作。计算机是Windows 7,32 GB RAM,Intel Xeon 3.4 GHz。这两种测试均在同一台机器上进行。

我发现了一堆FFT代码,但它们似乎很难应用于矩阵。有一个简单的矩阵解决方案吗?

OpenCV的FFT实现可能不如Matlab的优化。
如果您需要的FFT性能,请查看FFTW等专业FFT库。