您的当前位置:首页机器视觉&图像处理学习笔记(基于OpenCV)

机器视觉&图像处理学习笔记(基于OpenCV)

2020-03-06 来源:乌哈旅游
OpenCV学习笔记

收集者:M.E. Email:zhong1980me@163.com

OpenCV核心功能一览:

 图像数据的操作 ( 分配、释放、复制、设置和转换)。

 图像是视频的输入输出I/O (文件与摄像头的输入、图像和视频文件输出)。

 矩阵和向量的操作以及线性代数的算法程序(矩阵积、解方程、特征值以及奇异值等)。  各种动态数据结构(列表、队列、集合、树、图等)。

 基本的数字图像处理(滤波、边缘检测、角点检测、采样与差值、色彩转换、形态操作、直

方图、图像金字塔等)。

 结构分析(连接部件、轮廓处理、距离变换、各自距计算、模板匹配、Hough变换、多边形

逼近、直线拟合、椭圆拟合、Delaunay 三角划分等)。

 摄像头定标(发现与跟踪定标模式、定标、基本矩阵估计、齐次矩阵估计、立体对应)。.  运动分析(光流、运动分割、跟踪)。

 目标识别(特征法、隐马尔可夫模型:HMM)。

 基本的GUI (图像与视频显示、键盘和鼠标事件处理、滚动条)。  图像标注(线、二次曲线、多边形、画文字)

一、基本知识

灰度。可简单理解为亮度。灰度为0时表示没有亮度,显示为黑色。灰度为255时表示最大亮度,显示为白色。

色彩。常见为RGB(red,green,blue)色彩体系,这是一种设备友好的色彩坐标体系。RGB三元色中,可根据不同颜色分量合成其它颜色,但这也是其图像处理时容易出现多种计算可能的地方,所以个人认为应用RGB色彩体系处理图像是不利的。因此实际处理彩色图像时,一般将其转化为HSV(hue,saturation,vale:色度,饱和度,亮度)色彩体系。

HSV图像中,可通过通道分解获得H通道数据,这是颜色信息所在的通道,一般不具有其他多种颜色混合的可能。H分量是HSV模型中唯一跟颜色本质相关的分量。只要固定了H的值,并且保持S和V分量不太小,那么表现的颜色就会基本固定。H分量是代表颜色特性的分量,用角度度量,取值范围为0~360,从红色开始按逆时针方向计算,红色为0,绿色为120,蓝色为240。S分量代表颜色的饱和信息,取值范围为0.0~1.0,值越大,颜色越饱和。V分量代表明暗信息,取值范围为0.0~1.0,值越大,色彩越明亮。但是要注意:颜色判断时光判断H分量的值是否就足够了?事实上是不足的。固定了H的值以后,如果移动V和S会带来颜色的饱和度和亮度的变化。当V和S都达到最高值,也就是1时,颜色是最纯正的。降低S,颜色越发趋向于变白。降低V,颜色趋向于变黑,当V为0时,颜色变为黑色。因此,S和V的值也会影响最终颜色的效果。可以设置一个阈值,假设S和V都大于阈值时(矩形框),颜色才属于H所表达的颜色,例如下图所示蓝色区域的选择。

其余色彩体系如YCrCb(亮度,红色比例,蓝色比例)等比较少用了。如果无需色彩体系,可直接转化为灰度图,可大幅降低数据处理量。

二、图像几何变换

平移、缩放、扭曲、旋转是图像的几何变换,把一幅图像中一个位置的像素重映射到另一个位置,又分为仿射变换(基于2×3矩阵进行的变换)和透视变换(基于3×3矩阵进行的变换,又叫做单应性映射)。仿射变换可以将矩形转换成平行四边形,它可以将矩形的边压扁但必须保持边是平行的,也可以将矩形旋转或者按比例变化。透视变换提供了更大的灵活性,一个透视变换可以将矩阵转变成梯形。当然,平行四边形也是梯形,所以仿射变换是透视变换的子集。仿射变换利用cvWarpAffine/cvGetAffineTransform解决密集映射,用cvTransform解决稀疏映射(例如对一系列独立点的映射)。透视变换利用cvWarpPerspective/cvGetPerspectiveTransform解决密集映射,利用cvPerspectiveTransform/cvGetPerspectiveTransform/findHomography解决稀疏映射。

三、阈值化处理

即最简单的图像分割,基于图像中物体与背景之间的灰度差异,而且此分割属于像素级的分割。注意阈值的选取依赖于具体的问题,即物体在不同的图像中可能会有不同的灰度值。

常见的方法包括:OTSU阈值化(大津阈值法),固定阈值化/threshold,自适应阈值化/adaptiveThreshold(可直接获得轮廓线)等。注意阈值化时各函数参数的设置可能有意想不到的效果,可查阅相关手册。

