【转载】OpenCV(C++ 与 Python 的比较)与 MATLAB 的比较

咱们常常会为本身的技能选择合适工具而感到疑惑。虽然,工具可以帮助你锻炼技能,但它们并不能使你成为一位能者(Craftsman)。一位真正的能者,在他们的口袋中每每会拥有许多不一样的工具。另外,他们还能明智地挑选一个合适的工具去完成本身的工做。所以,能者并不与工具产生挂钩,而是自身的技能。html

有时,我会以为那些所谓的编程语言很好笑。由于,参与大战的人总纠结于哪门语言是最好的。然而事实上,做为编程人员的咱们,理应是懂得为本身的工做,去挑选一门合适的语言。例如,你想快速开发一个 Web 应用程序的话,你能够尝试使用基于 Rails 或 Django 的 Ruby 去进行开发。而若你想为一个嵌入式设备开发高性能的代码,你则能够尝试一下 C 语言。python

在计算机视觉领域方面,咱们一样会遇到类似的选择问题。到底一个计算机视觉工程师 / 编程人员须要学习哪个工具呢 —— 使用 C++ 的 OpenCV?使用 Python 的 OpenCV?仍是 MATLAB 呢?固然咱们应该庆幸,如今还能有若干个工具供咱们选择。由于在十多年前,计算机视觉领域并不存在任何一个优质的代码库。在那时,若是你想学习该领域,就必须得拿起一本书并开始为本身的小型代码库编写一些关于计算机视觉算法的代码。因此值得庆幸的是,现在事情已然变得很是美好。git

假若你是一位入门者,那么我建议的是,走一条阻碍最少的道路并选择一个你熟悉的工具。假如你原本是一位 Python 开发者,那么就选择使用 Python 的 OpenCV;C++ 的则选择使用 C++ 的 OpenCV;MATLAB 同理。由于,在将来数月中,你将再也不以一位初学者来学习。固然,你可能会想使用一种新的技能,钻研一个新项目,或在该领域寻找一份新工做。可是,懂得如何做出选择每每须要代价。所以,这就是个人建议。github

用于计算机视觉的 MATLAB

直至最近,计算机视觉领域才真正摆脱了处于婴儿期的研究。过去在该领域研究的人,每每是来自学术界或研究性实验室,而他们所选择的工具每每是 MATLAB 语言。因此,相比起 MATLAB 及其社区供应点,OpenCV 在很长的一段时间内总显得有点苍白无力。直到在过去的7年里,潮流才产生了转向。这里,我列举了一些关于使用 MATLAB 的优势:web

为什么使用 MATALAB:优势

  1. 强大的矩阵库 :在计算机视觉中,咱们不只会把一张图片看做是一个多维矩阵,并且,咱们还会在不一样的算法中使用到大量的线性代数计算。而 MATLAB 的线性代数程序正是很是的强大和快速(当使用正确的时候)。一旦咱们须要解决算法中一个巨大的稀疏线性系统计算时,在 MATLAB 每每只是一行代码的事情 —— 像 X = A \ b 这样。在过去,咱们总觉得 C++ 的实现比 MATLAB 要快上起码三倍的速度。然而,事实并不是如此。在咱们第一个 C++ 所实现的版本中,咱们发现,性能意外地比 MATLAB 所实现的要低。为了追上 MATLAB 程序的性能,咱们足足花费了数天时间去进行研究。所以,在 MATLAB 中,像反斜杆(\)这样的一个单一操做符,有时会是一个强大算法的集合。该集合正是 MATLAB 提供给你的最佳选择。
  2. 工具箱 :无论你须要解决怎样的问题,MATLAB 总会为你提供有一个工具箱。该工具箱包括有一个 视频处理 箱、一个 计算机视觉 箱以及一个 统计及机器学习箱。这些箱在开发过程当中,会为咱们提供有大量不一样而有效的算法实现。所提供的方法中,咱们每每也会看到有清晰而明显的接口。其实,许多的计算机视觉问题均可常常看成是与优化相关的问题。当你尝试在必定的限制下,去最大化或最小化部分优化目标的时候,你会发现, MATLAB 所提供的 优化工具箱 中会提供有大量经过精妙实现的优化算法。
  3. 可视化及调试工具 :使用 MATLAB 其中一个最大的乐趣,就是能够在同一个集成环境中书写代码、可视化结果并进行调试。该环境使得你格外高效。
  4. 可结合 OpenCV 使用 :你可经过使用 MATLAB 的 OpenCV 接口 去链接 OpenCV。
  5. 优雅的文档:就算是 OpenCV 的忠实支持者也认可 OpenCV 的文档过于糟糕。相比之下,MATLAB 在自身的集成开发环境(IDE)中就提供有大量优雅的文档和例子以供阅读。算法

    // MATLAB
     imshow(im); // OpenCV imshow("myWindow", im);

    大部分时间,咱们都须要展现一张图片。因为上帝的原因,咱们只须要以“图片 1”的名字去调用它,而不是像 OpenCV 那样强迫我一次又一次地输入窗体的名字(“myWindow”)。sql

  6. 大型的研究社区 :像我刚说的那样,MATLAB 是一个学术界中很是受欢迎的工具,以至于最新的研究每每会以 MATLAB 代码的形式分享出来。所以,想处于技术尖端的你理应须要能读懂 MATLAB 代码。

