【问题标题】:Why is Matlab so popular in the computer vision community even with OpenCV being so complete? [closed]为什么在 OpenCV 如此完善的情况下,Matlab 在计算机视觉社区如此受欢迎? [关闭]
【发布时间】:2012-02-08 08:59:54
【问题描述】:

我注意到,直到今天,Matlab 在计算机视觉和图像处理社区中仍然非常流行,尽管 OpenCV 是一个非常成熟的 C++ 包。我从未使用过 Matlab,但看着它,我发现 C++ 中的 OpenCV 没有任何优势。但是它很常用,我正在考虑使用它。

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

【问题讨论】:

标签: c++ matlab opencv computer-vision


【解决方案1】:

Matlab 不仅具有图像处理功能,而且还具有数学函数,在 C++ 中,您必须在其他库中挂钩(而且,当您进行图像处理时,数学库非常重要)。

【讨论】:

  • 我要补充一点,Matlab 被解释了,所以没有编译周期。这非常适合玩想法。此外,世界上熟悉 Matlab 的人比熟悉 OpenCV API 的人多得多。
  • Matlab 被解释这一事实是最重要的。它将变量保存在内存中,因此可以只运行一部分代码。它非常适合制作原型。
【解决方案2】:

Matlab 适用于计算机视觉研究人员,它拥有庞大的算法,节省了大量研究人员的时间;当您实现一个新算法时,您还会发现 Matlab 比 OpenCV 节省您的时间。但是如果性能是您的重要考虑因素,Matlab 就不好。

OpenCV 的优势在于它的高度可定制性,并且得益于原生 C/C++,性能良好。

如果你正在做一个与计算机视觉相关的产品,或者你需要在短时间内处理大量图像,换句话说,性能很关键,那么你应该使用 OpenCV。

如果您正在研究一些新颖的视觉或图像算法,并且性能不是问题,请选择Matlab。

【讨论】:

    【解决方案3】:

    OpenCV 的 C++ API 相当新。另外,刚出来的时候有很多bug,现在解决的比较多。 在此之前,使用 C API 使用 OpenCV 编写代码非常痛苦。例如。您将无法轻松访问矩阵单元,IplImage 和其他矩阵之间存在差异,并且没有矩阵表达式。

    我认为这是大多数计算机视觉领域的人仍然坚持“Matlab 快速开发”理念的主要原因。确实,对于当今的大多数 cv 任务,在 C++ 和 OpenCV 中花费的时间/负担或代码行数并不比 Matlab 中的长。

    但是,使用 Matlab 的原因远不止这些:

    • Matlab 带有整个 GUI 框架,可以很容易地检查变量、矩阵、绘图和各种东西。由于它是解释性语言,因此调试也更容易。
    • Matlab 在工具箱中有一些 OpenCV 仍然缺乏的东西,例如 Wavelet 工具箱。
    • 大多数研究人员都不是优秀的 C++ 程序员。这是真的。通常,他们充其量只是平庸的 C++ 程序员。这会导致错误或意外行为等。如果您不是专家,很容易陷入 C++ 陷阱。 OpenCV 奇怪的 operator= 重载对它没有帮助。然后他们会说,在 Matlab 中他们需要更少的时间来完成和工作。

    我想补充一点,我觉得很遗憾整个研究社区都被困在一个专有环境中,那里有免费和好的替代方案。

    【讨论】:

      【解决方案4】:

      与 C++ 相比,Matlab 的开发时间快了一个数量级。 我不能说出确切的数字,但任何有两种语言经验的人都会支持这一说法。

      当你想玩弄算法时,如果 Matlab 有你需要的功能,它会立即被选择而不是 C++。

      【讨论】:

        【解决方案5】:

        我是计算机视觉专业的博士生,我已经在这个问题中回答了关于 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:它的价格

        【讨论】:

        • 1.非常重要的是没有内存分配错误,堆栈溢出 2. 易于保存和加载变量 3. 轻松查看矩阵值 4. 无需编译... Matlab 很棒...
        • @VinojJohnHosan,没错,我会补充的。
        • @VinojJohnHosan,我已经添加了第 1 点和第 4 点。Opencv 确实有很好的工具来保存和加载矩阵。它还可以可视化矩阵值,即使在调试期间也是如此(这是非常新的)。
        • Matlab的工作区,U可以快速即时的可视化矩阵值
        猜你喜欢
        • 1970-01-01
        • 2015-05-23
        • 2010-10-20
        • 1970-01-01
        • 1970-01-01
        • 2010-12-22
        • 2011-01-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多