【转载】OpenCV(C++ 与 Python 的比较)与 MATLAB 的比较
- 原文作者 : Satya Mallick
- 译者 : aleen42
我们经常会为自己的技能选择合适工具而感到疑惑。虽然,工具能够帮助你锻炼技能,但它们并不能使你成为一位能者(Craftsman)。一位真正的能者,在他们的口袋中往往会拥有许多不同的工具。另外,他们还能明智地挑选一个合适的工具去完成自己的工作。因此,能者并不与工具产生挂钩,而是自身的技能。
有时,我会觉得那些所谓的编程语言很可笑。因为,参与大战的人总纠结于哪门语言是最好的。然而事实上,作为编程人员的我们,理应是懂得为自己的工作,去挑选一门合适的语言。例如,你想快速开发一个 Web 应用程序的话,你可以尝试使用基于 Rails 或 Django 的 Ruby 去进行开发。而若你想为一个嵌入式设备开发高性能的代码,你则可以尝试一下 C 语言。
在计算机视觉领域方面,我们同样会遇到相似的选择问题。到底一个计算机视觉工程师 / 编程人员需要学习哪一个工具呢 —— 使用 C++ 的 OpenCV?使用 Python 的 OpenCV?还是 MATLAB 呢?当然我们应该庆幸,现在还能有若干个工具供我们选择。因为在十多年前,计算机视觉领域并不存在任何一个优质的代码库。在那时,如果你想学习该领域,就必须得拿起一本书并开始为自己的小型代码库编写一些关于计算机视觉算法的代码。所以值得庆幸的是,如今事情已然变得非常美好。
倘若你是一位入门者,那么我建议的是,走一条阻碍最少的道路并选择一个你熟悉的工具。假如你本来是一位 Python 开发者,那么就选择使用 Python 的 OpenCV;C++ 的则选择使用 C++ 的 OpenCV;MATLAB 同理。因为,在未来数月中,你将不再以一位初学者来学习。当然,你可能会想使用一种新的技能,钻研一个新项目,或在该领域寻找一份新工作。但是,懂得如何作出选择往往需要代价。因此,这就是我的建议。
用于计算机视觉的 MATLAB
直至最近,计算机视觉领域才真正摆脱了处于婴儿期的研究。过去在该领域研究的人,往往是来自学术界或研究性实验室,而他们所选择的工具往往是 MATLAB 语言。所以,相比起 MATLAB 及其社区供应点,OpenCV 在很长的一段时间内总显得有点苍白无力。直到在过去的7年里,潮流才产生了转向。这里,我列举了一些关于使用 MATLAB 的优点:
为何使用 MATALAB:优点
- 强大的矩阵库 :在计算机视觉中,我们不仅会把一张图片看作是一个多维矩阵,而且,我们还会在不同的算法中使用到大量的线性代数计算。而 MATLAB 的线性代数程序正是非常的强大和快速(当使用正确的时候)。一旦我们需要解决算法中一个巨大的稀疏线性系统计算时,在 MATLAB 往往只是一行代码的事情 —— 像 X = A \ b 这样。在过去,我们总以为 C++ 的实现比 MATLAB 要快上起码三倍的速度。然而,事实并非如此。在我们第一个 C++ 所实现的版本中,我们发现,性能意外地比 MATLAB 所实现的要低。为了追上 MATLAB 程序的性能,我们足足花费了数天时间去进行研究。因此,在 MATLAB 中,像反斜杆(\)这样的一个单一操作符,有时会是一个强大算法的集合。该集合正是 MATLAB 提供给你的最佳选择。
- 工具箱 :不管你需要解决怎样的问题,MATLAB 总会为你提供有一个工具箱。该工具箱包括有一个 视频处理 箱、一个 计算机视觉 箱以及一个 统计及机器学习箱。这些箱在开发过程中,会为我们提供有大量不同而有效的算法实现。所提供的方法中,我们往往也会看到有清晰而明显的接口。其实,许多的计算机视觉问题都可经常当作是与优化相关的问题。当你尝试在一定的限制下,去最大化或最小化部分优化目标的时候,你会发现, MATLAB 所提供的 优化工具箱 中会提供有大量通过精妙实现的优化算法。
- 可视化及调试工具 :使用 MATLAB 其中一个最大的乐趣,就是可以在同一个集成环境中书写代码、可视化结果并进行调试。该环境使得你格外高效。
- 可结合 OpenCV 使用 :你可通过使用 MATLAB 的 OpenCV 接口 去连接 OpenCV。
-
优雅的文档:就算是 OpenCV 的忠实支持者也承认 OpenCV 的文档过于糟糕。相比之下,MATLAB 在自身的集成开发环境(IDE)中就提供有大量优雅的文档和例子以供阅读。
// MATLAB imshow(im); // OpenCV imshow("myWindow", im);
大部分时间,我们都需要展示一张图片。由于上帝的缘由,我们只需要以“图片 1”的名字去调用它,而不是像 OpenCV 那样强迫我一次又一次地输入窗体的名字(“myWindow”)。
- 大型的研究社区 :像我刚说的那样,MATLAB 是一个学术界中非常受欢迎的工具,以致于最新的研究往往会以 MATLAB 代码的形式分享出来。因此,想处于技术尖端的你理应需要能读懂 MATLAB 代码。
为何不使用 MATALAB:缺点
- 成本巨大 :MATLAB 语言本身是极其可怕地昂贵。起初开始,我们需要一个基础版的 MATLAB(2,150 美元)以及一个用于计算机视觉的工具箱(1,350美元)。此外,该计算机视觉工具箱还需要一个图像处理工具箱(1,00美元),并添加有优化(1,350美元)和机器学习工具箱(1,000美元)。总共,加起来是6,850美元。好的,买了之后,你把你的程序建立起来并向把它发布出去。那么你就必须要买一个 MATLAB 编译器(4,250美元)。你想要用于两个不同的操作系统?那么就要多花4,250美元。因此,除非你通过你的大学以折扣价购买,或者你的公司拥有软件的许可,不然 MATLAB 对于你来说并没有多大的意义。
- 学习路线曲折 :由于,MATLAB 是一个矩阵引擎。因此,我们需要遵循一种 MATLAB 的方式去书写代码。该种方式不同于像 C++ 或 Python 这样的一般编程语言。而且,如果你不按照 MATLAB 的方式去写,那么,代码的执行速度将会非常得慢。
- 运行时较慢 :一个典型的 MATLAB 程序,其运行速度会比 C++ 的程序慢数倍。虽然,内置的 MATLAB 程序会很快,但你所写的代码往往会很慢。因此,人们往往会把计算密集型部分写成 C,并通过使用 mex 集成在 MATLAB 的代码中。
用于计算机视觉的 OpenCV(C++)
OpenCV 是我用于开发计算机视觉程序的主要工具。虽然,我也有经常使用 MATLAB 来建立原型,但除了一个原因之外,产品版本基本都是基于 OpenCV。让我们来看看 OpenCV 的优缺点:
为何使用 OpenCV(C++):优点
- 免费! :OpenCV 库的绝大部分是免费的 —— 犹如免费的啤酒和免费的讲话!你完全可以在你的商业软件程序中免费使用 OpenCV,并查看到源码。如果发现了问题,你也可以根据自己的需要进行修复。当然,使用 OpenCV 的你,也并不需要开源你的项目。
- 大量经过优化的代码库 :在 OpenCV 中可用的算法集合,使得库中的其他东西如同相形见绌。此外,该库还通过了性能上的优化。有了 OpenCV 3,你还可以通过透明 API 接口(Transparent API) ,轻易地调用到机器上 OpenCL 的兼容性设备(如 GPU)。最后,OpenCV 中许多的算法,都有着统一计算设备架构(CUDA,Compute Unified Device Architecture)的实现。
- 平台及设备 :你可以在你的桌面软件中显性地使用 OpenCV,也可以在后端的 web 应用程序中使用。由于该库一直专注于性能,因此也成为了许多嵌入式视觉程序和移动设备应用的首选视觉库。
- 大型的社区 :这里有着一个大型的社区(47,000人或以上),是专门提供给那些使用或维护 OpenCV 的开发者所使用。此外,该库的下载次数高达9百万次。OpenCV 社区并不像由研究人员组成的 MATLAB 社区那样。它是由来自各行各业的人聚集起来而形成的。此外,OpenCV 的开发也曾受到过像 Intel、AMD 和 Google 这样的公司所资助。所以不用说,这博客也是 OpenCV 社区的一部分,主要用于开发人员互相帮助。
为何不使用 OpenCV(C++):缺点
- 对于入门者来说困难 :如果你在 C++ 方面没有编程的经验,那么使用 OpenCV(C++)将会令你畏惧。因此,使用 Python 对于你来说会更好。
- 薄弱的文档 :OpenCV 的文档确实令人诟病。由于,文档有时并没有解释清楚参数的含义以及影响,因此,你不得不去详细地从纸面上理解一个算法。而且,文档很少会贴出代码的例子,以致于理解变得更加得困难。尽管贴出的代码有用,但是其也并非很好地被记录在文档中。所以,人们已经开始义务地加入并完善该问题。
- 小型的机器学习库 :一个计算机视觉引擎时常需要大量的机器学习程序。然而,相比于 OpenCV(Python),OpenCV(C++)只含有一个小型的机器学习算法子集。
- 可视化和调试 :在任何一个 C++ 的开发环境中,我们都难以进行调试和可视化。尤其是对于那些在忙乱中产生的新算法来说,我们更能体会到这点。所以,我有时候会把执行的数据直接存储到硬盘中。然后,使用 MATLAB 来分析。
用于计算机视觉的 OpenCV(Python)
我认为 OpenCV 绑定有 Python 接口,对其普及作出了不少的贡献。OpenCV(Python)对于学习计算机视觉来说,也是一个不错的选择。此外,我们还可以把它运用到现实世界中大范围的应用程序当中。让我们来看看它的优缺点:
为何使用 OpenCV(Python):优点
- 易于使用 :如果你是一位 Python 开发者,那么,使用 OpenCV(Python)的过程将会非常简单。而且,Python 是一门易于学习的语言(尤其是与 C++ 对比),所以我们理应把其当作为第一门语言来学习编程。
- Python 成为了科学计算的一门开发语言 :在几年前,MATLAB 曾被称作是科学计算的语言。但如今,有了 OpenCV、 numpy 、 scipy 、 scikit-learn 以及 matplotlib ,Python 在计算机视觉领域和机器学习领域,提供了一个学习和实验的强大环境。
- 可视化及调试 :当使用了 OpenCV(Python),你会感觉到犹如进入了一个由 Python 书写的库堆当中。使用 matplotlib 去进行结果可视化这方法,几乎可与 MATLAB 媲美。此外,虽然我还发现在 Python 环境下比 C++ 更容易去调试代码,但这仍然无法跟 MATLAB 相比。
- 可用于构件 web 后端 :Python 同样是一种多被用于建立网站的语言。像 Django、 Web2py 和 Flask 这样的框架能使你快速地组件起 web 应用程序。所以,结合这些框架,我们使用 OpenCV(Python)会更加地容易。比如说,阅读一下该篇教程。其讲述如何在10分钟内将 OpenCV 代码转换成一个 web api接口。
为何不使用 OpenCV(Python):缺点
- 薄弱的文档 :就像刚才所说,尽管 OpenCV(C++)的文档并不那么的完善,但是, OpenCV(Python)比其更为糟糕。一位新手使用起来往往会陷入如何去使用特定函数的问题当中。举个例子来说,在我写该篇文章的时候,我几乎很难找到关于 cv2.Subdiv2D 的 python 文档。而且,你会发现你很难找到更多关于 OpenCV(Python)的教程。
- 缺乏技术支持 :每当支持 OpenCV 的公司(Intel、AMD、NVidia等),讨论到 OpenCV 的 C++ 版本时,他们自己都会产生一些内部斗争。因为,他们希望你去使用 OpenCV 并购买他们自家生产的硬件(CPU / GPU 等)来执行算法。然而,OpenCV(Python)如谚语所说的红发小孩那样,并没有引起这些公司太大的关注。举个例子,我到现在还不清楚 OpenCV(Python)是否支持 透明 API 接口 。
- 运行时较慢 :相比起 C++,你在 Python 中的程序一般会运行地更慢。因为,在 C++ 里,你可以通过添加一个额外的力量去使用 GPU(使用 CUDA 或 OpenCL)。这比起 Python 的实现来说,要快上十倍速度。
- OpenCV 是使用 C/C++ 编写的 :作为一个开源库,其好处之一就是能根据你自身需求进行修改。如果你想要修改 OpenCV,你就必须得修改 OpenCV 的 C/C++ 源文件。
总结
作为一名工程师和能者,我们需要明白如何使用正确的工具去做正确的事情。在这个过程中,最终你会逐渐掌握所有的这些工具。作为我的一个经验法则,我会使用 MATLAB / OpenCV(Python)来编写新的算法,而产品的完成则使用 OpenCV(C++)。