您的位置:首页 > 理论基础

Opencv学习笔记_计算机视觉是什么?Opencv的起源

2017-09-24 18:09 417 查看
从0开始学习“OPENCV”第一天-概述
 
在学习任何一门新的语言或者框架时都应该了解这个行业的背景知识,正所谓工欲善其事,必先利其器!
                     一、Opencv概述
 
1.      什么是计算机视觉?计算机视觉有多难、
1.1     什么是计算机视觉?
1.2      
在说Opencv之前要说一下什么是计算机视觉,计算机视觉是在图像基础上发展起来的一门新兴学科,计算机视觉是研究让机器如何看世界,认识这个五彩缤纷的世界,就是让摄像头代替人眼来对目标进行识别,跟踪和测量,并进一步对捕获的图像数据(视频数据)转换成一种新的表达方式或者一个新的决策的过程!在转换过程中进行的转换都是为了达到某一目标。
 
举个列子:通过输入设备(摄像头、扫描仪)将前方1米处发现的物体输入到电脑中,并对这些数据进行处理,然后与数据库里的模型比对,那么最后得到的决策可能是前方有一辆汽车或者站着一个人,处理的过程可能是把彩色图像转换成单通道的灰色图(灰色图要比彩色图容易处理后面会说为什么),对图像降噪声,或者通过图像序列分析去除摄像机晃动的影响,这些转换过程/处理过程最终将会转换成一种新的决策,表达方式!
 
这里稍微补充一下什么是图像序列分析,这里说的图像序列分析和图像序列不同!
图像序列是就是一组图像(或者拍摄时的图像)的先后顺序!图像序列分析利用计算机视觉技术从一组图像序列中检测运动及运动物体并对其进行运动分析、跟踪或识别。图像序列分析在国民经济和军事领域的许多方面有着广泛的应用。 
随着计算机视觉的诞生,人工智能技术也随着和诞生,其中人工智能技术中生物识别技术能从计算机处理的图像数据(多维数据)中获取信息,并对这个信息进行识别,并做相应的处理,人工智能领域下有很多技术比如最著名的机器学习等等这里就不做太多的详细介绍,后面学到机器学习时会和大家详细介绍人工智能技术下各个领域作用!
因为计算机视觉是计算机学科所以在、工程、信号处理、物理学、应用数学和统计学、神经生理学和认知科学等都有研究方面,在制造
4000
业、检验、文档分析、医疗诊断、和军事等领域等各种智能/自主应用方面,都有非常广阔的前景发展!
 1.2计算机视觉实现起来难吗?人类本身是视觉动物,所以觉得人类觉得可以很容易实现计算机视觉,假如说让你从一个场景中找到一辆汽车,显然很容易,因为汽车本身较大,容易被眼睛所捕获,但是其中在捕获的过程中有着很复杂的过程: 
人脑将视觉信号划分入很多个通道,将各种不同的信息输入你的大脑。你的大脑有一个关注系统,会根据任务识别出场景的重要部分,并做重点分析,而其他部分则分析的较少。在人类视觉流中存在着大量的反馈,但是目前人类对之了解甚少,肌肉控制的传感器以及其他所有传感器的输入信息之间存在着广泛的关联,这使得大脑可以依赖从出生以来所学到的信息,大脑中的反馈在信息处理的各个阶段都存在,在眼睛(传感器)中也存在。在眼睛中反馈来调节通过瞳孔的进光量,以及调节视网膜表面上的接受单元!所以我们要想真正的实现一个人工智能产品的话就要把人类自己本身的所有信息模拟到计算机上,比如大脑=CPU,眼睛=摄像头,感官=传感器,并且要让之间协调工作,相对来说是非常复杂的!
 
其次计算机接受到的数据主要来源于摄像头,磁盘文件中的数值矩阵!
图1.1(取之“学习Opencv“)中的汽车有一个反光镜但是计算机只看到一组数值矩阵:



由于该图是单通道(黑白图)所以一个矩阵数值就可以表示一个像素点,如果是多通道的RGB颜色就需要三个数值表示,比如194 210 201表示一个像素点,而单通道194就可以表示像素点!
 
其中非常令人头疼的问题就是图像噪声
左:正常图片右:带图像噪声的图片



如果一张图里每个像素点上都掺杂着图像噪声的话会降低图像识别的准确率
图像噪声产生的问题主要来自输入设备(摄像机),造成摄像机产生图像噪声的几种原因如下:

1.     外部噪声:
即指系统外部干扰以电磁波或经电源串进系统内部而引起的噪声。如电气设备,天体放电现象等引起的噪声。
 
2.     内部噪声(分为四种):(1)由光和电的基本性质所引起的噪声。如电流的产生是由电子或空穴粒子的集合,定向运动所形成。因这些粒子运动的随机性而形成的散粒噪声;导体中自由电子的无规则热运动所形成的热噪声;根据光的粒子性,图像是由光量子所传输,而光量子密度随时间和空间变化所形成的光量子噪声等。(2)电器的机械运动产生的噪声。如各种接头因抖动引起电流变化所产生的噪声;磁头、磁带等抖动或一起的抖动等。(3)器材材料本身引起的噪声。如正片和负片的表面颗粒性和磁带磁盘表面缺陷所产生的噪声。随着材料科学的发展,这些噪声有望不断减少,但在目前来讲,还是不可避免的。(4)系统内部设备电路所引起的噪声。如电源引入的交流噪声;偏转系统和箝位电路所引起的噪声等。
 
3.     网络噪声
这个只是简单提一下一般的单机视觉开发一般用不到:网络噪声就是在通过UDP传输图像数据时因为网络不稳定造成传输时出现丢包的现象,导致传输过去的矩阵数值与原数值不一样,导致每个像素点上的值出现损坏的情况,每个像素点上就出现很多白色小斑点的图状物就叫图像噪声!
TCP不会出现图像噪声的问题,因为TCP为了确保数据的准确性,有重发机制,这里不做详细介绍,想详细了解可以在我的分栏里“网络层原理”这一栏中找到关于对TCP详细介绍的文章!
如果一个视觉系统里没有模式识别系统,自动控制的对焦和光圈,没有多年来的经验累计的视觉系统通常属于很低级的视觉系统!
4.     根据特征切割场景
除了噪声以外还有许多其他阻挡计算机视觉处理的难题,列如场景物体的干扰,在三维场景中重建二维图
场景物体的干扰:
假如我们要做一个能够自动把房间里掉地上的书捡起来放到书架上,那么我们需要从这个房间场景中找出我们所需要的目标物品:书。
假如说这个人的房间非常大或者在客厅,那么时首先如果从右到左或者从左到右采用地毯式的搜索的话会需要进行大量的分析算法同时因为CPU/ALT运算单元会进行过多的算法运算一直处于高电平状态。
会加快消耗机器人的电能,在这样的情况下我们可以告诉机器人书一般会在某个地方出现:书柜、桌子、床上,沙发的周边地区。
然后将这三个模型导入到捡书机器人的比对数据库里,首先一点是在拍摄这些配对模型时,要将物品放到最能表现其特征的地方:“正中心位置”。
 
为了让捡书机器人在比对模型时准确率更高可以为其比对模型添加一些隐含的变量:大小,重力方向以及其他变量,然后在比对时将捕获的床或者沙发进行分析推断出物品体积并通过机器学习技术不停的根据上下文解释信息进行建模训练,校正变量,让其准确率更高!
(这里说一下重力方向:给予重力方向的优点是可以通过目标物体的重力方向推断出该物体会在那个位置出现,这样在一个非常大的宫殿里寻找一张床,有了这张床的重力方向,可以以自身为中心并根据床的重力方向推断出大概会在那个方位!)
有了这些信息之后那么机器人可以很快的过滤掉场景中书籍不可能会掉落的地方,那么机器人可以很快的找出书籍并放到书架上!当然你也可以给机器人安装激光扫描仪使其捕获的物品体积使其在机器训练时用捕获的数据与模型数据进行校正时更加准确!
并且捡书机器人上的摄像机并非属于固定摄像机,固定摄像机对场景约束较多,但是可以通过这些约束简化问题,但是移动摄像机需要不停的变更场景,所以移动摄像机的场景约束较少,需要做更多的简化工作!
 
