为什么Matlab在计算机视觉社区中如此受欢迎,即使OpenCV如此完整?

时间:2012-01-12 00:59:27

标签: c++ matlab opencv computer-vision

我注意到Matlab在计算机视觉和图像处理领域仍然非常受欢迎,直到今天,尽管OpenCV是一个非常成熟的C ++包。我从来没有使用过Matlab,但看着它我认为在C ++中没有OpenCV的优势。它是如此常用,但是我考虑把它拿起来。

为什么它在这群人中如此受欢迎?它比OpenCV有什么优势?

5 个答案:

答案 0 :(得分:47)

我是计算机视觉方面的博士生,在这个问题上,我已经回答了matlab和python之间科学家的比较: What is MATLAB good for? Why is it so used by universities? When is it better than Python?

我将更新我在matlab和opencv之间进行计算机视觉比较的答案:

我以前只使用C ++ / OpenCV进行编码,但自从开始我的博士(3年一次),我只在Matlab编码。所以我很清楚这个话题。

与opencv相比,matlab如此优秀和广泛使用有一个原因:

非常快速的编码

就个人而言,我在matlab中的编码速度比在OpenCV / C ++中快10倍左右,并且最终的bug也少得多。

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

在研究环境中,我们(希望)经常有新的想法,我们想要快速测试它们,看看是否值得继续朝这个方向发展。而且大多数情况下,我们编码的内容中只有一小部分是有用的。此外,通常不可能事先猜出一个想法是否会起作用。

Matlab在执行时通常有点慢而opencv绝对是运行时间最快的,但我们并不在意。因为我们事先不知道哪种方法会成功,所以我们必须尝试很多东西,所以我们的瓶颈是编程时间,因为我们的代码最常运行几次才能获得要发布的结果,就是这样。

让我们看看matlab如何帮助改善编程时间。

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

Matlab确实有很多我需要的功能,所以我不必一直重新发明它们:

将矩阵的索引更改为2d坐标: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)。我看到矩阵的最后一行很奇怪。我修复了这个bug。 所有变量仍然设置。我选择剩余的代码,按F9执行选择,一切都继续。 Debuging变得快速,多亏了这一点。

Matlab在执行之前强调了我的一些错误。所以我可以很快看到问题所在。它提出了一些方法来加快我的代码。

使用 OpenCV / C ++ / Visual Studio ,我可以调试。但是这个调试器不允许我在调试期间执行代码,所以我不能实例化矩阵等等。所以在实践中,我必须复制粘贴一些代码来转储矩阵,来检查哪里是错误。这非常痛苦。

IDE中包含了一个非常棒的 profiler 。与此相比,KCahcegrind for C ++使用起来非常痛苦。

我在那里写了更多: Are there any alternative editors for .m files?

5)简明代码

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

为了规范化矩阵的所有列(我一直需要它),我做: bsxfun(@times,A,1./sqrt(sum(A.^2)))

要从矩阵中删除所有小数量的colums:

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 :(得分:6)

OpenCV的C ++ API相当新颖。此外,它出现时有很多错误,现在它更加明确了。 在此之前,使用C API,使用OpenCV编写代码非常痛苦。例如。你不会轻易访问矩阵单元格,IplImage和其他矩阵之间存在差异,并且没有矩阵表达式。

我认为这是大多数人在计算机视觉中仍然坚持“快速开发的Matlab”理念的主要原因。确实,对于现在的大多数cv任务来说,它不会花费更长的时间/更多的负担或更多的C ++代码行。 OpenCV比在Matlab中。

然而,有更多理由使用Matlab而不是:

  • Matlab附带了整个GUI框架,可以很容易地检查变量,矩阵,图表和所有类型的东西。由于它是解释语言,调试也更容易。
  • Matlab在OpenCV仍然缺乏的工具箱中有一些东西,比如Wavelet工具箱。
  • 大多数研究人员都不是优秀的C ++程序员。这是真的。通常,他们至多是平庸的C ++程序员。这会导致错误或意外行为等。如果您不是专家,那么很容易陷入使用C ++的陷阱。 OpenCV的奇怪运算符=重载对它没有帮助。然后他们会说,在Matlab中他们需要更少的时间来完成工作和工作

我想补充一点,我觉得很遗憾整个研究界都停留在一个专有的环境中,在那里免费和有很好的替代品。

答案 2 :(得分:3)

Matlab适用于计算机视觉研究人员,它拥有庞大的算法,可以节省大量研究人员的时间;当您实现新算法时,您还会发现Matlab比OpenCV节省您的时间。但如果性能是你的重要关注点,Matlab并不好。

OpenCV的优势在于它可以高度自定义,并且由于本机C / C ++,性能也很好。

如果您正在制作与计算机视觉相关的产品,或者您需要在短时间内处理大量图像,换句话说,性能至关重要,那么您应该使用OpenCV。

如果您正在研究一些新颖的视觉或图像算法,并且性能不是问题,请选择Matlab。

答案 3 :(得分:2)

Matlab不仅具有图像处理功能,而且还有数学函数,在C ++中你必须在其他库中挂钩(而且,当你进行图像处理时,数学库非常重要)。

答案 4 :(得分:2)

与C ++相比,Matlab的开发时间快了一个数量级。 我不能说一个确切的数字,但任何有两种语言经验的人都会支持这个说法。

如果您希望使用算法,如果Matlab具有您需要的功能,则会立即选择C ++。