为什么在计算机视觉领域,即使OpenCV已经如此完整,Matlab仍然如此受欢迎?

20

我注意到 Matlab 在计算机视觉和图像处理社区仍然非常流行,尽管 OpenCV 是一个非常成熟的 C++ 软件包。虽然我从未使用过 Matlab,但在看它时,我没有发现它在 C++中有任何优势。然而,由于它被广泛使用,我正在考虑学习它。

为什么它在这个群体中如此受欢迎?它相比于 OpenCV 有哪些优点?


1
这里有一个类似的问题,可能对你的问题有用:https://dev59.com/Im865IYBdhLWcg3wKLX6 - O_O
可能是重复的问题:https://dev59.com/RnVC5IYBdhLWcg3wz0h9#36GdEYcBWogLw_1bggms - Andrey Rubshtein
5个回答

47

我是一名计算机视觉的博士生,之前已经在这个问题中回答了关于Matlab和Python在科学家中比较的问题:

Matlab有什么用?为什么大学里如此普及?什么时候比Python更好?

现在我将更新我的答案,比较matlab和opencv在计算机视觉中的应用:

我曾经只使用C ++ / OpenCV进行编码,但自从我开始攻读博士学位(三年前)以来,我只使用Matlab进行编码。所以我对这个话题很熟悉。

相比于OpenCV,Matlab非常好且被广泛使用的原因只有一个:

极快速的编程

就个人而言,我在Matlab中进行编码的速度约为OpenCV / C ++的10倍,并且最终错误较少。

1) 计算机视觉研究人员需要快速原型设计

在研究环境下,我们(希望)通常会有新的想法,并希望快速测试它们以确定是否值得继续。而且,我们编码的只有一小部分是有用的。此外,通常无法预先猜测一个想法是否可行。

Matlab在执行时间上通常会比较慢,opencv则明显更快,但是我们并不太关心这个问题。因为我们不知道哪种方法会成功,所以我们必须尝试很多东西,所以我们的瓶颈是编程时间,因为我们的代码通常只运行几次以获取发布结果,就完成了我们的工作。

那么让我们看看Matlab如何帮助提高编程时间。

2) 我需要的一切都已经存在

Matlab有我需要的很多函数,这样我就不必一遍又一遍地重新发明它们:

将矩阵的索引改为二维坐标:ind2sub;提取图像的所有补丁:im2col;计算图像的直方图:hist(Im(:));查找列表中唯一的元素:unique(list);将一个向量添加到矩阵的所有向量中:bsxfun(@plus,M,V);在n维数组上进行卷积:convn(A);计算代码的子部分的运算时间:tic; %%code; toc;对图像进行裁剪的图形界面:imcrop(im)

这个列表可能很长... 通过使用帮助,这些都非常容易找到。

然而,关于纯计算机视觉的函数,我认为核心OpenCV比Matlab加上工具箱更详尽。但现在,有很多研究人员在Matlab中发布他们的源代码,如果你想测试最新的发现,基本上必须使用Matlab。

3) 没有C++特定的问题

不需要分配和释放内存,Matlab会为您处理,所以您可以专注于工作。

没有缓冲区溢出,因此不需要长时间尝试查找崩溃位置。Matlab自动停止,并告诉您代码尝试获取超出矩阵范围的值的位置。

没有编译时间...

没有头文件需要写入...

4) IDE

例如:我启动一个脚本。它因为一个矩阵而产生错误。我仍然可以使用命令行执行代码。我用imagesc(matrix)查看它,发现最后一行的矩阵很奇怪。我修复了错误。所有变量仍然设置好了。我选择剩余的代码,按F9执行选择,一切都正常了。由于这一点,调试变得更快

Matlab在执行之前会下划线标记我的某些错误,因此我可以快速查看问题。它提供了一些方法来加速我的代码。

使用OpenCV/C++/Visual Studio,我可以进行调试。但这个调试器不允许我在调试期间执行代码,因此我无法可视化矩阵等内容。因此,在实践中,我必须复制粘贴一些代码来转储矩阵,以检查错误的位置。这非常痛苦。

IDE中包含了一个很棒的分析器。与C++的KCahcegrind相比,它更容易使用。

我在这里写了更多内容: 是否有任何.m文件的替代编辑器?

5) 简洁的代码