四、图像直方图/histogram

根据图像颜色,可分为灰度直方图、BGR直方图、H-S直方图等。直方图获得:calcHist(),注意参数中可指定横坐标范围、统计区间等。直方图进行均衡操作/equalizeHist可用于平衡图像中的局部过亮或过暗区域。直方图匹配又叫直方图规定化(Histogram Normalization/Matching)是指对一副图像进行变换,使其直方图与另一幅图像的直方图或特定函数形式的直方图进行匹配,例如:应用场景如不同光照条件下的两幅图像,我们可以在比较两幅图像前先进行匹配变化。直方图对比/compareHist。

五、距离变换/distanceTransform

用于计算图像中每一个非零点距离离自己最近的零点的距离,结果图像上越亮的点代表了离零点的距离越远。可用于用于细化字符的轮廓和查找物体质心(中心)。

对字母进行细化:

对数字进行细化:

标记质心(绿色点,计算结果矩阵中的最亮点即最大值点):

六、Gamma校正

对输入图像灰度值进行的非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系。为什么进行Gamma校正?一方面,人眼对外界光源的感光值与输入光强不是呈线性关系的,而是呈指数型关系的。在低照度下,人眼更容易分辨出亮度的变化,随着照度的增加,人眼不易分辨出亮度的变化。而摄像机感光与输入光强呈线性关系。另一方面,为能更有效的保存图像亮度信息。未经gamma校正的情况下,低灰度时,有较大范围的灰度值被保存成同一个值,造成信息丢失;同时高灰度值时,很多比较接近的灰度值却被保存成不同的值,造成空间浪费。

需自己编写校正代码。注意区别矩阵线性叠加函数addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1)中的gamma平移值:M= alpha

*M1+ beta*M2+gamma。

七、批量更改像素值LUT(Look Up Table)

查表替换法,表里面存储了像素值的映射值,预先计算好存储备用,相当于离线预置。这是最被推荐的用于实现批量图像像素值查找和更改操作的方法,有利于提高实时性。在图像处理中,对于一个给定的值,将其替换成其他的值是一个很常见的操作,OpenCV提供里一个函数LUT()直接实现该查表替换操作,并不需要自己扫描图像。

八、图像采样/插值

用于减小或增大图像分辨率(像素数,宽度*高度),包括最近邻插值、线性插值/resize()、图像金字塔(pyrUp, pyrDown)等。插值时,像素取整时用三类浮点转整操作:cvRound\\cvFloor\\cvCeil,分别用于获得四舍五入整数、小于参数的最大整数、大于参数的最小整数。

九、傅里叶变化/DFT

图像的频率是表征图像中灰度变化剧烈程度的指标,是灰度在平面空间上的梯度。如:大面积的沙漠在图像中是一片灰度变化缓慢的区域,对应的频率值很低;而对于地表属性变换剧烈的边缘区域在图像中是一片灰度变化剧烈的区域,对应的频率值较高。(可以这么理解,图像中的低频部分指低梯度的点,高频部分则相反)。傅立叶变换是将图像从空间域转换到频率域,其逆变换是将图像从频率域转换到空间域。观察傅立叶变换后的频谱图(也叫功率图),可以看出图像的能量分布,如果频谱图中暗的点数更多,那么实际图像是比较柔和的(因为各点与邻域差异都不大,梯度相对较小),反之,如果频谱图中亮的点数多,那么实际图像一定是尖锐的,边界分明且边界两边像素差异较大的。傅里叶变换之后的图像在原点平移之前四角是低频、最亮,平移之后中间部分是低频、最亮,亮度大说明低频的能量大。频谱移频到原点以后,可以看出图像的频率分布是以原点为圆心,对称分布的。图像的明暗纹理的角度与FFT变化后的亮线角度一致。getOptimalDFTSize用于调整图像尺寸为最合适的DFT变化尺寸。

十、图像平滑(模糊)滤波技术/Blur()

图像平滑与图像模糊是同一概念,主要用于图像的去噪。平滑要使用滤波器,为不改变图像的相位信息,一般使用线性滤波器。从信号处理的角度来看,实际上是一种“低通滤波器”。常见滤波方法:盒滤波/boxFilter、均值滤波/blur、中值滤波/medianBlur、高斯滤波/GaussianBlur、双边滤波/bilateralFilter。一个比好用的功能是图像污点修复/inpaint,常用于图像中的文本、Logo图标、水印、划痕等。medianBlur在去噪的同时还能让边缘锐化。bilateralFilter可平滑平坦区域同时保持边缘锐化,但效率低。

十一、形态学变换/ morphologyEx()

注意:形态学变化是对图像中的白色部分(高亮部分)而言的,不是黑色部分!

