[OpenCV实战]40 计算机视觉工具对比
文章目录
1 简介
我们经常将自己的工具与工艺混淆。工具可以帮助您练习手工艺品,但不能使您成为优秀的工匠。一个好的工匠的口袋里有很多不同的工具,所以她明智地使用了适合该工作的工具。她还没有嫁给这些工具。她嫁给了自己的手艺。
我经常被关于编程语言好坏的战争逗乐,人们对哪一种更好有很强的看法。事实是程序员应该选择适合其任务的语言。是否想快速构建Web应用程序?尝试使用Ruby on Rails或Django。想要为嵌入式设备编写高性能代码。尝试C。
在计算机视觉中,我们面临着类似的选择。计算机视觉工程师/程序员应该学习哪种工具-使用C++的OpenCV,使用Python的OpenCV或MATLAB?好消息是,今天我们有几种选择!十年前,还没有很好的计算机视觉库。如果您想学习,只需拿起一本书,然后开始编写自己的微型计算机视觉算法库即可。幸运的是,现在情况好多了。
如果您是初学者,我建议您使用阻力最小的路径,并选择一个您熟悉的工具。如果您是python程序员,请结合使用OpenCV和Python。如果您了解C++,请将C++与OpenCV一起使用。对于MATLAB同样如此。也就是说,几个月后您将不再是初学者。您可能希望将这些新获得的知识应用于现实世界。您可能正在考虑一个新的项目,或者在这个领域寻找新工作。知道如何做出选择是有必要的(有时是字面上的意思)。所以这是我的想法。
2 适用于计算机视觉的MATLAB
直到最近,计算机视觉还是一个研究领域,在它的婴儿时期。从事计算机视觉工作的人大多在学术界或研究实验室工作。他们选择的工具是MATLAB,最长一段时间以来,OpenCV与MATLAB及其社区提供的工具相比相形见绌。在过去的7年里,潮流已经改变了。下面是使用MATLAB的一些优点。
2.1 为什么要使用MATLAB进行计算机视觉:优点
- 强大的矩阵库:我们不仅将图像视为计算机视觉中的多维矩阵,而且在各种算法中使用了大量的线性代数。MATLAB的线性代数例程非常强大且运行迅速(正确使用时)。一旦我们需要解决大型稀疏线性系统作为算法的一部分。这是MATLAB中的一行代码-类似于X = A \ b。我们假设我们的C++实现至少比MATLAB实现快3倍。事实证明,我们的C++实现的第一个版本比MATLAB版本要慢!我们花了几天的时间来匹配MATLAB例程的性能。因此,在MATLAB中,像反斜杠(\)这样的单个运算符有时是MATLAB会为您适当选择的强大算法的集合。
- 工具箱:无论您需要什么,都有一个工具箱。他们有一个图像处理工具箱,一个计算机视觉工具箱以及一个统计和机器学习工具箱,它们提供了各种非常有用的算法的实现。这些功能通常提供一个干净明显的界面。通常将许多计算机视觉问题设置为优化问题。您正在尝试在某些约束下最大化或最小化某些目标函数。MATLAB中的优化工具箱提供了许多优化算法的出色实现。
- 可视化和调试工具:使用MATLAB的乐趣之一是编写代码,可视化结果并在一个集成环境中进行调试。环境使您的工作效率极高。
- 与OpenCV兼容:您可以使用MATLAB的OpenCV接口与OpenCV交互。
- 出色的文档资料:即使是OpenCV的坚定支持者也承认,其文档资料很糟糕。相反,MATLAB附带了出色的文档和示例,可在IDE中轻松访问。仅凭出色的文档,就可以比使用OpenCV更快地在MATLAB 2x中进行编码。与OpenCV相比,MATLAB函数的设计也更好。例如,比较此简单代码以在OpenCV和MATLAB中显示图像。
大多数时候,我只想显示图像。matlab将其称为“im”,而不是强迫我一遍又一遍地键入窗口名称(“ myWindow”)。// MATLAB
imshow(im); // OpenCV
imshow("myWindow", im);
- 大型研究社区:正如我之前提到的,MATLAB在学术界非常流行。最新的研究演示经常作为MATLAB代码共享。如果您想站在最前沿,那么您应该能够阅读MATLAB代码。
2.2 为什么不应该将MATLAB用于计算机视觉:缺点
- 昂贵的软件使用费:MATLAB非常昂贵(如果你是其他方式哈哈,你懂的那就忽略这条)。如果您通过大学以折扣价获得MATLAB,或者您的公司拥有许可证,则MATLAB是有意义的。
- 学习曲线:MATLAB是矩阵引擎。有一种MATLAB编写代码的方式,与通用编程语言(如C++或Python)不同。而且,如果您不以MATLAB方式编写代码,则代码编写可能会非常慢。
- 运行时间慢:典型的MATLAB程序运行速度比C++程序慢许多倍。内置的MATLAB例程可以非常快,但是用MATLAB编写的代码通常运行得慢得多。通常,人们最终会用C编码计算密集型部分。
3 适用于计算机视觉的OpenCV(C++)
OpenCV是开发计算机视觉应用程序的主要工具。大部分人的生产版本一直都是基于OpenCV的。让我们看一下利弊。
3.1 为什么要使用OpenCV(C++)进行计算机视觉:优点
- 免费!:OpenCV的大部分内容都是免费的-即像演讲一样免费!您可以在商业应用程序中自由使用OpenCV,并且可以查看源代码并根据需要解决问题。如果使用OpenCV,则不必开源项目。
- 庞大的优化库:OpenCV中可用的算法还针对性能进行了优化。使用OpenCV3,您可以使用Transparent API轻松使用计算机上符合OpenCL的设备(例如GPU)。许多算法都有CUDA实现。
- 平台和设备:显然,您可以在桌面应用程序中或Web应用程序的后端使用OpenCV。由于OpenCV(C / C++)注重性能,因此它是许多嵌入式视觉应用程序和移动应用程序中选择的视觉库。
- 大型社区:有一个使用并支持OpenCV的大型开发人员社区(约有4.7万)。它已被下载超过900万次。与由研究人员组成的MATLAB社区不同,OpenCV社区是来自许多领域和行业的人们的混合体。OpenCV开发由英特尔,AMD和Google等公司资助。不用说,这个博客是这个互相帮助的人的活跃社区的一部分。
3.2 为什么不应该将OpenCV(C++)用于计算机视觉:缺点
- 初学者比较难:如果您没有C++编程经验,那么使用OpenCV(C++)将会令人生畏。您可能最好改用Python。
- 文档薄弱: OpenCV文档不好。有时您需要对算法有一个很好的了解,并实际阅读本文,因为文档并不总是解释参数的含义以及它们如何影响结果。该文档并不总是附带示例代码,这使得它很难理解。OpenCV附带的示例代码虽然非常有用,但是也没有很好地记录下来。我们只是说这是正在进行的工作,人们正在努力改善它。
- 小型机器学习库:计算机视觉工程师经常需要许多机器学习例程。与使用OpenCV(Python)时可用的选择相比,OpenCV拥有少量的机器学习算法。
- 可视化和调试:在任何C++环境中,调试和可视化都很困难。如果您要从头开始提出新算法,则尤其如此。许多研究者有时将数据转储到磁盘,然后使用MATLAB进行分析
4 适用于计算机视觉的OpenCV(Python)
相信OpenCV的python版本为其流行度做出了很大贡献。它是学习计算机视觉的绝佳选择,并且足以满足各种实际应用。让我们看一下利弊。
4.1 为什么要使用OpenCV(Python)进行计算机视觉:优点
- 易用性:如果您是python程序员,则使用OpenCV(Python)将非常容易。Python是一种易于学习的语言(特别是与C++相比)。它也是一种很好的学习第一语言。
- Python已成为科学计算的语言:几年前,MATLAB被称为科学计算的语言。但是现在,有了OpenCV,numpy,scipy,scikit-learn和matplotlib Python为学习和尝试计算机视觉和机器学习提供了强大的环境。
- 可视化和调试:使用OpenCV(Python)时,您可以访问为Python编写的大量库。使用matplotlib的可视化效果与MATLAB差不多。我发现在Python中调试代码比在C++中更容易,但是它与MATLAB的超级易用性并不完全匹配。
- 建立网站后端: Python也是建立网站的流行语言。诸如Django,Web2py和Flask之类的框架使您可以快速组合Web应用程序。将OpenCV(Python)与这些Web框架一起使用非常容易。
4.2 为什么不应该将OpenCV(Python)用于计算机视觉:缺点
- 薄弱的文档:如前所述,OpenCV(C++)文档不是很好。但是python文档更加糟糕。新手用户只能猜测如何使用某些功能。例如,在撰写本文时,几乎找不到cv2.Subdiv2D的python文档。您还会发现有关OpenCV(Python)的教程较少。
- 缺乏支持:支持OpenCV的公司(英特尔,AMD,NVidia等)在使用C++版本的OpenCV时遇到了麻烦。他们希望您使用OpenCV并购买其硬件(CPU / GPU等)来运行这些算法。但是,OpenCV(Python)似乎是红头发的继子,似乎并没有引起他们的注意。
- 运行时间更慢:与C++相比,Python中的程序运行通常会更慢。要增加额外的麻烦,您可以在OpenCV(C++)中使用GPU(使用CUDA或OpenCL),并使代码运行速度比Python实现快10倍。
- OpenCV用C / C++编写:开源库的一大优点是可以修改它们以满足您的需求。如果要修改OpenCV,则必须修改C / C++源。
5 总结
作为工程师和工匠,我们需要使用正确的工具来完成正确的工作。最终,您必须学习此行业中的所有工具。根据经验,使用MATLAB / OpenCV(Python)制作新算法的原型,并在生产中使用OpenCV(C++)这是最合适不过的。
文章备份
https://luohenyueji.gitee.io
6 参考
[OpenCV实战]40 计算机视觉工具对比的更多相关文章
- OpenCV实战:人脸关键点检测(FaceMark)
Summary:利用OpenCV中的LBF算法进行人脸关键点检测(Facial Landmark Detection) Author: Amusi Date: 2018-03-20 ...
- [OpenCV实战]49 对极几何与立体视觉初探
本文主要介绍对极几何(Epipolar Geometry)与立体视觉(Stereo Vision)的相关知识.对极几何简单点来说,其目的就是描述是两幅视图之间的内部对应关系,用来对立体视觉进行建模,实 ...
- 关于《精通移动App测试实战:技术、工具和案例》图书勘误信息
首先,对由于我们工作的疏忽向<精通移动App测试实战:技术.工具和案例>读者朋友们表示歉意,同时已将这些问题反馈给了出版社编辑同志,再版时将会统一修正: 其次,勘误信息请参看附件pdf文档 ...
- Gulp vs Grunt 前端构建工具对比
Gulp vs Grunt 前端工程的构建工具对比 1. Grunt -> Gulp 早些年提到构建工具,难免会让人联想到历史比较悠久的Make,Ant,以及后来为了更方便的构建结构类似的Jav ...
- Git管理工具对比(GitBash、EGit、SourceTree)
Git管理工具对比(GitBash.EGit.SourceTree) GitBash是采用命令行的方式对版本进行管理,功能最为灵活强大,但是由于需要手动输入希望修改的文件名,所以相对繁琐. EGit是 ...
- 第三方统计分析埋点工具对比,神策、Ptmind、GrowingIO、国双,还有谷歌分析,谁更好?
第三方统计分析埋点工具对比,神策.Ptmind.GrowingIO.国双,还有谷歌分析,谁更好?https://www.colabug.com/2985393.html GA.Mixpanel 和神策 ...
- Git管理工具对比(GitBash、EGit、SourceTree)(转载)
Git管理工具对比(GitBash.EGit.SourceTree) GitBash是采用命令行的方式对版本进行管理,功能最为灵活强大,但是由于需要手动输入希望修改的文件名,所以相对繁琐. EGit是 ...
- Git版本管理工具对比(GitBash、EGit、SourceTree)
Git管理工具对比(GitBash.EGit.SourceTree) GitBash是采用命令行的方式对版本进行管理,功能最为灵活强大,但是由于需要手动输入希望修改的文件名,所以相对繁琐. EGit是 ...
- GitBash、EGit、SourceTree三个Git管理工具对比
Git管理工具对比(GitBash.EGit.SourceTree) GitBash是采用命令行的方式对版本进行管理,功能最为灵活强大,但是由于需要手动输入希望修改的文件名,所以相对繁琐. EGit是 ...
随机推荐
- Java递归查找层级文件夹下特定内容的文件
递归查找文件 引言 或许是文件太多,想找某个文件又忘记放哪了;又或者是项目改造,需要将外部调用接口进行改造,项目太多,又无法排查.那么怎么快速找到自己想要的内容就是一件值得思考的事情了. 根据特定内容 ...
- Ajax的使用(jquery的下载)
Ajax学习笔记(jquery的下载) JQuery的官网下载 地址:http://jquery.com 右上角的"Download JQuery" 三个可供下载的文件: Prod ...
- 你真的会使用Typora吗?
你真的会使用Typora吗? 标题 一级标题:# 空格+内容 二级标题:## 空格+内容 字体 加粗:内容两边各加两个*号 你真美! 斜体:内容两边各加一个*号 你真帅! 删除线:两边各加两个~号(波 ...
- LcdTools如何自定义读写PX01 SSD2828寄存器
LcdToos打开相应的工程文件,连接PX01并开启点亮屏使LcdTools开关处于开启状态. 切到"测试设置"栏,在"Bridge控制"栏,在"Ad ...
- 是什么让.NET7的Min和Max方法性能暴增了45倍?
简介 在之前的一篇文章.NET性能系列文章一:.NET7的性能改进中我们聊到Linq中的Min()和Max()方法.NET7比.NET6有高达45倍的性能提升,当时Benchmark代码和结果如下所示 ...
- docker容器化业务
1.环境准备: 设备 IP地址 作用 系统版本 mysql-master 192.168.100.213 Nginx-Web服务器 Ubuntu2004 mysql-slave 192.168.100 ...
- JS逆向实战7-- 某省在线审批网站params 随机生成
参数分析 我们首先通过抓包 发现这个就是我们所需要的数据 然后我们通过fidder 发起请求 结果: 通过我们反复测试 发现这个params的参数是每次请求中都会变化的 断点查找 我们通过 这个t参数 ...
- Java单例模式,看这一篇就够了
在创建型设计模式中,我们第一个学习的是单例模式(Singleton Pattern),这是设计模式中最简单的模式之一. 单例是什么意思呢? 单例就是单实例的意思,即在系统全局,一个类只创建一个对象,并 ...
- loguru库使用
参考: https://github.com/Delgan/loguru https://loguru.readthedocs.io/en/stable/overview.html https://b ...
- RK3568开发笔记(五):在虚拟机上使用SDK编译制作uboot、kernel和ubuntu镜像
前言 buildroot虽然灵活,但是基于实际情况,本身是侧重驱动和应用定制开发的只定制一次文件系统投入有点多,还不如直接ubunt自己交叉编译依赖库,做一些库的移植裁剪. 于是本篇就使用ubu ...