【问题标题】:why Matlab fft2 is much faster than OpenCV dft为什么 Matlab fft2 比 OpenCV dft 快得多
【发布时间】:2017-03-08 11:12:28
【问题描述】:

我刚刚做了测试,比较了 OpenCV 的 dft 函数和 Matlab 中的 fft2 的速度。我加载相同的图像,使用 fft2() 和 dft() 进行转换并测量它们消耗的时间。我发现对于图像,dft() 在 win32 发布版本中花费了 2 秒以上,而 fft2() 只花费了 0.2 秒左右。怎么会?我使用的 OpenCV 版本是 2.4.8,而 Matlab 版本是 2013 a。这是我的测试代码

Matlab:

tic
X1 = fft2(im);
toc

C++ 中的 OpenCV:

start1 = clock();
dft(src,src,DFT_COMPLEX_OUTPUT);
end1 = clock();
cout<<(double)(end1 - start1)/CLOCKS_PER_SEC<<endl;

【问题讨论】:

  • MATLAB 对线性代数、泛函分析和其他常用函数和算法使用高度优化的专有实现。答案很简单,MATLAB 的实现更好。
  • 我同意你的观点,但你能补充一些你知道的关于实施的细节吗?无论如何,谢谢你,它真的改变了我对 Matlab 的印象,它是一种慢速脚本语言。
  • 我不在 MathWorks 工作,所以我没有内幕消息可以和你分享 :)
  • @XiaotianHu MATLAB 可以像任何低级语言一样快(或更快)如果使用正确,特别是对于矩阵运算。它被称为矩阵实验室是有原因的

标签: matlab opencv


【解决方案1】:

通常 fft 是 dft 的快速实现。

DFT 是一种线性变换,它将长度为 N 的复信号 x 作为输入,并给出长度为 N 的复信号 X 作为输出,X=Wx。 W 是一个复数 NxN 矩阵,其元素为 W_k,n=exp(-2pikn/N),其中 0

FFT 是一组用于快速计算 DFT 的算法。通常,FFT 所需的操作数约为 N*logN。最著名的 FFT 算法是针对 N 是 2 的幂的情况,但对于素数阶和不同的其他因式分解有 FFT。

【讨论】:

  • 那么,你的意思是函数 dft() 不是由 FFT 或类似算法实现的?
  • From openCV docs: 一种称为快速傅里叶变换 (FFT) 的快速算法用于计算 DFT。
  • 嗯,我知道,但是在我的印象中,所有的DFT都是用FFT算法实现的,否则用起来太慢了不是吗?所以,我认为OpenCV中的dft()函数也是FFT实现的,不能解释为什么Matlab中的fft2()函数比OpenCV中的dft()快很多。
  • @XiaotianHu FDT 并没有那么慢。它只是FFT非常快!我仍然同意你的观点,我希望 openCV 和 MATLAB 一样快。但它可能并非如此
  • 我认为 OpenCV 可以合并 FFTW,然后它的 DFT 可能会运行得更快。
【解决方案2】:

fft vs dftMatlab vs c++ 我已经问了这个问题和类似的问题很长时间了。我找到的答案是,

  1. Matlab 有一些内置软件,例如 MKL、Lapack 和 BLAS。
  2. 他们在后台使用 c 或 Fortran 库。
  3. 他们使用最好的实现。例如,Matlab 中的 fft2 是基于 FFTW 的。 (西方最快的傅立叶变换)
  4. 他们一直在改进。在某些功能上,新版本明显比旧版本快。

另一方面,

  1. 您使用的不是最新版本的 OpenCV,这应该会对性能产生一些影响。
  2. 您没有按照建议使用 DFT,您可以通过获取optimal dimensions 来提高速度。如果您的图片尺寸不是最佳的,则可能会显着增加运行时间。

最后说明:不建议使用tic, toc,而是使用timeit

【讨论】:

    猜你喜欢
    • 2016-10-20
    • 1970-01-01
    • 2014-04-21
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 2011-06-18
    相关资源
    最近更新 更多