OpenCV (C++ vs Python) vs MATLAB for Computer Vision (译)

从国外Blog上找到一篇文章, 解答了我的一些问题, 在此冒昧翻译一下, 做个备忘且分享给对此感兴趣的朋友。
原文地址:
http://www.learnopencv.com/opencv-c-vs-python-vs-matlab-for-computer-vision/
翻译如下:
我们经常会被各类工具搞晕。打个比方,工具可以帮助你打磨你的作品,但它不能使你成为一个好的手艺人。好的手艺人兜里会有各种不同的工具,但他会明智的选择最适合当前工作的那个。与他紧密结合的不是那些工具,而是那件艺术品本身。
我经常被那些“哪种编程语言更好”的争论逗乐。人们对哪种语言更好有着强烈的看法。而真相是程序员需要选择合适的编程语言来解决问题:快速搭建Web App需要使用Ruby on Rails或者Django;要开发在嵌入式系统中高性能运行的代码,试试C吧。
在CV中,我们面临的同样的选择。CV工程师/程序员需要学习哪个工具—OpenCV (C++),OpenCV (Python)还是MATLAB?好消息是我们现在有了这些选项可以选择。在10年前没有好的CV库可以使用的情况下,如果你想学习CV,你需要拿起书,编写自己的小型CV算法库。但现在好多了。。。
如果你是初学者,我建议你选择阻力最小的路径,并且使用你熟悉的工具。如果你是Python程序员,就用OpenCV Python;如果你了解C++,就用OpenCV C+±–对于MATLAB也是一样。也就是说,几个月后,你不再是一个初学者时,你可以尝试使用这些新知识解决实际问题,或者在这个领域找个新的工作。我在这里有些想法,可以帮助你进行选择:

MATLAB

以前CV只是一个研究领域,从事CV研究的人大多是在实验室中工作。他们能选的工具只有MATLAB,而且在很长时间里,OpenCV都被局限在同MATLAB的比较以及社区需要提供的功能中。直到这几年,这个趋势才有所改变。
###下面是MATLAB的一些优点:

  1. 强大的Matrix支持:在CV领域,我们不仅可以将图像看作是多维的矩阵,我们还需要在不同的算法中应用线性代数知识。MATLAB的线性代数支持库不仅强大,而且还快(当然,在正确使用的情况下)。假如我们要在算法中,解决一些大的、线性相关的问题时,可能只需要一行代码—如X = A \ b。我们曾经假设C++实现要比MATLAB实现要快3倍,但是,呵呵!我们的第一版代码比MATLAB版要慢。而且花了几天时间之后,C++实现也仅仅和MATLAB版本实现的性能相当而已。在MATLAB中单个操作符(Operator)有时是一堆强大算法的合集(如,\),MATLAB只是选择了一个最适合当前问题的算法;
  2. 工具箱:无论你需要什么,都有对应的工具箱支持。如Image Processing Toolbox、Computer Vision Toolbox以及Statisitcal and Machine Learning Toolbox,实现了大量的算法。这些功能函数通常还提供简洁的接口。许多CV相关的问题都可以认为是优化问题,通常我们要在一些特定的情况下最大或最小化目标函数(Objective Function),而Optimization Toolbox提供的大量的优化实现;
  3. 可视化与调试工具:MATLAB有趣的地方还有就是:提供了写代码、可视化结果和调试代码集成环境,可以起到事半功倍的效果;
  4. 与OpenCV集成:基于MATLAB的OpenCV接口,可以与OpenCV协同工作;
  5. 文档支持:没有对比就没有伤害,即使是OpenCV的死忠粉,也认为OpenCV的文档太恶心了。而MATLAB,在IDE中就可以方便的查看文档。这使得使用MATLAB开发比OpenCV快2倍以上。接口参数的设置也优于OpenCV,如imshow,大多数情况下,开发人员没兴趣给OpenCV版imshow要求的窗体命名;
  6. 庞大的社区支持:MATLAB在学术界极其知名。最新的研究成果通常以MATLAB代码提供展示。如果你想走在最前面,那就得学会读MATLAB代码。
    ###下面是MATLAB在CV领域的一些缺点:
  7. 贵!:贵的无耻,基础版$2,150,CV Toolbox $1,350。CV Toolbox还需要Image Processing Toolbox$1000。Optimization$1,350,Machine Learning$1000,加一起要$6,850!这些还不够,程序部署时要编译,MATLAB Compiler$4,250。嗯?还要多OS支持,再来$4,250。如果你是在学校里或者公司已经购买过License,倒是可以打个折;
  8. 学习曲线:MATLAB基于矩阵引擎(Matrix Engine)实现。如果不习惯MATLAB的开发方式,仅以C++开发思路实现的话,性能极差;
  9. 执行性能:典型的MATLAB代码执行性能比C++差很多。尽管内置的代码性能很好,但大多数情况下,我们写的代码会非常慢。通常我们需要将代码运算的热点部分用C开实现,然后使用mex与MATLAB集成在一起使用。
    ##OpenCV(C++)
    OpenCV是我主要的CV工具。原型开发时,我采用MATLAB;但如果需要产品化,CV的代码会采用OpenCV实现。下面来看看OpenCV(C++)的优缺点:
    ###OpenCV(C++)的优点:
  10. 免费:大部分的OpenCV组件不用花钱。你可以在商用的软件中免费使用OpenCV,而且不需要开源,你可以免费浏览和修改OpenCV的代码;
  11. 大量且优化过的算法:OpenCV提供了大量的算法,而且这此算法针对性能做出了优化。在OpenCV3中,你还可以使用TAPI,使得与OpenCL的集成变得更容易。许多其它的算法还提供CUDA版本;
  12. 平台与设备支持:OpenCV可以用在Desktop上,或者Web App的后端。由于对性能的追求,使得许多嵌入式与移动CV应用选择采用OpenCV来实现;
  13. 大社区支持:超过47,000的开发者使用且为OpenCV提供支持,超过9,000,000的下载。不像MATLAB社区多由学术人员构成,OpenCV社区由各行业人员构成。OpenCV的开发者包括像Intel,AMD&Goolge等公司。不用说这篇文章也是来自于这些活跃的社区;
    ###OpenCV(C++)的缺点:
  14. 对新人不够友好:如果C++底子不够,使用OpenCV(C++)会比较难。也许用Python版会好很多;
  15. 文档比较挫:OpenCV的文档很差。有时你要理解算法逻辑,还得去读对应的论文,因为OpenCV文档中,没明确说明接口参数的含义。文档中通常也没有参考代码,这也加重的理解的难度。有参考代码的文档,也缺少对代码的注释。希望这些在以后的开发中,会有改善;
  16. 缺乏机器学习的支持:CV工程师会经常需要Machine Learning工具支持。OpenCV中,相比OpenCV(Python)版本,Machine Learning支持的比较少;
  17. 可视化与调试:在C++环境中,可视化与调试比较麻烦,尤其是新设计一个算法时。有时我会采用MATLAB来分析数据。。。;