(1)膨胀/dilate,求局部最大值的操作。腐蚀/erode,求局部最小值的操作。膨胀就是图像中的高亮部分进行膨胀,“领域扩张”,效果图拥有比原图更大的高亮区域。腐蚀就是原图中的高亮部分被腐蚀,“领域被蚕食”,效果图拥有比原图更小的高亮区域。

原图 膨胀后 腐蚀后

(2)开/open,先腐蚀后膨胀,用于消除小物体,在纤细点处分离物体,并且在平滑较大物体的边界的同时不明显改变其面积,同时抑制比给定结构元小的亮细节。闭/close,先膨胀后腐蚀,用来填充物体内细小白色空洞、连接邻近的物体、平滑其边界的同时并不明显改变其面积,同时抑制比给定结构元小的暗细节。

开运算

闭运算

原图

开运算结果(消除小物体) 原图

闭运算结果(填充小洞)

(3)形态学梯度/gradient,膨胀图和腐蚀图相减,将边缘突出来,可以用来保留物体的边缘轮廓。

原图

形态学梯度结果

原图

形态学梯度结果

(4)顶帽(白帽变换)/topHat,原图像减去开运算图像,突出原图像中比周围亮的区域,用于校正不均匀关照的影响(均匀光照在从背景中提取目标的处理中扮演核心的角色)。低帽(黑帽变换)/blackHat,闭运算图像减去原图像,用于突出比原图轮廓周围更暗的区域。

原图

顶帽结果

原图

低帽结果

(5)击中-击不中/ Hit-miss,对图像做两次腐蚀然后取交集:首先,建立一个比B大的模板W,使用此模板对图像A进行腐蚀,得到图像假设为Process1;其次,用B减去W,从而得到V模板(W-B);使用V模板对图像A的补集进行腐蚀,得到图像假设为Process2;然后,Process1与Process2取交集;得到的结果就是B的位置(可能不是B的中心位置,要视W-B时对齐的位置而异)。案例:给定一把钥匙,如何从一串钥匙中匹配该钥匙?每把钥匙尾部都不同,但钥匙图像尺寸都相同。

(6)细化/Thinning(或:骨架/Skeletonization),经过一层层的剥离,从原来的图中去掉一些点,但仍要保持原来的形状,直到得到图像的骨架。OpenCV中未提供相应算法,建议参考Zhang细化算法 或Hilditch细化算法。

原图

细化结果

十二、边缘检测/Edge

灰度或结构等信息的突变位置便是图像的边缘,图像的边缘有幅度和方向属性,沿边缘方向像素变化缓慢,垂直边缘方向像素变化剧烈。因此,边缘上的变化能通过梯度计算出来。常用的检测方法:Sobel、Laplacian、Roberts、Canny、Prewitt、Marr-Hildreth等。Soble使用了单一阈值,不能兼顾到低阈值的丰富边缘和高阈值时的边缘缺失这两个问题。而Canny算子使用了双阈值,可以很好的兼顾这两方面,所以相比较而言,Canny边缘检测要更优一点。Canny边缘检测用在非常细致的边缘,但也因此很容易受随机噪声的影响,所以一般都需要在边缘检测前进行滤波去噪。Sobel可以指定检测垂直或水平边缘。Laplacian 边缘检测的结果最接近手工素描效果。Roberts是最简单的边缘检测法。Prewitt一般比较差。

十三、几何元素(直线、圆、椭圆)检测

直线检测的对象一般应为边缘检测后的二值图,包括霍夫检测HoughLines/HoughLinesP和LSD快速直线检测/LineSegmentDetector。LSD方法的时间复杂度较霍夫变换更低,实时性更好。霍夫变换中,HoughLinesP比HoughLines高效。如果已知点集,也可采用最小二乘拟合直线:fitLine。

圆检测由于比直线检测多出一个参数维度,使得标准的霍夫圆检测需要大量内存且速度较慢。出于对运算效率的考虑,OpenCV实现的霍夫圆检测是一个比标准霍夫圆变换更为灵活的检测方法:霍夫梯度法,也叫2-1霍夫变换(21HT),对应cvHoughCircles函数。 不需要图像中出现完整的圆,只要落在一个圆上的像素数量足够多,就能正确识别。

椭圆检测一般不用霍夫方法,因为椭圆参数达到5个,使得计算效率极为差。椭圆检测时,可以用findCountours查找获得的countour进行fitEllipse拟合,并根据拟合误差、面积比等因子进一步确认挑选。还可通过简单块特征检测/SimpleBlobDetector来直接检测椭圆近似中心。

十四、结构和形状检测

