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

zeb*_*bra 20 c++ matlab opencv computer-vision

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

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

Oli*_*Oli 47

我是计算机视觉的博士生,在这个问题上我已经回答了matlab和python之间科学家的比较: MATLAB的优点是什么?为什么大学如此使用?什么时候比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执行选择,一切都继续.由于这个原因,销售变得很快.

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

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

IDE中包含一个很棒的分析器.与此相比,KCahcegrind for C++使用起来非常痛苦.

我在那里写了更多: .m文件有替代编辑器吗?

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
Run Code Online (Sandbox Code Playgroud)

为了平衡我的代码:

parfor n=1:100
%%% code normally and everything is multi-threaded
Run Code Online (Sandbox Code Playgroud)

用什么语言可以打败那个?

当然,我很少需要创建循环,所有东西都包含在函数中,这使代码更容易阅读,并且没有索引的头痛.所以我可以专注于我想要编程的内容,而不是如何编程.

6)绘图工具

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

7)优秀的文档

通过打字,访问它非常容易 doc

PS:我讨厌matlab:它的价格


ypn*_*nos 6

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

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

但是使用Matlab的理由多于:

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

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