我注意到Matlab在计算机视觉和图像处理领域仍然非常受欢迎,直到今天,尽管OpenCV是一个非常成熟的C ++包。我从来没有使用过Matlab,但看着它我认为在C ++中没有OpenCV的优势。它是如此常用,但是我考虑把它拿起来。
为什么它在这群人中如此受欢迎?它比OpenCV有什么优势?
答案 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也少得多。
在研究环境中,我们(希望)经常有新的想法,我们想要快速测试它们,看看是否值得继续朝这个方向发展。而且大多数情况下,我们编码的内容中只有一小部分是有用的。此外,通常不可能事先猜出一个想法是否会起作用。
Matlab在执行时通常有点慢而opencv绝对是运行时间最快的,但我们并不在意。因为我们事先不知道哪种方法会成功,所以我们必须尝试很多东西,所以我们的瓶颈是编程时间,因为我们的代码最常运行几次才能获得要发布的结果,就是这样。
让我们看看matlab如何帮助改善编程时间。
Matlab确实有很多我需要的功能,所以我不必一直重新发明它们:
将矩阵的索引更改为2d坐标:ind2sub
提取图像的所有补丁:im2col
;计算图像的直方图:hist(Im(:))
;在列表unique(list)
中找到唯一元素;向矩阵bsxfun(@plus,M,V)
的所有向量添加向量; n维数组上的卷积convn(A)
;计算代码子部分的计算时间:tic; %%code; toc
;裁剪图像的图形界面:imcrop(im)
;
列表可能很长...... 通过使用帮助很容易找到它们。
然而,考虑到纯计算机视觉功能,我认为核心Opencv比matlab加工具箱更详尽。但是现在,很多研究人员在matlab上发布他们的源代码,如果你想测试最新发现,你基本上必须使用matlab。
无需分配和释放内存。 Matlab为您做到了这一点,因此您可以专注于您的工作。
没有缓冲区溢出。所以,不久就试图找出它崩溃的地方。 Matlab会自动停止,并告诉您代码尝试获取矩阵范围之外的值。
没有编译时间......
没有要写的标题......
一个例子:我启动一个脚本。由于矩阵,它会产生错误。 我仍然可以使用命令行执行代码。我可视化它:imagesc(matrix)
。我看到矩阵的最后一行很奇怪。我修复了这个bug。 所有变量仍然设置。我选择剩余的代码,按F9执行选择,一切都继续。 Debuging变得快速,多亏了这一点。
Matlab在执行之前强调了我的一些错误。所以我可以很快看到问题所在。它提出了一些方法来加快我的代码。
使用 OpenCV / C ++ / Visual Studio ,我可以调试。但是这个调试器不允许我在调试期间执行代码,所以我不能实例化矩阵等等。所以在实践中,我必须复制粘贴一些代码来转储矩阵,来检查哪里是错误。这非常痛苦。
IDE中包含了一个非常棒的 profiler 。与此相比,KCahcegrind for C ++使用起来非常痛苦。
我在那里写了更多: Are there any alternative editors for .m files?
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
用什么语言可以打败它?
当然,我很少需要创建循环,所有东西都包含在函数中,这使得代码更容易阅读,并且没有索引的头痛。因此,我可以专注于我想要编程的内容,而不是如何编程。
Matlab以其绘图工具而闻名。他们非常有帮助。 OpenCV只有基本的绘图功能。
通过输入doc
PS:我讨厌matlab:它的价格
答案 1 :(得分:6)
OpenCV的C ++ API相当新颖。此外,它出现时有很多错误,现在它更加明确了。 在此之前,使用C API,使用OpenCV编写代码非常痛苦。例如。你不会轻易访问矩阵单元格,IplImage和其他矩阵之间存在差异,并且没有矩阵表达式。
我认为这是大多数人在计算机视觉中仍然坚持“快速开发的Matlab”理念的主要原因。确实,对于现在的大多数cv任务来说,它不会花费更长的时间/更多的负担或更多的C ++代码行。 OpenCV比在Matlab中。
然而,有更多理由使用Matlab而不是:
我想补充一点,我觉得很遗憾整个研究界都停留在一个专有的环境中,在那里免费和有很好的替代品。
答案 2 :(得分:3)
Matlab适用于计算机视觉研究人员,它拥有庞大的算法,可以节省大量研究人员的时间;当您实现新算法时,您还会发现Matlab比OpenCV节省您的时间。但如果性能是你的重要关注点,Matlab并不好。
OpenCV的优势在于它可以高度自定义,并且由于本机C / C ++,性能也很好。
如果您正在制作与计算机视觉相关的产品,或者您需要在短时间内处理大量图像,换句话说,性能至关重要,那么您应该使用OpenCV。
如果您正在研究一些新颖的视觉或图像算法,并且性能不是问题,请选择Matlab。
答案 3 :(得分:2)
Matlab不仅具有图像处理功能,而且还有数学函数,在C ++中你必须在其他库中挂钩(而且,当你进行图像处理时,数学库非常重要)。
答案 4 :(得分:2)
如果您希望使用算法,如果Matlab具有您需要的功能,则会立即选择C ++。