包括:轮廓检测/ findContours/drawContours(注意参数的设置带来的好结果)、轮廓关键点检测/ cvFindDominantPoints、凸包(convex hull,想象成刚好包住所有点的橡皮圈)检测/convexHull及其缺陷分析/convexityDefects、直线拟合/ fitLine、多边形拟合/ approxPolyDP、椭圆(圆是特例)拟合/fitEllipse、曲线长度/ arcLength、曲线面积/ contourArea、最小包围水平矩形/boundingRect、最小面积包围倾斜矩形/minAreaRect、最小包围圆/minEnclosingCircle、2个矩形的最小外包矩形/cvMaxRect、轮廓矩/moments、Hu不变距/HuMoments(具有图像旋转、缩放、平移不变性)。点与轮廓线的位置关系判断/ pointPolygonTest。形状相似度对比/ matchShapes。

根据矩可以直接获得图像的面积、中心(质心)等信息。

轮廓关键点检测结果

十五、特征检测

图片中的特征大体可分为三种:点特征、线特征、块特征。图像特征最理想的是具有尺度(scale)不变性和旋转(rotation)不变性。所谓尺度,简单理解即为摄像头远近,描述了成像的细节清晰度。

点,也就是图像中的特殊位置,是很常用的一类特征,点的局部特征也可以叫做“关键特征点”(keypoint feature)或“兴趣点”(interest point)或“角点”(conrner)。角点可为以下几类:一阶导数(即灰度的梯度)的局部最大所对应的像素点,两条及两条以上边缘的交点,图像中梯度值和梯度方向的变化速率都很高的点,一阶导数最大且二阶导数为零的能指示物体边缘变化不连续的方向的点。Moravec角点、Harris角点、Shi-Tomasi角点、FAST特征点、BRIEF特征点等等。角点可用drawKeypoints绘制不同标记形状。获取亚像素级别的角点/ cvFindCornerSubPix。

opencv 提供了10种特征检测方法:

1. \"FAST\" – FastFeatureDetector(Features from Accelerated Segment Test)。快速,但处理灰度平

滑性较好的图像时能够检测出的角点数较少。 2. \"STAR\" – StarFeatureDetector

3. \"SIFT\" – SiftFeatureDetector(Scale Invariant Feature Transform)。 nonfree module,专利的拥

有者为英属哥伦比亚大学,具有旋转/缩放/平移RST、光照illumination 、 目标遮挡occlusion、杂物场景clutter、噪声不变性,但不具有仿射不变性,对模糊的图像和边缘平滑的图像检测出的特征点过少,对圆更是无能为力。

4. \"SURF\" – SurfFeatureDetector (Speeded Up Robust Features)。 nonfree module专利的拥有者为

英属哥伦比亚大学,SIFT的高效变种,大体都优于SIFT,但同样不具有仿射不变性。

5. \"ORB\" – ORB(Oriented FAST and Rotated BRIEF:An Efficient Alternative to SIFT or SURF,

ORB速度是SIFT的100倍,是SURF的10倍,但没有解决尺度不变性问题)

6. \"MSER\" – MSER(Maximally Stable Extremal Regions)。最大稳定极值区域,基于分水岭原

理,具有SIFT SURF及 ORB等所不具备的仿射不变性,广泛用于图像的斑点检测、图像分割与匹配,但处理灰度平滑性较好的图像时能够检测出的角点数较少。根据需要检测的白色区域和黑色区域又分为MSER+和MSER-,一般是对图像和图像取反/255-Mat结果图分别进

行MSER操作。

7. \"GFTT\" – GoodFeaturesToTrackDetector(Good Features to Track,实现Shi-Tomasi角点检测,

对Harris的改进)

8. \"HARRIS\" – GoodFeaturesToTrackDetector with Harris detector enabled(harris角点检测) 9. \"Dense\" – DenseFeatureDetector

10. \"SimpleBlob\" – SimpleBlobDetector。用于检测斑点类的特征点。

SIFT和SURF这两个算法由于非免费需要在附件引用项中添加opencv_nonfree243.lib,同时在代码中加入:initModule_nonfree()。

基于特征点检测、描述符提取、匹配和匹配结果过滤(可能存在错误匹配,一般会加以删选),可实现图像之间的匹配映射。OpenCV中,特征点检测如前述所述;描述符提取通过DescriptorExtractor完成;描述符匹配主要有暴力匹配(brute force matcher)/cv::BFMatch和基于flann的匹配/cv::FlannBasedMatcher,返回储存匹配信息的结构体/DMatch。

蓝Harris检测结果、绿GFTT检测结果 STAR特征点检测结果

GFTT特征点检测结果 FAST特征点检测结果

SURF特征点检测结果 SIFT特征点检测结果

SIFT图像匹配 SUFF图像匹配

SimpleBlob检测斑点

十六、图像分割

图像分割是利用图像的灰度、颜色、纹理和形状等特征将图像中具有独特性质的区域进行划分,从而实现感兴趣区域的提取。

