我注意到 Matlab 在计算机视觉和图像处理社区仍然非常流行,尽管 OpenCV 是一个非常成熟的 C++ 软件包。虽然我从未使用过 Matlab,但在看它时,我没有发现它在 C++中有任何优势。然而,由于它被广泛使用,我正在考虑学习它。
为什么它在这个群体中如此受欢迎?它相比于 OpenCV 有哪些优点?
我注意到 Matlab 在计算机视觉和图像处理社区仍然非常流行,尽管 OpenCV 是一个非常成熟的 C++ 软件包。虽然我从未使用过 Matlab,但在看它时,我没有发现它在 C++中有任何优势。然而,由于它被广泛使用,我正在考虑学习它。
为什么它在这个群体中如此受欢迎?它相比于 OpenCV 有哪些优点?
我是一名计算机视觉的博士生,之前已经在这个问题中回答了关于Matlab和Python在科学家中比较的问题:
Matlab有什么用?为什么大学里如此普及?什么时候比Python更好?现在我将更新我的答案,比较matlab和opencv在计算机视觉中的应用:
我曾经只使用C ++ / OpenCV进行编码,但自从我开始攻读博士学位(三年前)以来,我只使用Matlab进行编码。所以我对这个话题很熟悉。
相比于OpenCV,Matlab非常好且被广泛使用的原因只有一个:
就个人而言,我在Matlab中进行编码的速度约为OpenCV / C ++的10倍,并且最终错误较少。
在研究环境下,我们(希望)通常会有新的想法,并希望快速测试它们以确定是否值得继续。而且,我们编码的只有一小部分是有用的。此外,通常无法预先猜测一个想法是否可行。
Matlab在执行时间上通常会比较慢,opencv则明显更快,但是我们并不太关心这个问题。因为我们不知道哪种方法会成功,所以我们必须尝试很多东西,所以我们的瓶颈是编程时间,因为我们的代码通常只运行几次以获取发布结果,就完成了我们的工作。
那么让我们看看Matlab如何帮助提高编程时间。
Matlab有我需要的很多函数,这样我就不必一遍又一遍地重新发明它们:
将矩阵的索引改为二维坐标: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)
查看它,发现最后一行的矩阵很奇怪。我修复了错误。所有变量仍然设置好了。我选择剩余的代码,按F9执行选择,一切都正常了。由于这一点,调试变得更快。
Matlab在执行之前会下划线标记我的某些错误,因此我可以快速查看问题。它提供了一些方法来加速我的代码。
使用OpenCV/C++/Visual Studio,我可以进行调试。但这个调试器不允许我在调试期间执行代码,因此我无法可视化矩阵等内容。因此,在实践中,我必须复制粘贴一些代码来转储矩阵,以检查错误的位置。这非常痛苦。
IDE中包含了一个很棒的分析器。与C++的KCahcegrind相比,它更容易使用。
我在这里写了更多内容: 是否有任何.m文件的替代编辑器?
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
有哪种语言能打败它呢?
当然,我很少需要制作循环,一切都包含在函数中,这使得代码更易于阅读,没有索引的麻烦。因此,我可以专注于我想要编程的内容,而不是如何编程。
Matlab以其绘图工具而闻名。它们非常有帮助。OpenCV只有基本的绘图功能。
而且很容易访问,只需键入doc
PS:我讨厌Matlab的价格
Matlab不仅具有图像处理功能,而且还具有数学函数,在C++中,您需要连接其他库来使用它们(而在进行图像处理时,数学库非常重要)。
相比于C ++,Matlab在开发时间上快了一个数量级。我无法给出确切的数字,但任何熟悉这两种语言的人都会支持这一说法。
当你想要尝试算法时,如果Matlab具有所需功能,则立即选择它而不是C ++。