Matlab 仍然比 C++ 中的 opencv 慢吗
Posted
技术标签:
【中文标题】Matlab 仍然比 C++ 中的 opencv 慢吗【英文标题】:Is Matlab still slower than opencv in C++ 【发布时间】:2014-07-15 14:42:14 【问题描述】:根据这个link和这个one,据说opencv比matlab快很多。第一个链接写于 2012 年 3 月,第二个链接比那晚一点。
在第一个链接中,它说,“用 OpenCV 编写的程序比用 Matlab 编写的类似程序运行得快得多。” 并评价 Matlab: 2/10
和 OpenCV: 9/10
考虑一下,我有两个 float Matrix,其大小为 1024*1024(mat1 和 mat2)。我想关联这些矩阵。
在matlab中,
corr2(mat1,mat2); //70-75 ms
在opencv中,c++
Mat result(1,1,CV_32F);
matchTemplate(mat1,mat2,result, CV_TM_CCOEFF_NORMED); // 145-150 ms
据我所知,c 和 c++ 的速度大致相同。
所以,我想知道为什么 matlab 在进行互相关时比 opencv/c++ 快。 是因为我在比较错误的东西(即使结果相同)还是 matlab 的互相关实现比 opencv 实现快一倍?
请注意,我使用的是Matlab 2013a
和Visual Studio 2010
。
谢谢,
【问题讨论】:
OpenCV 使用几个优化的库来加速计算,所以问题是:你的 OpenCV 二进制文件是否被编译为使用它们?否则,Matlab 可能会占上风。 另外,还有一件更重要的事情。 MATLAB 中的所有值都是浮点数,而 OpenCV 有 uchar、short、int、float、double。这就是为什么 OpenCV 更快的原因,因为大多数功能都是在 8 位数据上进行的。 【参考方案1】:Matlab 内置函数带有 mkl 和 opencv 的 dont。因此,如果两者中都存在两个完全等效的函数,则 matlab 可能比 opencv 更快(很多)。我曾尝试在大型矩阵上进行伪逆运算,matlab 将所有东西(openblas、犰狳、自集成 mkl 等)至少击败了 2 次。然后我就不再弄清楚为什么了,只是将数据加载到 matlab 中并让它做这件事。 opencv 是迄今为止最慢的。在 opencv 中尝试对 10000x10000 矩阵进行矩阵乘法。在我的笔记本电脑上花了 10 分钟。 Matlab 花了 1 分钟。
【讨论】:
除了买MKL
之外还有什么办法可以提高opencv的速度吗?如果我找到/得到 MKL,我的 opencv 代码会和 matlab 一样快吗?
我不相信 opencv 对 mkl 有直接的支持。但是,您可以使用可以使用 mkl 的数学库,例如 Armadillo。然后你尝试在那里进行计算。 Openblas 是 mkl 的替代品。根据您的问题,您也许可以使用 matlab 获得相当的速度。您需要尝试在您的数据和基准上运行。
这里有更多信息nghiaho.com/?p=1726。所以你可以对性能的相对差异有一些粗略的了解。但这些基准是非常具体的问题。所以你真的需要尝试一下。
有没有办法在matlab中禁用mkl?然后,我可以测试 mkl 改进了多少。感谢您的链接,它提供了一些关于他们的速度的想法。
我认为这是不可能的,因为它是执行计算的基本主力。如果 opencv 实现了 matchTemplate
函数的 ipp 变体,您可能想研究使用 ipp 编译 opencv,使用它可能可以获得类似的性能。【参考方案2】:
Matlab 在进行矩阵计算方面并没有您想象的那么糟糕。对于许多基本线性代数运算,Matlab 正在调用用 fortran 和 c++ 编写的程序。所以只要你不使用循环并在矩阵运算中制定它,Matlab实际上是非常快的。
http://www.mathworks.se/company/newsletters/articles/matlab-incorporates-lapack.html
【讨论】:
当我阅读这篇文章时,我无法与 c++ 进行适当的比较,因为它只是表示使用不同包的速度提升,我不知道execution time
或 @ 是什么c++的987654323@。另外,这篇文章是2000年发表的,所以不知道最近有没有改进包。
我认为你的代码速度取决于编译代码的编译器和库/语言。我的一些从事大量科学编程的朋友说,他们只需使用 Intel 编译器而不是 Visual Studio 中的标准编译器进行编译,就能获得很多额外的速度。关于 Matlab(LAPACK 或任何 Matrix 库)与 OpenCV,我认为这些年来执行 BLAS 的库的速度并没有太大变化,但是当涉及到比 CORR 更高级的东西时,open cv 可能会更快。
那么,第一个网站的速度对比是不是错了?至少不是2/10
vs 9/10
,是吗?
我不会给出 2/10 vs 9/10 :) 例如在 C++ 中,当你通过引用传递时非常清楚,当你通过值传递时,就像在 Matlab 中一样,它几乎没有那么清楚.上次在 Matlab 中进行任何真正的编程已经有一段时间了,但自从我上次使用以来,Mathworks 可能已经改进了这一点。因此,对于他们在您的链接中使用的特定代码和问题,C++ 可能更快。无论如何,matlab 的速度很大程度上取决于您如何编写代码尝试例如 Blaz Bratanic 给出的代码示例。
再次阅读您的链接:“在 OpenCV 中,我们将获得至少 30fps,从而实现实时检测”。如果他们从实时视频源进行实时处理并传递大量数据,我认为他们不太可能从 openCV (C++) 获得更高的速度,因为他们的代码不仅仅取决于他们可以多快完成基本矩阵计算。【参考方案3】:
在您的场景中,没有理由期望 matlab 会变慢。您正在调用单个函数,语言解释器和将数据传递给本机函数(mex 函数)的开销只需支付一次。
如果您对一个 32*32 的小矩阵调用相同的函数 1024 次,您可能会注意到开销(除非 JIT 编译器找到优化代码的巧妙技巧)。
【讨论】:
我在想,在最坏的情况下,它们的速度会相同,但 matlab 的速度是 opencv 速度的两倍。为什么你认为opencv在这种情况下这么慢(或者matlab这么快)。【参考方案4】:如果您将所有内容向量化并使用本机函数,Matlab 会很快。 但是,如果您要在循环中执行一些操作,即
A = zeros(100,100);
for m = 1:100
for n = 1:100
A(m, n) = 1/(m + n - 1);
end
end
对比
Mat A(100, 100, CV_64F);
for (int r = 0; r < A.rows; r++)
for (int c = 0; c < A.cols; c++)
A.at<double>(r, c) = 1 / (r + c - 1);
你会注意到差异。
【讨论】:
得益于即时编译,MATLAB 中的循环变得更快了。事实上,对于这样的基本操作,循环甚至可以比向量化的 MATLAB 代码更快。自己试试吧:pastebin.com/Ugca2aDx 顺便说一句,如果你改变迭代的顺序(首先循环n
,然后循环m
)它会更快。原因是 MATLAB 数组存储在 column-major order 中,因此您将以这种方式线性访问元素(想想 spatial locality)。【参考方案5】:
对于相关函数(以及更多),matlab 使用高级库,该库使用高级指令集。
但是,Matlab 比您想象的要聪明,Matlab 在运行时检查操作是否会在空间域或频域上执行得比执行最快的解决方案更快。
我找不到关于 corr2 的提及,但我找到了 normxcorr2
根据图像的大小计算空间或频域的互相关。
【讨论】:
以上是关于Matlab 仍然比 C++ 中的 opencv 慢吗的主要内容,如果未能解决你的问题,请参考以下文章