(1)分水岭/watershed。在分割的过程中,它会把跟临近像素间的相似性作为重要的参考依据,从而将在空间位置上相近并且灰度值相近的像素点互相连接起来构成一个封闭的轮廓,封闭性是分水岭算法的一个重要特征。

(2)漫水填充/cvFloodFill,类似photoshop中的魔术棒功能和windows画图板中的油漆桶功能,其作用是用我们指定的颜色从种子点开始填充一个连接域,连通性由像素值的接近程度来衡量。

(3)均值漂移/cvPyrMeanShiftFiltering,将灰度值相近的元素进行聚类,把包含像素点太少的类去掉,在此基础上应用阈值分割算法达到将图像与背景分离的目的。目前用meanshift的很多其实在于联合camshift一起实现目标跟踪。

(4)图割/grabcut,在使用该算法的过程中需要人机交互指定矩形区域,所以需要用到很多鼠标键盘的操作。

十七、图像拼接/image stitching

图像拼接是利用多帧图像生成全景图或高分辨率图,应消除图像拼接部分的缝隙间隔,因此需进行重叠区域匹配修复。由于摄像头拍摄角度、距离等问题,还需考虑对图像进行仿射变化校正。拼接基本步骤为:特征点检测、关键点匹配、仿射变换矩阵求取、第二张图像校正、图像拷贝融合。OpenCV也提供了一个全封装的类Stitcher,实现图像拼接所有的相关函数都被封装在类当中。

十八、图像背景建模与前景检测/ Background Generation And Foreground Detection

用于背景/前景分割,输入为一段视频或一系列图片,然后从中找到感兴趣的目标(比如说当人进入已经打烊的超市时发出警报)。获得了背景,通过对当前图像及背景的某种比较,我们可以得出前景。注意背景与前景都是相对的概念,以高速公路为例:有时我们对高速公路上来来往往的汽车感兴趣,这时汽车是前景,而路面以及周围的环境是背景;有时我们仅仅对闯入高速公路的行人感兴趣,这时闯入者是前景,而包括汽车之类的其他东西又成了背景。

在OpenCV中开源了的几种背景提取算法:(1)高斯混合背景建模/ MOG(Mixture Of Gauss),封装于BackgroundSubtractorMOG类;(2)改进版高斯混合背景建模/MOG2,封装于BackgroundSubtractorMOG2类;(3)KNN模型背景建模,主要基于K近邻思想,实现前景目标变化较小场景下背景模型的建立,封装于BackgroundSubtractorKNN类;(4)GMG模型背景建模,基于概率前景贝叶斯估计算法来实现,封装于BackgroundSubtractorGMG类;(5)复杂背景下的前景物体检测/FGD(Foreground object detection from videos containing complex background)。

其中,MOG2在前景连续性及运算时间上都脱颖而出。 此外,BGSLibrary是个很不错的背景建模的开源库,是采用C++编写的用于 background subtraction (BGS)背景减去相关算法的开源库,包含了29种目前常用的背景减去算法。目前发布在google code上面,其链接为:https://code.google.com/p/bgslibrary/,遵守GNU GPL v3协议,可以自行下载。

BackgroundSubtractorMOG 的结果:

BackgroundSubtractorMOG2 的结果:(灰色区域代表阴影 )

BackgroundSubtractorGMG 的结果:(使用形态学开运算将噪音去除)

十九、运动检测

目前,运动物体检测的问题主要分为两类,摄像机固定和摄像机运动。

对于摄像机运动的运动物体检测问题,比较著名的解决方案是光流(optic flow)法,通过求解偏微分方程求得图像序列的光流场,从而预测摄像机的运动状态。

对于摄像机固定的情形,当然也可以用光流法,但是由于光流法的复杂性,往往难以实时的计算,此时可采用高斯背景模型。因为在摄像机固定的情况下,背景的变化是缓慢的,而且大都是光照、风等等的影响,通过对背景建模,对一幅给定图像分离前景和背景。一般来说,前景就是运动物体,从而达到运动物体检测的目的。

光流是指空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。一般而言,光流是由于场景中前景目标本身的移动、相机的运动,或者两者的共同运动所产生的。

从本质上说,光流就是你在这个运动着的世界里感觉到的明显的视觉运动。可以通过不同目标的运动速度判断它们与我们的距离。当人的眼睛观察运动物体时,物体的景象在人眼的视网膜上形成一系列连续变化的图像,研究光流场的目的就是为了从图片序列中近似得到不能直接得到的运动场。通俗的讲就是通过一个图片序列把每张图像中每个像素的运动速度和运动方向找出来就是光流场。

opencv中实现了不少的光流算法。 1)calcOpticalFlowPyrLK:通过金字塔Lucas-Kanade 光流方法计算某些点集的光流(稀疏光流)。理解的话,可以参考这篇论文:”Pyramidal Implementation of the Lucas Kanade Feature TrackerDescription of the algorithm”。