重建二维图
就像上面说的,要从一个房间里找到书可以根据特征来寻找加快寻找时间,那么在找到一个目标时首先要将这个目标转换成二维图,也就是说三维图是立体的,存在前后之分,而二维图不存在前后之分,只有宽高,为什么要转换成二维图?可以想一下图1是三维图图二是二维图(图像来源:http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/features2d/feature_homography/feature_homography.html)这一部分不必管是如何实现的!


二维图的方法就是从一个三维图(立体)中根据二维特征(平面)将二维数据提取出来并映射到另外一个图像数据上!
可以可看到二维图可以更好的方便识别所需表面特征!
1.     opencv还可以很好的修复图像中的畸变
 
下图列子展示了图像畸变和畸变后校正的图像(转自:http://www.cnblogs.com/Lemon-Li/p/3283059.html)
图一畸变图像



图像空间畸变图:



图二opencv畸变校正后的图像





现在先不管是如何利用opencv修复的,到后面的文章会慢慢和大家讲解!
图像畸变会给人一种凹凸的感觉,所以在视觉上看起来并不是特别美观!
 
二.  Opencv发展历程
1.       
早期在做图像处理时所需要的算法运算量是非常大的,所以那个时候在对图像做基础处理都要耗费很长的时间,正因如此1996年时lntel发布奔腾处理器时同时发布MMX指令集“看过我那篇“深度理解指令集”的朋友应该都对这个指令集有所了解“,MMX(后来的SSE)这种单指令多数据的多媒体指令集在运算时运算速度要比平常的图像算法快上几倍甚至几十倍,这才把图像处理从慢车道推向了快车道!
 
如果想深度了解MMX指令集的发展史可以去看我那篇“深度理解指令集”的最后一段!
 
可是如果想要使用MMX(SSE)指令集的话必须会汇编语言才行,所以基于汇编的算法开发和优化需要耗费时间比较长。
所以后来Intel基于
de87
MMX(SSE)指令集推出了IPL库,IPL是基于MMX指令集,后来因为MMX指令集的缺陷推出SSE指令集同时推出封装SSE指令集的IPP库,换句话说IPP库就是基于IPL库的!
 
MMX(SSE)指令集里包含的大多都是对图像处理的基础函数,在对图像进行复杂处理时短时间里比较难以实现,而且MMX(SSE)指令集是非开源的,在那个年代追求效率的企业都希望既能开发出性能优越的视觉系统,提高开发效率,降低开发成本,所以后来1999年Intenl启动CLV项目主要目标是人机界面,能被UI调用的实时计算机视觉库,为Intel处理器做了特定优化。
 
后来2000年6月正式发布的第一个在Windows平台下第一个Opencv开源版本“OpenCV alpha 3”同年12月发布在Linux平台下“OpenCV beta 1”开源版本。
Opencv不仅开源免费,内部对图像处理的函数非常丰富,内部函数的实现一般都使用IPP库做优化,同上其实Opencv并不是完全开源,因为IPP库是非开源的,所以内部使用IPP做优化的函数属于非开源没有使用IPP做优化的属于开源,可以说Opencv属于半开源的项目!
 
2.     可移植性
Opencv采用C/C++编写在不同的系统环境上只要稍微修改一下代码就可以编译通过,可以在Mac/Linux/Windows系统上运行,并且为python,Ruby,MATLAB等编程语言提供接口!
 
3.     运行效率
Opencv在设计时的目标就是执行速度尽量快所以内部函数都是标C函数来编写的,如果想要起到硬件加速(内部函数用IPP优化)需要购买IPP库,购买IPP库后Opencv在运行时会自动调用IPP库做优化!
 
4.     应用领域
目前Opencv应用领域非常广泛,在医疗设备、工厂检验、立体视觉、机器学习、人脸别识别、图像拼接、生物医学分析、无人机、等人工智能领域有广泛应用!
甚至计算机视觉可以用在声谱图上,对声音和音乐进行分析!
并且计算机视觉被广泛应用于工厂检验,大规模的产品制造在流水线上的某一环节都使用计算机视觉做检测!
 
5.     Opencv目标
Opencv的目标是为解决计算机视觉提供基本工具,当然在有些情况下,Opencv还提供了许多高层函数用于解决复杂式图像处理,当然如果没有这些高层函数也完全可以基于Opencv提供的基础函数上建立一个完整的解决方案,在用Opencv建立一个解决方案时,尽管这个解决方案不是特别完美,但是有了第一个解决方案之后,便会从这个解决方案中找到许多不足的地方,但是可以基于这个解决方案之上来不停的对其优化整改,到一套完整的解决方案体系,虽然说很难达到十全十美但是达到十全九美就可以了,当然解决方案的不足也可以通过系统所使用的环境来解决,比如要识别出场景中这个人的身高,可以为计算机安装激光红外扫描仪来精准的捕获目标物体的身高并输入到计算机里更加方便的处理数据!
6.     Opencv库组成体系(取自:学习Opencv图1-5)
这些体系可能与你当前使用的Opencv版本不同



图中没用包含CvAux模块,因为该模块中一般包含一些即将淘汰的算法和函数(比如基于嵌入式隐马尔可夫模型的人脸识别等等),所以如果突然有一天你发现你要使用的基于某个算法写出来的函数不见了,可以到这个模块里或许能找到!

1.     版权
Opencv开源协议允许你使用Opencv库的全部代码,生成商业产品,并且不需要公开源代码,或对Opencv库中的算法改善后的算法!
 
2.     预备
在学习Opencv之前要懂得C/C++编程,和一些数学基础!
 
3.     总结
1.Opencv第一个windows版本是2000年6月推出的,“OpenCV alpha 3”同年12月发布在Linux平台下!
2.Opencv第一个开源版本是OpenCV beta 1
3.Opencv是属于Intel公司的一个开源项目(IPP不开源),
4.Opencv目前可以运用在制造业、机器学习、生物识别、检验、文档分析、医疗诊断、和军事等领域等各种智能/自主应用方面,应用范围非常广泛!
5.Opencv源代码是C/C++编写的,如果想要调用IPP库加速内部函数代码需要购买!
6.Opencv库可以在Windows、Linux、Mac平台下运行,并为python,Ruby,MATLAB等流行编程语言提供接口
7.opencv是由cv(图像处理和视觉算法),mll(统计分类器),highgui(GUI/图像和视频输入/输出),cxcore(基本结构和算法,xml支持,绘图函数),五大模块组成!
8.图像识别令人最头疼的地方是图像噪声,场景重塑
9.图像噪声产生原因由:外部噪声,内部噪声,还有网络噪声。
10.图像序列是就是一组图像(或者拍摄时的图像)的先后顺序!
11.图像序列分析是对一组已经排序好的图像进行运动分析!
12.图像分析分为两种:实时分析,非实时分析
13.实时分析就是对输入设备里的数据进行实施动作分析,而非实时分析就是对一组有序存储于本地存储器上的图片进行动作分析!
14.想要真正实现一个完全人工智能视觉产品是很复杂的,其中要考虑到很多复杂因素!

练习:安装Opencv练习
因为博主目前是在Windows领域下用Opencv库编程开发,所以单独写了一篇博客“VisualStudio2013配置安装Opencv2.4.9
有需要的可以去看下我的这篇安装教程写的非常详细-点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: