OpenCV 人脸跟踪预习资料

简介

​ OpenCV是一个基于BSD许可开源发行的跨平台计算机视觉库。拥有C++,Python和Java接口,并且支持Windows, Linux, Mac OS, iOS 和 Android系统。实现了图像处理和计算机视觉方面的很多通用算法。

模块 功能
Core 核心基础模块,定义了被所有其他模块和基本数据结构(包括重要的多维数组Mat)使用的基本函数、底层数据结构和算法函数
Imgproc 图像处理模块,包括:滤波、高斯模糊、形态学处理、几何变换、颜色空间转换及直方图计算等
Highgui 高层用户交互模块,包括:GUI、图像与视频I\O等
Video 视频分析,,运动分析及目标跟踪。
Calib3d 3D模块,包括:摄像机标定、立体匹配、3D重建等
Features2d 二维特征检测与描述模块,包括:图像特征检测、描述、匹配等
Objdetect 目标检测模块,如:人脸检测等
MI 机器学习模块,包括:支持向量机、神经网络等
Flann 最近邻开源库。包含一系列查找算法,自动选取最快算法的机制。
Imgcodecs 图像编解码模块,图像文件的读写操作
Photo 图像计算(处理)模块,图像修复及去噪。
Shape 形状匹配算法模块。描述形状、比较形状
Stitching 图像拼接
Superres 超分辨率模块
Videoio 视频读写模块,视频文件包括摄像头的输入。
Videostab 解决拍摄的视频稳定
Dnn 深度神经网络
contrib 可以引入额外模块

LBP

LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子,具有多分辨率、灰度尺度不变、旋转不变等特性。主要用于特征提取中的纹理提取。

LBP的核心思想就是:以中心像素的灰度值作为阈值,与他的领域相比较得到相对应的二进制码来表示局部纹理特征。

OpenCV 人脸跟踪预习资料_第1张图片
lbp.jpg

基本LBP

原始的LBP算子定义为在3*3的窗口内,处理83这个像素点的lbp值:

​ 将83与包围83的8个位置进行比较。如果大于83则取值为1,否则为0,然后将这些数据顺时针组合在一起,这样的到一个01111100,即:0x7C(124)。这就是83位置的lbp值。顺序并无硬性要求,只要在同一处理中保持相同的顺序即可。提取的LBP算子在每个像素点都可以得到一个LBP值,对一幅图像提取其原始的LBP算子之后,得到的原始LBP特征依然是“一幅图片”(记录的是每个像素点的LBP值)这种图片称之为lbp图谱。

/**
 * 原始lbp:应该是3x3的src(先不管3x3)
 * src: 原图
 * dst: 计算出的lbp图谱
 *
*/
void processLBP(Mat src, Mat &dst){
    // 循环处理图像数据
    for(int i=1; i < src.rows-1;i++) {
        for(int j=1;j < src.cols-1;j++) {
            uchar lbp = 0;
            uchar center = src.at(i,j);
            //取出对应 高、宽位置的像素 与 中心点位置进行比较
            if(src.at(i-1,j-1)>center) { lbp += 1 << 7;}
            if(src.at(i-1,j  )>center) { lbp += 1 << 6;}
            if(src.at(i-1,j+1)>center) { lbp += 1 << 5;}
            if(src.at(i  ,j+1)>center) { lbp += 1 << 4;}
            if(src.at(i+1,j+1)>center) { lbp += 1 << 3;}
            if(src.at(i+1,j  )>center) { lbp += 1 << 2;}
            if(src.at(i+1,j-1)>center) { lbp += 1 << 1;}
            if(src.at(i  ,j-1)>center) { lbp += 1 << 0;}
            dst.at(i-1,j-1) = lbp;
        }
    }
}
//读取一张图片
Mat img = imread("/path/x.png");
cvtColor(img, img, COLOR_BGR2GRAY);
//计算lbp图谱
Mat lbp = Mat(img.rows-2, img.cols-2,CV_8UC1);
processLBP(img,lbp);

从lBP定义可以看出LBP是灰度不变的,简单来说就是对图像的灰度值根据一个系数X进行修改,得出的LBP值不变。

圆形LBP

​ 基本的 LBP算子的最大缺陷在于它只覆盖了一个固定3x3范围内的小区域,为了满足不同尺寸的需要,并达到灰度和旋转不变性的要求,对 LBP 算子进行了改进,将 3×3邻域扩展到任意邻域,并用圆形邻域代替了正方形邻域。以某个像素点为中心,以一个任意大小半径R画一个圆,将落在圆内的P个像素与中心点像素比较得到LBP算子。

OpenCV 人脸跟踪预习资料_第2张图片
圆形lbp.png

旋转不变LBP

​ LBP 算子是灰度不变的,但却不是旋转不变的,图像的旋转就会得到不同的 LBP值。

OpenCV 人脸跟踪预习资料_第3张图片
旋转.png

为了解决这个问题,将 LBP算子进行了扩展具有旋转不变性。LBP的旋转不变模式,即不断旋转圆形邻域得到一系列初始定义的 LBP值,取其最小值作为该邻域的 LBP 值。

OpenCV 人脸跟踪预习资料_第4张图片
旋转不变.png

首先获得LBP值为: 11100001 (255),进过旋转分别得到8中不同的LBP值,最终得到的具有旋转不变性的 LBP值为 15。

等价LBP

​ 对于半径为R的圆形区域内含有P个采样点的LBP算子将会产生2^P(0和1的排列组合)种模式。随着邻域集内采样点数的增加,二进制模式的种类是以指数形式增加的。这么多的二进制模式导致在人脸检测时候LBP模式统计直方图过于稀疏(见下面检测原理部分)。因此需要对原始的LBP模式进行降维,也就是减少数据量。

​ 等价模式(均匀模式)就是解决这个问题的。在实际图像中,绝大多数LBP模式最多只包含两次从1到0或从0到1的跳变。因此,等价模式定义为:当某个LBP所对应的循环二进制数从0到1或从1到0最多有两次跳变时,该LBP所对应的二进制就称为一个等价模式类,除等价模式类以外的模式都归为另一类,称为混合模式类。

​ 00000000(0次跳变),00000111(1次从0到1的跳变),10001111(1到0,0到1,两次跳变)是等价模式类。

​ 10010111(共四次跳变)是混合模式类。

​ 通过这样的改进,二进制模式数量由原来的2^P种减少为 P* ( P-1)+2种。

比如:3x3的8采样本来有256种,现在变成58(等价模式)+1种(混合模式)。即本来lbp值为0-255,也就是256种结果,转化为了59种。混合模式编码为0,等价模式根据值大小编码为1—58。

00000000 : 1

00000001 : 2

00000010 : 3

00000101 : 0 (跳变3次)

检测原理

​ 将一幅图片划分为若干的子区域,对每个子区域内的每个像素点都提取LBP特征,然后,在每个子区域内建立LBPH(LBP特征的统计直方图)。 每个子区域就可以用一个统计直方图来进行描述;整个图片就由若干个统计直方图组成 之后,将图片和人脸的直方图进行相似性比较。

直方图:

把图片的亮度分为0到255共256个数值,数值越大,代表的亮度越高。其中0代表纯黑色的最暗区域,255表示最亮的纯白色,而中间的数字就是不同亮度的灰色。用横轴代表0-255的亮度数值。竖轴代表照片中对应亮度的像素数量,这个函数图像就被称为直方图。

简单来说,图像的直方图是用来表现图像中亮度分布的情况,给出的是图像中某个亮度或者某个范围亮度下共有几个像素

OpenCV 人脸跟踪预习资料_第5张图片
直方图.jpg

参考:
https://www.cnblogs.com/nsnow/p/4461998.html
https://www.cnblogs.com/lxy2017/p/3927280.html

你可能感兴趣的:(OpenCV 人脸跟踪预习资料)