2)calcOpticalFlowFarneback:用Gunnar Farneback 的算法计算稠密光流(即图像上所有像素点的光流都计算出来)。它的相关论文是:\"Two-Frame Motion Estimation Based on PolynomialExpansion\"。

3)CalcOpticalFlowBM:通过块匹配的方法来计算光流。 4)CalcOpticalFlowHS:用Horn-Schunck 的算法计算稠密光流。相关论文参考:”Determining Optical Flow”。

5)calcOpticalFlowSF:这一个是2012年欧洲视觉会议的一篇文章的实现:\"SimpleFlow: A Non-iterative, Sublinear Optical Flow Algorithm\",工程网站是:http://graphics.berkeley.edu/papers/Tao-SAN-2012-05/。在OpenCV新版本中有引入。

二十、增强现实/AR

增强现实(Augmented Reality),也被称之为混合现实,将电脑虚拟的图像覆盖到真实世界画面中,并且和真实世界中的对象精确对齐。它不仅展现了真实世界的信息,而且将虚拟的信息同时显示出来,两种信息相互补充、叠加。AR主要包括基于标记和非基于标记两类。非基于标记的AR方法主要采用前述的特征匹配方法范畴,计算实时性相对较差,一般仅用于台式PC应用。基于标记的AR的比较有名的开源包如:

ARToolKit, 知名度很高的AR库了,可以商用,免费开源,遵循GPL协议,C风格的函数库; 被转换成了很多其他语言和平台像Android, Flash 还有Silverlight; 被广泛的应用到增强现实的项目开发中。

ArUco,一个基于OpenCv的mini增强现实库; 开原协议: BSD,支持平台有:Linux, Windows。已集成到OpenCV中。

GRATF,开源库 遵循 (GPLv3)协议, 支持C#,可以用于字形识别,3D姿态评估,3D增强现实中。

二十一、绘制GUI界面及触发鼠标事件

在输出图像上直接绘制相应的按钮图案及显示文本,然后在图像拟显示的窗体/cvNamedWindow中设置鼠标事件/setMouseCallback,根据鼠标位置是否位于绘制按钮的区域内/Point::inside判断是否触发了用户点击事件,并最后根据鼠标事件类型进行处理。更一般地,如果利用任意封闭轮廓作为绘制/drawContours按钮形状,可利用pointPolygonTest判断鼠标位置是否位于按钮内。

二十二、硬件

机器视觉主要由5部分组成:照明光源、镜头、相机、图像采集卡、视觉处理器。

光源,分可见光和不可见光两类,可见光中优选LED。光源的主要目的就是将被测物体与背景尽量明显分别,获得高品质、高对比度的图像。光源与照明方案的配合应尽可能地突出物体特征量,在物体需要检测的部分与那些不重要部份之间应尽可能地产生明显的区别。一般使用透射光和反射光。

镜头,基本功能是实现光束的变换,将目标成像在相机的图像传感器光敏面上。选择镜头应该遵循以下原则:1).与之相配的相机的芯片尺寸是多大;2).相机的接口类型是哪种的,C接口,CS接口还是其它接口;3).镜头的工作距离;4).镜头视场角;5).镜头光谱特性;6).镜头畸变率;7).镜头机械结构尺寸。镜头其实一般都是按照焦段来分的,10-17mm为超广角;17-35mm广角;35-135mm中焦,其中85mm焦段尤其是被推崇为拍人像最佳的焦段所以我们经常可以看见把85mm F1.8这样的镜头叫做人像头,而50mm-这个焦段据说最符合人眼看出去的视角所以又称为标准焦距,经常把50mm的镜头叫“标头”;135-200mm-长焦;微距。焦距越短,视角越大,所能观察的范围也越大,图像越小,有利于搜素目标物体;反之,焦距越长,视角越小,能观察的范围也越小,图像越大,有利于拍摄细节。镜头分普通镜头和远心镜头。普通镜头测量的物体如果不在同一个平面上的话,需要调整放大倍率,而远心镜头的图像放大倍率是不因物距变化而变化的。因此,当检测不在同一平面上的物体时,需要使用远心镜头。普通镜头和远心镜头的成像区别对比如下:

影响机器视觉镜头成像效果的因素涵概镜片、光圈、景深等几种主要参数。景深指的是相机可以清晰成像的距离范围,即无需重新调焦即可保持可接受的图像清晰度的距离。也就是说想要获得清晰的画面,就需要镜头有不错的景深,景深越大,画面的清晰范围就越大,图像放大后,远端的景物也依然可以看的清晰。景深并不是一个独立存在的参数,它跟焦距,光圈、摄距等参数都有一定的关系。例如:光圈与景深是成反比的,光圈大,景深小;光圈小,景深大。焦距与景深也成反比,镜头焦距长,景深小;镜头焦距短,景深大。而摄距与景深则成正比,摄距远,景深大;摄距近,景深小。用大光圈可以拍出背景很虚化很朦胧的照片,用小光圈则可以形成全局清晰度比较均一的照片。但是,光线暗淡的条件下,如果光圈不够大的话,画面就会显得暗淡。

