图像处理利器OpenCV

OpenCV的全称:Open Source Computer Vision Library。

1999年,OpenCV项目由Intel位于俄罗斯的研发团队发起,旨在建立一个开源的计算机视觉库。从开发之日起就得到了迅猛发展,获得了众多公司和业界大牛的鼎力支持与贡献,因为是BSD开源许可,因此可以免费应用在科研和商业应用领域。

OpenCV可运行在Linux、Windows和MacOS操作系统上,它轻量级而高效,OpenCV中多数模块是基于C++实现的,其中有少部分是C语言实现的,当前OpenCV提供的SDK已经支持C++、Java、Python、MATLAB等语言应用开发,提供了图像处理和计算机视觉方面的很多通用算法和基础类库。

2006年OpenCV 1.0版本正式发布,2008年OpenCV获得了当时还如日中天的机器人公司Willow Garage的支持,不幸的是作为机器人业界的传奇,该公司于2014年倒闭了。

2009年对OpenCV产生重大影响的2.0版本发布了,它的最大变换是添加了C++接口,把OpenCV中很多C语言的数据和API进行了优化,目标是建立一个易用、类型安全、新功能、性能更加的版本。2012年OpenCV正式被非盈利组织OpenCV.org接管,维护其用户与开发者社区网站。2.0版本的用户非常庞大,至今仍在维护和更新。2015年OpenCV 3正式发布,除了架构的调整,还加入了更多算法,更多性能的优化和更加简洁的API,另外也加强了对GPU的支持。也就是说和Python一样,当前OpenCV也有两个大版本,OpenCV 2和OpenCV 3。相比OpenCV 2,OpenCV 3提供了更强的功能和更多方便的特性。 

核心功能包括:

二维和三维特征工具箱
运动估算
人脸识别系统
姿势识别
人机交互
移动机器人
运动理解
对象鉴别
分割与识别
立体视觉
运动跟踪
增强现实

从函数接口方面看,分为如下部分:

core:核心模块,主要包含了OpenCV中最基本的结构:矩阵、点线、形状等,以及相关的基础运算和操作。
imgproc:图像处理模块,包含和图像相关的基础功能:滤波、梯度、改变大小等,以及一些衍生的高级功能:图像分割、直方图、形态分析和边缘/直线提取等。
highgui:提供了用户界面和文件读取的基本函数,比如图像显示窗口的生成和控制,图像/视频文件的I/O等。
ml:机器学习算法模块,包含一些视觉中最常用的传统机器学习算法。

OpenCV的机器学习算法模块具体包括:

Boosting算法
Decision Tree学习
Gradient Boosting算法
EM算法
KNN算法
朴素贝叶斯分类
人工神经网络
随机森林
支持向量机

最近在用OpenCV,并翻了一下《Learning OpenCV》中文版,感觉在学校那会应该看过这本书,当时应该是为了弄明白什么是机器学习,这本书的第13章就叫做:机器学习,我觉得讲得很好:

机器学习的目的是把数据转换成信息。在学习了一系列数据之后,我们需要机器能够回答与这些数据有关的问题:其他还有哪些数据和本数据最相似?图像中有没有汽车?哪个广告最能得到消费者的响应?由于消费者经常考虑价格因素,这个问题会变为:在我们销售的所有产品中,如果要做广告,哪个产品会最热销?机器学习通过从数据里提取规则或模式来把数据转换成信息。

机器学习针对的数据经常被预处理成「特征」,机器学习算法分析我们收集的数据,分配权重、阈值和其他参数来提高性能,这个调整参数来达到目的的过程被称为「学习」,知道机器学习方法的性能很重要,而且这是一个精细的问题,如果分类器效果好,我们就有了一个有潜在价值的「模型」,我们可以在真实世界里应用它。

有的时候,数据没有标签,我们仅仅想根据边缘信息看看人脸倾向于哪个组,我们是对数据是否能自然归类感兴趣,这种学习算法叫「聚类算法」。有的时候,数据有标签,比如年龄。这类有标签的机器学习是「有监督」的,如果数据向量没有标签,则表明这种机器学习是「无监督」的。有监督的学习可以来判断种类,当我们赋予一个东西标签,表明我们在做「分类」,如果输出是数值,则表明我们在进行「回归」。有监督的学习也有一些模糊领域:它包括数据向量和标签的一一匹配,也包括「强化学习」,在强化学习中,数据标签能在单独的数据向量被观察之后存在很久。在强化学习中,系统获得一个延迟的信号,也叫「奖励」或「惩罚」,根据这个信号再推断下一步的策略。

这两个典型的机器学习任务:分类和聚类,与计算机视觉中两个基本任务:「识别」和「分割」,有共通之处。我们需要计算机判断物体是什么的时候,我们使用识别,我们需要计算机说出物体的位置的时候,我们使用分割。

OpenCV 包含了一些当前用得最多的统计机器学习方法,概率机器学习方法,像贝叶斯网络和图模型,在OpenCV中支持得比较少,部分原因是这些算法还很新,还在成长中,变化会很大。OpenCV倾向于支持「判别算法」,即通过给定数据来判断类别,而不倾向于「产生式算法」,产生式算法是通过给定类别来生成数据的分布。

这本书如今十年了。

 


本文2018-03-18 发于公众号:老王AI路,更多文章可扫描左侧二维码查看

你可能感兴趣的:(OpenCV)