As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened,
visit the help center提供指导。
9年前关闭。
我注意到,到目前为止,即使OpenCV是针对C++的非常成熟的软件包,Matlab仍在计算机视觉和图像处理社区中非常流行。我从未使用过Matlab,但从中看,我发现C++中没有优于OpenCV的优点。它是如此常用,但是我正在考虑将其拾起。
为什么在人群中如此受欢迎?与OpenCV相比,它有什么优势?
我是计算机视觉的博士研究生,我已经回答过关于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实际上具有我需要的许多功能,因此我不必一直重新发明它们:
将矩阵的索引更改为2d坐标:ind2sub
提取图像的所有色块:im2col
;计算图像的直方图:hist(Im(:))
;在列表unique(list)
中找到唯一元素;向矩阵bsxfun(@plus,M,V)
的所有 vector 添加一个 vector ; n维数组上的卷积convn(A)
;计算代码子部分的计算时间:tic; %%code; toc
;裁剪图像的图形界面:imcrop(im)
;
list 可能很长...
使用帮助很容易找到它们。
但是,考虑到纯计算机视觉功能,我认为核心Opencv比matlab加工具箱更为详尽。但是,如今,如此众多的研究人员在matlab中发布其源代码,因此,如果您想测试最新发现,则基本上必须使用matlab。
3)没有C++特有的问题
无需分配和释放内存。 Matlab为您做到了,因此您可以专注于工作。
没有缓冲区溢出。因此,不再需要长时间寻找崩溃的地方。 Matlab自动停止,并告诉您代码在哪里尝试获得矩阵范围之外的值。
没有编译时间...
没有标题可写...
4)IDE
一个例子:我启动一个脚本。由于矩阵,会产生错误。 我仍然可以使用命令行执行代码。 我将其可视化为:imagesc(matrix)
。我看到矩阵的最后一行很奇怪。我修复了错误。 所有变量仍设置为。我选择剩下的代码,按F9键执行选择,一切继续。 使得调试变得快速。
Matlab在执行之前强调了我的一些错误。这样我就可以很快看到问题所在。它提出了一些使我的代码更快的方法。
使用 OpenCV/C++/Visual Studio ,我可以调试。但是这个调试器不允许我在调试期间执行代码,因此,例如,我无法可视化矩阵等。因此,在实践中,我必须复制粘贴一些代码以转储矩阵,以检查错误在哪里。这是非常痛苦的。
IDE中包含一个很棒的分析器。相比之下,使用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:价格
我是一名优秀的程序员,十分优秀!