[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是 ...
随机推荐
- Nebula Graph介绍和SpringBoot环境连接和查询
Nebula Graph介绍和SpringBoot环境连接和查询 转载请注明来源 https://www.cnblogs.com/milton/p/16784098.html 说明 当前Nebula ...
- CRT & EXCRT 学习笔记
这玩意解决的是把同余方程组合并的问题. CRT的核心思想和拉格朗日插值差不多,就是构造一组\(R_i\)使得$\forall i,j(i \neq j) $ \[R_im_i = 1, R_im_j ...
- CentOS 7 安全基线检查
注意:操作时建议做好记录或备份 1.设置密码失效时间 | 身份鉴别 描述: 设置密码失效时间,强制定期修改密码,减少密码被泄漏和猜测风险,使用非密码登陆方式(如密钥对)请忽略此项. 加固建议: 使用非 ...
- 成功解决Initialization failed for ‘https://start.spring.io‘ Please check URL, network and proxy settings
文章目录 1.问题描述 2.问题的解决方式 2.1 查看网络连接问题 2.2 设置代理 2.3 直接连接阿里云下载模板 1.问题描述 建立springboot项目的时候发现不能初始化成功,我真的栓Q ...
- web3.0、比特币、区块链、元宇宙,以及那些待收割的韭菜们!
前几天看到周星驰在社交账号上招聘web3.0的人才,感觉有必要说说web3.0,当然不是基于技术层面,而是从另一个维度说说web3.0以及其它相关的概念,从而做到如何反欺诈,如何避免被资本割韭菜.想到 ...
- 知识图谱顶刊综述 - (2021年4月) A Survey on Knowledge Graphs: Representation, Acquisition, and Applications
知识图谱综述(2021.4) 论文地址:A Survey on Knowledge Graphs: Representation, Acquisition, and Applications 目录 知 ...
- python批量加密文件
1.文件名的加密与解密 #coding:utf-8 from docx import Document import os,sys from docx.oxml.ns import qn def fi ...
- NAS数据存储之NFS搭建和使用
NFS是主流异构平台的共享文件系统之一,能够支持在不同类型的系统之间通过网络进行文件共享,允许一个系统在网络上与他人共享目录和文件.NFS传输协议用于服务器和客户机之间的文件访问和共享通信,从而使客户 ...
- DQL语句排序与分组
DQL语句排序与分组 一.DQL-排序 排序是计算机内经常进行的一种操作,其目的是将一组"无序"的记录序列调整为"有序"的记录序列.分内部排序和外部排序,若整个 ...
- Element基本组件
Element按钮组件: <el-row> <el-button>默认按钮</el-button> <el-button type="primary ...