为什么不使用 MATALAB:缺点

  1. 成本巨大 :MATLAB 语言自己是极其可怕地昂贵。起初开始,咱们须要一个基础版的 MATLAB(2,150 美圆)以及一个用于计算机视觉的工具箱(1,350美圆)。此外,该计算机视觉工具箱还须要一个图像处理工具箱(1,00美圆),并添加有优化(1,350美圆)和机器学习工具箱(1,000美圆)。总共,加起来是6,850美圆。好的,买了以后,你把你的程序创建起来并向把它发布出去。那么你就必需要买一个 MATLAB 编译器(4,250美圆)。你想要用于两个不一样的操做系统?那么就要多花4,250美圆。所以,除非你经过你的大学以折扣价购买,或者你的公司拥有软件的许可,否则 MATLAB 对于你来讲并无多大的意义。
  2. 学习路线曲折 :因为,MATLAB 是一个矩阵引擎。所以,咱们须要遵循一种 MATLAB 的方式去书写代码。该种方式不一样于像 C++ 或 Python 这样的通常编程语言。并且,若是你不按照 MATLAB 的方式去写,那么,代码的执行速度将会很是得慢。
  3. 运行时较慢 :一个典型的 MATLAB 程序,其运行速度会比 C++ 的程序慢数倍。虽然,内置的 MATLAB 程序会很快,但你所写的代码每每会很慢。所以,人们每每会把计算密集型部分写成 C,并经过使用 mex 集成在 MATLAB 的代码中。

用于计算机视觉的 OpenCV(C++)

OpenCV 是我用于开发计算机视觉程序的主要工具。虽然,我也有常用 MATLAB 来创建原型,但除了一个缘由以外,产品版本基本都是基于 OpenCV。让咱们来看看 OpenCV 的优缺点:django

为什么使用 OpenCV(C++):优势

  1. 免费! :OpenCV 库的绝大部分是免费的 —— 犹如免费的啤酒和免费的讲话!你彻底能够在你的商业软件程序中无偿使用 OpenCV,并查看到源码。若是发现了问题,你也能够根据本身的须要进行修复。固然,使用 OpenCV 的你,也并不须要开源你的项目。
  2. 大量通过优化的代码库 :在 OpenCV 中可用的算法集合,使得库中的其余东西如同相形见绌。此外,该库还经过了性能上的优化。有了 OpenCV 3,你还能够经过透明 API 接口(Transparent API) ,轻易地调用到机器上 OpenCL 的兼容性设备(如 GPU)。最后,OpenCV 中许多的算法,都有着统一计算设备架构(CUDA,Compute Unified Device Architecture)的实现。
  3. 平台及设备 :你能够在你的桌面软件中显性地使用 OpenCV,也能够在后端的 web 应用程序中使用。因为该库一直专一于性能,所以也成为了许多嵌入式视觉程序和移动设备应用的首选视觉库。
  4. 大型的社区 :这里有着一个大型的社区(47,000人或以上),是专门提供给那些使用或维护 OpenCV 的开发者所使用。此外,该库的下载次数高达9百万次。OpenCV 社区并不像由研究人员组成的 MATLAB 社区那样。它是由来自各行各业的人汇集起来而造成的。此外,OpenCV 的开发也曾受到过像 Intel、AMD 和 Google 这样的公司所资助。因此不用说,这博客也是 OpenCV 社区的一部分,主要用于开发人员互相帮助。