相机,优选标准分辨率数字相机。分辨率方面,如果一个像素对应一个缺陷的话,那么这样的系统一定会极不稳定,所以我们为了提高系统的精准度和稳定性,最好取缺陷的面积在3到4个像素以上,最终根据视场(长或宽)和检测精度来确定相机分辨率(长或宽),幅宽除以最小检测精度得出每行需要的像素。从芯片上分有CCD和CMOS两种,如果要求拍摄的物体是运动的,要处理的对象也是实时运动的物体,那么当然选择CCD芯片的相机为最适宜。同样分辨率情况下,黑白镜头比彩色镜头的精度更高。根据要检测的速度,选择相机的帧率一定要大于或等于检测速度,也就是处理图像的时间一定要快,一定要在相机的曝光和传输的时间内完成。

拍摄运动物体的时候,需要克服的最重要的问题是拖影,拖影是在曝光的时候,拍摄目标与摄像系统之间存在相对运动形成的,因为这种相对运动导致芯片上形成的图像一直在变化,各个部位的像元在曝光的过程中受到来自物体不同位置成像的影响,最终形成的图片是一个连续变化图像空间内图片的叠加。运动速度和曝光时间是直接影响拖影的两个因素,一般情况下就是保证:物体运动速度Vp*曝光时间Ts小于允许最长拖影S单位系统精度。

选择CCD时应该注意:l inch=16mm而不是等于25.4mm,指的是芯片对角线尺寸(4:3勾5)。

二十三、机器学习的方法/ML(Machine Learning)

机器学习方法是计算机利用已有的数据(经验),得出了某种模型(迟到的规律),并利用此模型预测未来(是否迟到)的一种方法。积累的数据越丰富、广泛,对未来的判断越准确。机器学习界的名言:成功的机器学习应用不是拥有最好的算法,而是拥有最多的数据!

按照训练的数据有无标签,可以将上面算法分为监督学习算法和无监督学习算法(但推荐算法较为特殊,是单独的一类)。

监督学习算法:线性回归,逻辑回归,神经网络,SVM。 无监督学习算法:聚类算法,降维算法。 特殊算法:推荐算法。

1、回归算法。分为即线性回归和逻辑回归。线性回归处理的是数值问题,也就是最后预测出的结果是数值;而逻辑回归属于分类算法,预测结果是离散的分类概率。线性回归多基于最小二乘最小拟合误差原理,将最优问题转化为求函数极值问题。梯度下降法是解决回归模型中最简单且有效的方法之一,用于代替数值求导。

2、神经网络。80年代机器学习界非常流行的算法,在BP算法(加速神经网络训练过程的数值算法)诞生以后神经网络的发展进入了一个热潮,不过在90年代中途衰落(被支持向量机取代),近期随着深度学习再次火热起来。一般分成输入层、隐藏层和输出层。输入层负责接收信号,隐藏层负责对数据的分解与处理,最后的结果被整合到输出层。神经网络在图像识别领域的一个著名应用:LeNet,可以识别多种手写数字,并且达到很高的识别精度与拥有较好的鲁棒性。

神经网络技术的发展进程截止当今主要经历三起三落,未来充满希望,但也未必能一帆风顺,如下图所示:

三起三落的神经网络发展(横轴是时间,纵轴是神经网络的影响力)

神经网络中,除了连接权值外,激活函数是一个重要的环节。单层神经网络使用的激活函数是sgn函数。两层神经网络使用的最多的是sigmoid函数。而多层神经网络时,通过研究发现ReLU函数在训练多层神经网络时,更容易收敛,并且预测性能更好。因此目前在深度学习中,最流行的非线性函数是ReLU函数。ReLU函数不是传统的非线性函数,而是分段线性函数。其表达式非常简单,就是y=max(x,0)。简而言之,在x大于0,输出就是输入,而在x小于0时,输出就保持为0。这种函数的设计启发来自于生物神经元对于激励的线性响应,以及当低于某个阈值后就不再响应的模拟。

神经网络表示能力不断增强

神经网络发展的外在原因

3、SVM(支持向量机)/ CvSVM。令实心点 = -1,空心点 = +1,寻找直线f(x) = w.x + b对已有点集进行分类,其中x和w为向量形式。下图中被红色和蓝色的线圈出来的点就是所谓的支持向量(support vector),Classifier Boundary就是f(x),红色和蓝色的线(plus plane与minus plane)就是support vector所在的面,红色、蓝色线之间的间隙就是我们要最大化的分类间的间隙。

