c++ - MATLAB 中的 fft2 与 OpenCV C++ 中的 dft 速度比较

标签 c++ matlab opencv fft dft

我想知道为什么 OpenCVC++ 中的 dft 函数对于二维矩阵比 fft2 慢很多。

以下C++代码来自documentation :

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 代码花费了 660 毫秒。 OpenCV 中似乎缺少一些优化。我想知道如何加快 OpenCV 代码的速度。

我正在使用 OpenCV 2.4.10 和 MATLAB R2016a 开发 Visual Studio 2015。计算机是 Windows 7、32 GB RAM、Intel Xeon 3.4 GHz。两项测试均在同一台机器上进行。

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

最佳答案

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

关于c++ - MATLAB 中的 fft2 与 OpenCV C++ 中的 dft 速度比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37900007/

相关文章:

c++ - POSIX 线程运行

arrays - MATLAB:如何找到长度大于阈值的单元格的索引?

opencv - 构建OpenCV 2.2 HTML文档

c++ - 使用 C++ 成员函数处理采用简单静态函数指针的回调

c++ - 如果基类不应该是抽象的,处理复制多态对象的虚拟方法的最佳方法是什么?

matlab - 使用 bsxfun 加速 Matlab 嵌套 for 循环

matlab - 使用每个 y 轴的两个向量格式化plotyy

opencv - 构建opencv,未定义对avformat_network_init 错误的引用

java - Tango 图像格式 YCRCB_420_SP

c++ - #pragma 警告不适用于 catch 语句