Matlab代码更加简洁,意味着更易于调试、阅读、理解和:代码看起来像我的公式

要对矩阵的所有列进行归一化(我经常需要这样做),我可以使用以下代码:

bsxfun(@times,A,1./sqrt(sum(A.^2)))

要从矩阵中删除所有总和较小的列:

A(:,sum(A)<e)=[]

在GPU上进行计算

gpuX = gpuarray(X); 
%%% code normally and everything is done on GPU
为了使我的代码并行化:
parfor n=1:100
%%% code normally and everything is multi-threaded

有哪种语言能打败它呢?

当然,我很少需要制作循环,一切都包含在函数中,这使得代码更易于阅读,没有索引的麻烦。因此,我可以专注于我想要编程的内容,而不是如何编程。

6) 绘图工具

Matlab以其绘图工具而闻名。它们非常有帮助。OpenCV只有基本的绘图功能。

7) 出色的文档

而且很容易访问,只需键入doc

PS:我讨厌Matlab的价格


  1. 非常重要的是没有内存分配错误、堆栈溢出
  2. 变量保存和加载很容易
  3. 易于查看矩阵数值
  4. 无需编译... Matlab 很棒...
- Vinoj John Hosan
@VinojJohnHosan,没错,我会添加的。 - Oli
@VinojJohnHosan,我已经添加了1和4点。Opencv确实有很好的工具来保存和加载矩阵。它还可以可视化矩阵值,甚至在调试过程中(这是最近才出现的)。 - Oli
Matlab的工作区,您可以快速而即时地可视化矩阵值。 - Vinoj John Hosan

6
OpenCV的C++ API相对较新。当它出现时,存在许多错误,但现在已经更加完善。 在那之前,使用OpenCV的C API编写代码相当痛苦。例如,您无法轻松访问矩阵单元格,IplImage和其他矩阵之间存在区别,而且没有Matrix Expressions。
我认为这是大多数计算机视觉人员仍坚持“Matlab用于快速开发”的主要原因。当今大多数cv任务在C++和OpenCV中执行所需的时间、负担或代码行数与Matlab相比并不多。
然而,还有更多使用Matlab的原因:
-Matlab配备了整个GUI框架,其中检查变量、矩阵及其所有相关内容(如绘图)非常容易。由于它是解释性语言,因此调试也更容易。
-Matlab的一些工具箱中有一些OpenCV尚缺少的工具,例如Wavelet工具箱。
-大多数研究人员不是很好的C++程序员。这是真的。通常,他们最多是普通的C++程序员。这会导致错误或意外行为等问题。如果您不是专家,则非常容易陷入C++的陷阱。 OpenCV奇怪的operator=重载没有帮助。然后他们会说,在Matlab中,他们需要更少的时间来完成工作并让它正常工作。
我想补充一点,即我认为整个研究社区被困在专有环境中是一件遗憾的事情,因为存在免费且良好的替代品。

3
Matlab适合计算机视觉研究人员使用,它拥有大量算法可以节省许多研究者的时间。当您实现新算法时,您会发现Matlab比OpenCV更省时间。但如果性能是您关注的重点,则Matlab不是很好。
OpenCV的优势在于它高度可定制且性能良好,这要归功于本地C/C++。
如果您正在开发与计算机视觉相关的产品,或者需要在短时间内处理大量图像,换句话说,性能至关重要,则应使用OpenCV。
如果您正在研究一些新的视觉或图像算法,并且性能不是问题,请选择Matlab。

2

Matlab不仅具有图像处理功能,而且还具有数学函数,在C++中,您需要连接其他库来使用它们(而在进行图像处理时,数学库非常重要)。


2
我要补充一下,Matlab是解释型语言,所以没有编译周期。这对于尝试新想法非常有帮助。此外,世界上熟悉Matlab的人比熟悉OpenCV API的人要多得多。 - ahoffer
Matlab是解释型语言这一事实是最重要的。它将变量保存在内存中,因此可以仅运行代码的一部分。这对于原型设计非常有用。 - R.Falque

2

相比于C ++,Matlab在开发时间上快了一个数量级。我无法给出确切的数字,但任何熟悉这两种语言的人都会支持这一说法。

当你想要尝试算法时,如果Matlab具有所需功能,则立即选择它而不是C ++。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接