在SVM中,选择使得支持向量距离分割边界的间隙最大的函数作为分割平面,称为Maximum Marginal,是SVM的一个理论基础之一。从某种意义上来说是逻辑回归算法的强化,通过跟高斯“核”的结合,支持向量机可以表达出非常复杂的分类界线,从而达成很好的的分类效果。高斯核甚至是将原始空间映射为无穷维空间。“核”事实上就是一种特殊的函数,最典型的特征就是可以将低维的空间映射到高维的空间。将数据从低维映射到高维不会带来最后计算复杂性的提升。

用一个哲学例子来说:世界上本来没有两个完全一样的物体,对于所有的两个物体,我们可以通过增加维度来让他们最终有所区别,比如说两本书,从“颜色”、“内容”两个维度来说,可能是一样的,我们可以加上“作者”这个维度,实在不行我们还可以加入“页码”,可以加入“拥有者”,可以加入“购买地点”等等。当维度增加到无限维的时候,一定可以让任意的两个物体可分了。如下图从

二维平面扩展到三维就可完美分割。SVM是一种不太容易过拟合/over-fitting的方法。

原二维分布线性不可分 扩展到三维 三维中的分布线性可分

opencv的CvSVM的实现基于libsvm,这是台湾大学林智仁(Lin Chih-Jen)教授写的一个世界知名的svm库,官方主页地址是:http://www.csie.ntu.edu.tw/~cjlin/libsvm/。

4、聚类算法。属于无监督算法。简单来说,聚类算法就是计算种群中的距离,根据距离的远近将数据划分为多个族群。聚类算法中最典型的代表就是K-Means算法。

5、降维算法。也是一种无监督学习算法,其主要特征是将数据从高维降低到低维层次。在这里,维度其实表示的是数据的特征量的多少。降维算法的主要作用是压缩数据与提升机器学习其他算法的效率,主要代表是PCA算法(即主成分分析算法)。

6、推荐算法。在电商界如亚马逊、天猫、京东等得到了广泛的运用。主要特征就是可以自动向用户推荐他们最感兴趣的东西,从而增加购买率,提升效益。推荐算法有两个主要的类别:一类是基于物品内容的推荐,另一类是基于用户相似度的推荐。推荐算法中最有名的算法就是协同过滤算法。

7、其他。机器学习界还有其他的如高斯判别、朴素贝叶斯、决策树等等算法等。

机器学习与人类思考的类比

机器学习与相关学科

二十四、关于机器学习的其它

图上三人是当今机器学习界的执牛耳者。中间的是Geoffrey Hinton,神经网络的发明人, 加拿大多伦多大学的教授,如今被聘为“Google大脑”的负责人。右边的是Yann LeCun, 纽约大学教授,如今是Facebook人工智能实验室的主任。而左边的大家都很熟悉,Andrew Ng,中文名吴恩达,斯坦福大学副教授,如今也是“百度大脑”的负责人与百度首席科学家。他们的研究方向全部都是机器学习的子类--深度学习。

1、深度学习/DL——机器学习的子类

就是传统的神经网络发展到了多隐藏层的情况。2006年,BP算法的发明人Geoffrey Hinton在科学杂志《Science》上发表了一篇文章,论证了两个观点:1.多隐层的神经网络具有优异的特征学习能力,学习得到的特征对数据有更本质的刻画,从而有利于可视化或分类;2.深度神经网络在训练上的难度,可以通过“逐层初始化” 来有效克服。这使得神经网络计算再次火热起来。具有多个隐藏层的神经网络被称为深度神经网络,基于深度神经网络的学习研究称之为深度学习。CNN(Conventional Neural Network,卷积神经网络)与RNN(Recurrent Neural Network,递归神经网络)的架构是当今深度学习的两种典型架构。

2、人工智能/AI——机器学习的父类

毫无疑问,人工智能是人类所能想象的科技界最突破性的发明,是人类对于科技界的最终梦想。人工智能的发展经历了如下若干阶段:从早期的逻辑推理,到中期的专家系统,再到近期的机器学习。人工智能、机器学习和深度学习的关系如下图所示。

3、意识——机器学习的终点

如果计算机不再仅仅拥有智能,也拥有了和人类一样的意识,那么会怎么样?譬如让计算机在工作的过程中,逐渐产生了自身的潜意识,于是甚至可以在你不需要告诉它做什么时它就会完成那件事。意识的诞生已经看成了生命体的出现了,借助于大规模分布式计算的机械学习等于在汇总归纳学习人类目前所有暴露在互联网上的所有一切数据,所以未来会怎样?

因篇幅问题不能全部显示,请点此查看更多更全内容