OpenCV(Python)

Python针对OpenCV绑定对OpenCV的流行有很大帮助。用这个来学习OpenCV是个不错的选择,而且对于大多数的应用来说也足够了。下面来看一下优缺点:
###优点:

  1. 容易使用:对于Python程序员来说,使用OpenCV(Python)非常容易(Python比C++容易多了);
  2. Python已经成为一门科学计算语言:前几年,MATLAB还被称为科学计算语言,但现在,OpenCV、NumPY、SciPY,Scikit-Learn和Matplotlib Python已经提供了强大的环境来开发与验证CV与ML算法;
  3. 可视化与调试:使用OpenCV(Python)时,可以访问大量的Python支持库。采用Matplotlib可视化可以达到与MATLAB相同的效果。采用Python调试比C++容易,但与MATLAB相比,还差一些;
  4. 构建Web后端:Python还是一门流行的网站设计语言,如Django,Web2py与Flask等框架可以快速集成Web应用。
    ###OpenCV(Python)缺点:
  5. 文档同样比较挫:比OpenCV(C++)还差;
  6. 缺少支持:Intel, AMD & NVidia对OpenCV的支持是希望开发者购买他们的硬件(CPUs,GPUs)来运行这些算法。他们对OpenCV(Python)没任何兴趣。比如,什么时间Python能支持TAPI,现在根本无法想像;
  7. 运行时的性能问题:与C++比,Python版运行速度会比较差。在OpenCV(C++)中,我们可以通过GPU加速,达到10倍以上的性能提升;
  8. OpenCV是采用C++设计的:如果要修改OpenCV代码,需要在C++中进行。
    ##总结
    作为工程师来说,我们需要采用正确的工具。一句话总结我的经验:原型阶段采用MATLAB/OpenCV(Python),实施阶段采用OpenCV(C++)。

猜你喜欢

转载自blog.csdn.net/coroutines/article/details/62037416
今日推荐