目录
一、模块
二、算法介绍
三、功能介绍
四、图像处理(imgproc组件部分)
五、图像变换(imgproc组件部分)
六、图像轮廓和分割修复(imgproc组件部分)
七、直方图与匹配(imgproc组件部分)
八、角点检测(feature2d组件部分)
九、特征检测与匹配(feature2d组件部分)
十:学习书目
一、模块
calib3d:相机校准和三位重建
contrib:人脸识别、立体匹配、人工视网膜模型
core:基本数据结构、动态数据结构、绘图函数、数组操作相关函数、辅助功能与系统函数和宏、与OpenGL的互操作
imgproc:图像处理模块:线性和非线性的图像滤波、图像几何变换、直方图相关、结构分析和形状描述、运动分析和对象跟踪、特征检测、目标检测
features2d:特征检测和描述、特征检测器通用接口、描述符提取器通用接口、描述符匹配器通用接口、通用描述符匹配器通用接口、关键点绘制函数和匹配功能绘制函数
flann:快速近似最近邻搜索、聚类
gpu:用GPU加速的计算机视觉模块
highgui:图形用户界面:媒体的输入输出、视频捕捉、图像和视频的 编码解码、图形交互界面的接口
legacy:原始向下兼容模块
ml:机器学习:统计模型、一般贝叶斯分类器、K-近邻、支持向量机、决策树、提升、梯度提高树、随机树、超随机树、期望最大化、神经网络、MLData
objdetect:目标检测:级联分类器、SVM
ocl:用OpenCl加速的计算机视觉模块
photo:图像修复、图像去噪
stitching:图像拼接
superres:超分辨率技术
video:视频分析:运动估计、背景分离、对象跟踪
二、算法介绍
彩色目标跟踪(Camshift):根据鼠标框选区域的色度光谱来进行摄像头读入的视频目标的跟踪。
光流(optical flow):分析运动图像。
点追踪(Ikdemo):全局检查点。
人脸识别(objectDetection):haarcascade_frontalface_alt.xml和haarcascade_eye_tree_eyeglasses.xml。
支持向量机引导:SVM分类器
三、功能介绍
1、imread(载入)、imshow(显示)、namedWindow(创建窗口)、imwrite(输出)。
滑动条:creatTranckbar()(创建)、getTrackbarPos()(获取当前轨迹条位置)。
Mat初始化:直接在Mat()里初始化、M.create()(创建函数)、Mat::eye/ones/zeros()(指定矩阵形式)、Mat_
常用的数据结构和函数:Point2f(二维点)、Point3f(三维点)、vector
画图:line()、ellipse()、rectangle()、circle()、fillPoly()(填充绘制的多边形)。
2、颜色空间缩减:将0~256以10个间隔为单位划分为0、10、20、30、......,减少运算量。
Look up table操作:LUT()(函数,批量进行图像元素查找、扫描与操作图像)。
计时函数:getTickCount()、getTickFrequency()。
访问图像中像素(BRG三类)的三类方法:指针访问、迭代器操作、动态地址计算。
ROI(感兴趣区域:图中选出指定区域再进行操作)混合:矩形区域Ret(左上角坐标、长和宽)、感兴趣行或列的范围Range。
线性混合操作:addWeighted()(函数:计算两个图像数组的加权和)。
split()(函数,分离RGB颜色通道进行单独处理)、merge()(函数,RGB通道合并)。
点操作(对像素点单独进行操作,线性操作):亮度、对比度、颜色校正和变换。
3、DFT(离散傅里叶变换):将一张图从空间域转换为频域,即变换为正弦和余弦两部分。频域包含高频(图像的细节、纹理信息)和低频(图像的轮廓信息)。傅里叶变换可以做到图像增强与图像去噪、图像分割之边缘检测、图像特征提取、图像压缩。dft()(函数,对一维或二维浮点数数组进行正向或反向离散傅里叶变换)、getOptimalDFTSize()(函数,返回DFT最优尺寸大小)
copyMakeBorder()(函数,扩充图像边界)、magnitude()(函数,计算二维矢量的幅值)、log()(函数,计算每个数组元素绝对值的自然对数)、normalize()(矩阵归一化)
4、XML文件(eXtensible Markup language,可扩展标识语言,一种无标记语言)、YAML文件(一种可读性高,用来表达资料序列的格式)
四、图像处理(imgproc组件部分)
1、图像滤波/平滑处理/平滑滤波:(低频增强的空间域滤波技术,一般用简单平均法)抽出对象的特征作为图像识别的特征模式、减少图像上的噪点或失真,降低图像分辨率。尽量保留图像细节特征的条件下对噪声进行抑制,是不可或缺的操作,其好坏直接影响到后续图像成立的可靠性。
2、滤波器:信号或图像的能量大部分集中在幅度谱的低频和中频段,较高频段信息常常被噪声淹没。滤波器的目的是降低高频成分的幅度以减少噪音。要求:不能损坏轮廓和边缘等重要信息、图像清晰视觉效果好。
滤波器的种类:
2.1、线性滤波器:(在输入信号中,剔除不想要的频率、选择一个想要的频率),领域算子(类似掩膜操作),加权计算,易于构造
方框滤波(box Fliter):BoxBlur()函数,模糊一张图片。
均值滤波:Blur()函数;是归一化的方块滤波;领域平均法;缺点:去噪的同时也破坏了细节部分,并且去噪效果不好。
高斯滤波:GaussianBlur()函数;加权平均(真正的卷积/掩膜);应用范围广。
2.2、非线性滤波:在噪音是散粒噪音而不是高斯噪音时,即图像偶尔出现很大的值时
中值滤波:medianBlur()函数;用像素点领域灰度值的中值来代替该像素点的灰度值;去除脉冲噪音、椒盐噪音、斑点噪音,又能保留图像的边缘细节;不适合细节比较多的图像。
双边滤波:bolateralFilter()函数。结合图像空间邻近度和像素值相识度的一种折中处理,可以保边去噪;对高频噪音过滤不干净,对低频噪音效果较好。
3、形态学滤波:morphologyEx()(函数,可在参数中选择所有的形态学运算)
3.1、膨胀(dilate())与腐蚀(erode()):针对高亮的白色区域
3.2、开运算、闭运算、形态学梯度、顶帽、黑帽:以膨胀和腐蚀为基础
开运算(open()):先腐蚀后膨胀;消除小物体、在纤细点分离物体(放大裂缝/局部低亮度区域)、不改变平滑较大物体的体积。
闭运算(close()):先膨胀后腐蚀;排除小型黑洞/黑色区域。
形态学梯度(morph-grad()):膨胀图和腐蚀图之差;突显二值图像的团块、保留物体的边缘轮廓。
顶帽(tophat()):原图像与开运算的结果图之差;在一幅图像拥有大幅背景,而微小物体有规律的情况下,进行背景提取;分离比邻近点亮一些的斑块。
黑帽(blackhat()):闭运算的结果图与原图像之差;突出比原图轮廓周围的区域更暗的区域;分离比邻近点暗一些的斑块。
4、漫水填充(floodfill):自动选中了和种子点相连的区域,并将该区域替换成指定的颜色;用来标记或分离图像的一部分(PS中的魔术棒)。
5、图片尺寸缩放:
pyrUp()(函数,上采样,图像尺寸加倍,金字塔向下)、pyrDown()(函数,下采样,图像尺寸减半,金字塔向上)、resize()(函数,尺寸调整)
下采样:k层进行内核卷积,再去掉所有偶数行和列,得到k+1层;
上采样:k+1层每个方向扩大为原来的两倍,新增行和列用0填充,再进行内核卷积(x4)
5.1、图像金字塔:从底(待处理图像的高分辨率表示)到顶(低分辨率近似),为分辨率逐步降低且来源于同一张原始图的图像集合。应用:图像分割。
高斯金字塔(Gaussianpyramid):通过高斯平滑和亚采样,来获取下降采样图像;可以跨越很高的层级范围;缩小、放大会丢失信息,丢失的信息即为拉普拉斯金字塔。
拉普拉斯金字塔(Laplacianpyramid):用来从金字塔底层图像中向上采样,重建一个图像;是通过原图像减去先缩小再放大的图像的一系列图像构成的;类似于高斯金字塔的逆形式。
5.2、resize()(尺寸调整)将图像精确的转换为指定尺寸的目标图象。
6、阈值化:
Threshold()(函数,固定阈值操作)、adaptiveThreshold()(自适应阈值操作)
6.1、固定阈值操作(Threshold()):对灰度图像进行阈值操作得到二值图像、去掉噪声(过滤很小或恨到像素值的图像点)
6.2、自适应阈值操作(adaptiveThreshold()):对矩阵采用自适应阈值操作。
五、图像变换(imgproc组件部分)
1、边缘检测:步骤:滤波(高斯滤波)、增强(计算梯度幅值)、检测(阈值化)
1.1、Canny算子(Canny()):变分法;最优的边缘检测算法;步骤:消除噪声、计算梯度幅值和方向、非极大值抑制、滞后阈值(高阈值和低阈值)。
1.2、Sobel算子(Sobel()):高斯平滑和微分求导(x和y两个方向)。
1.3、Laplacian算子(Laplacian()):二阶微分(梯度grad、散度div)。
1.4、Scharr滤波器(Scharr()):配合Sobel算子;计算x或y方向的图像差分(使边缘更据方向选择性)。
2、霍夫变换:霍夫线变换(HoughLins()、HoughLinsP())、霍夫圆变换(HoughCircles())
2.1、霍夫线变换(HoughLins()、HoughLinsP()):先对图像进行边缘检测处理,输出为边缘二值图像,才能继续变换。
2.2、霍夫圆变换(HoughCircles()):霍夫梯度法(解决圆变换问题);可以直接检测出灰度图中的圆,不需要二值图。
3、重映射remap():把一幅图中某位置的像素放置再另一张图片指定的位置;实现镜像、反转、对称等操作。
4、仿射变换:warpAffine()(函数,进行放射变换)、getRotationMatrix2D()(函数,获取二维旋转变换矩阵)。
5、直方图均衡化:equalizeHist()(通过拉伸像素强度分布范围来增强图像对比度,使直方图分布大致平和)。
六、图像轮廓和分割修复(imgproc组件部分)
由于边缘检测算法没有将轮廓看做一个整体,所以要将边缘像素组装成轮廓。
1、查找并绘制轮廓:findContours()(函数,在二值图像中寻找轮廓);drawContours()(函数,在图像中绘制外部或内部轮廓)。
2、寻找凸包:convexHull()(函数,寻找图像点集中的凸包);得到的是一个区域轮廓。
3、包围轮廓的多边形形状:boundingRect()(函数,外部矩形边界)、minAreaRect()(函数,最小包围矩形)、minEnclosingCircle()(函数,最小包围圆形)、fitEllispse()(函数,椭圆拟合二维点集)、approxPolyDP()(函数,逼近多边形曲线);圈出目标物体。
4、图像的矩:通常描述了图像形状的全局特征,比如大小、位置、方向和形状;一阶矩与形状有关,二阶矩显示曲线围绕直线平均值的扩展程度,三阶矩是关于平均值的对称性的测量。应用于模式识别、目标分类、目标识别与方位估计、图像编码与重构。可以简单理解为计算轮廓的有关信息。
monments()(函数,计算多边形和光栅形状得到最高达三阶的所有矩,计算形状的重心、面积,主轴和其它特征)、contourArea()(函数,计算整个轮廓或部分轮廓的面积)、arcLength()(函数,计算封闭轮廓的周长或曲线的长度)。
5、分水岭算法:需要分割图像,但是无法从背景图像中获得有用的信息时,用分水岭算法。边缘处为峰顶,均匀区域为山谷,以此区分出灰度值,实现分割目标,山谷被连接成一个整体的区域。分水岭表示的时输入图像的灰度的极大值。
watershed()(函数,需要先大致标记出图像的期望进行分割的区域)。
6、图像修补:利用已损坏区域的边缘,即边缘的颜色和结构,繁殖和混合打损坏的图像中,以达到图像修补的目的。
inpaint()(函数,清除图像的灰尘和划痕、从静态图像或视频中去除不需要的物体)。
七、直方图与匹配(imgproc组件部分)
1、直方图:直方图就是对数据进行统一的一种方法,获得的是数据发布的统计图。通过标记帧与帧之间显著的边缘和颜色的统计变化,来检测视频中场景的变化。
图像直方图:即亮度直方图(横坐标左暗纯黑,右亮纯白),借助此来实现图像的二值化。
2、直方图的绘制:
calcHist()(函数,计算直方图)
绘图函数:rectangle()(函数,绘制矩形)、line()(函数,绘制线段)
minMaxLoc()(函数,在数组中寻找全局最小值和最大值)
3、直方图类型:H-S直方图(二维)、一维直方图(常见)、RGB三色直方图。
4、直方图对比:用某些具体的标准来比较两个直方图的相识度;compareHist()(函数,对比直方图)。
5、反向投影:作用:用于在输入图像(较大)中查找与模板图像(较小,或者仅1像素)最匹配的点或者区域,也就是定位模板图像出现在输入图像的位置。反向投影中存储的数值代表了测试图像中该图像属于目标区域的概率。结果:以每个输入图像像素点为起点的直方图对比结果。
calcBackProject()(函数,计算反向投影)、mixChannels()(函数,由输入参数复制某通道到输出参数特定的通道中)。
6、模板匹配:在一幅图像中寻找与另一幅模板图像最匹配(相似)部分的技术。在输入图像上滑动图像块进行匹配。
matchTemplate()(函数,匹配出和模板重叠的图像区域,包含6中匹配方法)。
八、角点检测(feature2d组件部分)
兴趣点:即关键点、特征点;以特殊的点对局部进行有的放矢地分析;应用于物体识别、图像识别、图像匹配、视觉跟踪、三维重建等问题。
角点:两条边的交点,代表了两个边缘变化的方向上的点,是可以精确定位(最高亚像素级)的二维特征。该点在任意方向的一个微小变动都会引起灰度的很大变化。可以在相同的其它物体上精确定位(轮廓点则不能)。
角点检测(特征点检测):用来获取图像特征的一种方法,应用于运动检测、图像匹配、视频追踪、三维建模和目标识别等领域。大多数角点检测方法是拥有特定特征的图像点,而不仅仅是角点,如局部最大或最小灰度、某些梯度特征等。
分类:基于灰度图像的角点检测(基于梯度、基于模板、基于模板梯度)、基于二值图像的角点检测、基于轮廓曲线的角点检测。
主要考虑基于模板的方法:Kitchen-Rosenfeld角点检测算法、Harris角点检测算法、KLt角点检测算法。
1、Harris角点检测:优点:基于灰度图像,稳定性高,对L型角点检测精度高;缺点:采用高斯滤波,运行速度慢,角点信息有丢失和位置偏移现象,而且角点提取有聚簇现象。
cornerHarris()(函数,找出来输出图中的局部最大值,也就找出了角点)。
2、Shi-Tomasi角点检测:算是Harris算法的改进。只能提供简单的整数坐标值。
goodFeaturesToTrack()(函数,用于确定图像的强角点)。
3、亚像素级角点检测:有时候进行图像处理的目的不是提取用于识别的特征点,而是用于几何测量,则需要更高的坐标值精度(浮点实数)。适用于摄像机标定、跟踪并重建摄像机的轨迹,或者重建被跟踪目标的三维结构。
cornerSubPix()(函数,寻找亚像素角点,达到浮点精度)。
九、特征检测与匹配(feature2d组件部分)
10中特征检测方法:HARRIS(上章内容)、FAST、STAR、SIFT、SURF、ORB、MSER、GFTT、Dense、SimpleBlob。
1、SIFT特征点检测:尺寸不变特征变换算法。
采用DOG图像(高斯函数的差分,是灰度图像增强和角点检测的一种方法)。
2、SURF特征点检测:加速稳健特征(SIFT的加速版)。SURF采用了harr特征以及积分图像的概念,节省了降采样过程,比SUFT算子要快3倍。应用于计算机视觉的物体识别以及3D重构中。
采用Hessian矩阵行列式近似值图像(每一个像素点对应一个Hessian矩阵),先进行高斯滤波,再求二阶导构建H矩阵,根据H矩阵特征值的正负号来判断是不是极值点。
类:SUFR、SurfFeatureDetetor、SurfDescriptorExtractor。
drawKeypoints()(函数,绘制关键点,)
3、SURF特征提取:
SURF算法为每个检测到的特征定义了位置和尺度,尺度值可用于定义围绕特征点的窗口大小。无论物体的尺度在窗口是什么样的,都将包含相同的视觉信息,用于表示特征点以使他们与众不同。
SURF进行特征点描述主要是drawMatches方法和BruteForceMatcher类的应用。
drawMatches()(函数,绘制出相匹配的两个图象的关键点)。
BruteForceMatcher(类,进行暴力匹配相关的操作)。
4、FLANN进行特征点匹配:FLANN(快速最近邻逼近搜索函数库)。
FlannBasedMatcher:类,DescriptorMatcher::match(函数,从每个描述符查询集中找到最佳匹配)。
5、寻找已知物体(框选出):先使用findHomography函数寻找匹配上的关键点的变换,再使用perspectiveTransform函数来映射点。
findHomography()(函数,找到并返回源图像和目标图像之间的透视变换H)。
perspectiveTransform()(函数,进行向量透视矩阵变换)。
6、BRIEF算法:速度快。缺点:不具备旋转不变性、尺度不变性,对噪声敏感。
Brief算子:在特征点附近随机选取若干个点对,将这些点对的灰度值的大小,组合成一个二进制串,并将这个二进制串作为该特征点的特征描述子。
7、ORB特征提取:BRIEF算法的改进版。改进了Brief算法不具备旋转不变性、对噪声敏感的缺点,但仍然不具备尺度不变性。比SIFT算法快100倍,比SURF算法快10倍。
十:学习书目
《OpenCV3编程入门》,毛星云、冷雪飞版,电子工业出版社