我是计算机视觉专业的博士生,我已经在这个问题中回答了关于 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 倍左右,并且最后出现的错误要少得多。
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) 集成开发环境
一个例子:我启动一个脚本。由于矩阵,它会产生错误。 我仍然可以使用命令行执行代码。我想象它在做:imagesc(matrix)。我看到矩阵的最后一行很奇怪。我修复错误。 所有变量仍然设置。我选择了剩下的代码,按 F9 执行选择,一切继续。 调试变得很快,多亏了这一点。
Matlab 在执行前强调了我的一些错误。所以我可以很快看到问题。它提出了一些让我的代码更快的方法。
使用 OpenCV/C++/Visual Studio,我可以调试。但是这个调试器不允许我在调试期间执行代码,所以我不能例如可视化矩阵等等。所以在实践中,我必须复制粘贴一些代码来转储矩阵,以检查错误在哪里。这很痛苦。
IDE 中包含一个很棒的 profiler。与此相比,用于 C++ 的 KCahcegrind 使用起来非常痛苦。
我在那里写了更多:
Are there any alternative editors for .m files?
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:它的价格