为什么不使用 OpenCV(C++):缺点

  1. 对于入门者来讲困难 :若是你在 C++ 方面没有编程的经验,那么使用 OpenCV(C++)将会令你畏惧。所以,使用 Python 对于你来讲会更好。
  2. 薄弱的文档 :OpenCV 的文档确实使人诟病。因为,文档有时并无解释清楚参数的含义以及影响,所以,你不得不去详细地从纸面上理解一个算法。并且,文档不多会贴出代码的例子,以至于理解变得更加得困难。尽管贴出的代码有用,可是其也并不是很好地被记录在文档中。因此,人们已经开始义务地加入并完善该问题。
  3. 小型的机器学习库 :一个计算机视觉引擎时常须要大量的机器学习程序。然而,相比于 OpenCV(Python),OpenCV(C++)只含有一个小型的机器学习算法子集。
  4. 可视化和调试 :在任何一个 C++ 的开发环境中,咱们都难以进行调试和可视化。尤为是对于那些在忙乱中产生的新算法来讲,咱们更能体会到这点。因此,我有时候会把执行的数据直接存储到硬盘中。而后,使用 MATLAB 来分析。

用于计算机视觉的 OpenCV(Python)

我认为 OpenCV 绑定有 Python 接口,对其普及做出了很多的贡献。OpenCV(Python)对于学习计算机视觉来讲,也是一个不错的选择。此外,咱们还能够把它运用到现实世界中大范围的应用程序当中。让咱们来看看它的优缺点:编程

为什么使用 OpenCV(Python):优势

  1. 易于使用 :若是你是一位 Python 开发者,那么,使用 OpenCV(Python)的过程将会很是简单。并且,Python 是一门易于学习的语言(尤为是与 C++ 对比),因此咱们理应把其看成为第一门语言来学习编程。
  2. Python 成为了科学计算的一门开发语言 :在几年前,MATLAB 曾被称做是科学计算的语言。但现在,有了 OpenCV、 numpy 、 scipy 、 scikit-learn 以及 matplotlib ,Python 在计算机视觉领域和机器学习领域,提供了一个学习和实验的强大环境。
  3. 可视化及调试 :当使用了 OpenCV(Python),你会感受到犹如进入了一个由 Python 书写的库堆当中。使用 matplotlib 去进行结果可视化这方法,几乎可与 MATLAB 媲美。此外,虽然我还发如今 Python 环境下比 C++ 更容易去调试代码,但这仍然没法跟 MATLAB 相比。
  4. 可用于构件 web 后端 :Python 一样是一种多被用于创建网站的语言。像 Django、 Web2py 和 Flask 这样的框架能使你快速地组件起 web 应用程序。因此,结合这些框架,咱们使用 OpenCV(Python)会更加地容易。好比说,阅读一下该篇教程。其讲述如何在10分钟内将 OpenCV 代码转换成一个 web api接口。

为什么不使用 OpenCV(Python):缺点

  1. 薄弱的文档 :就像刚才所说,尽管 OpenCV(C++)的文档并不那么的完善,可是, OpenCV(Python)比其更为糟糕。一位新手使用起来每每会陷入如何去使用特定函数的问题当中。举个例子来讲,在我写该篇文章的时候,我几乎很难找到关于 cv2.Subdiv2D 的 python 文档。并且,你会发现你很难找到更多关于 OpenCV(Python)的教程。
  2. 缺少技术支持 :每当支持 OpenCV 的公司(Intel、AMD、NVidia等),讨论到 OpenCV 的 C++ 版本时,他们本身都会产生一些内部斗争。由于,他们但愿你去使用 OpenCV 并购买他们自家生产的硬件(CPU / GPU 等)来执行算法。然而,OpenCV(Python)如谚语所说的红发小孩那样,并无引发这些公司太大的关注。举个例子,我到如今还不清楚 OpenCV(Python)是否支持 透明 API 接口 。
  3. 运行时较慢 :相比起 C++,你在 Python 中的程序通常会运行地更慢。由于,在 C++ 里,你能够经过添加一个额外的力量去使用 GPU(使用 CUDA 或 OpenCL)。这比起 Python 的实现来讲,要快上十倍速度。
  4. OpenCV 是使用 C/C++ 编写的 :做为一个开源库,其好处之一就是能根据你自身需求进行修改。若是你想要修改 OpenCV,你就必须得修改 OpenCV 的 C/C++ 源文件。

总结

做为一名工程师和能者,咱们须要明白如何使用正确的工具去作正确的事情。在这个过程当中,最终你会逐渐掌握全部的这些工具。做为个人一个经验法则,我会使用 MATLAB / OpenCV(Python)来编写新的算法,而产品的完成则使用 OpenCV(C++)。flask