简介
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类[构成],同时提供了Python、Ruby、MATLAB等语言的接口,实现了[图像处理]和计算机视觉方面的很多通用算法。
模块 | 功能 |
---|---|
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
(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子,具有多分辨率、灰度尺度不变、旋转不变等特性。主要用于特征提取中的纹理提取。
使用LBP作为人脸检测的特征提取方式具有:计算量小;存储空间小;计算过程简单,没有复杂的除法和特殊运算,便于硬件实现;检测的时间短,检测的实时性好。
LBP的核心思想就是:以中心像素的灰度值作为阈值,与他的领域相比较得到相对应的二进制码来表示局部纹理特征
基本LBP
原始的LBP算子定义为在33的窗口内,处理83这个像素点的lbp值
由一张原始图片 -> 33 的像素区域 -> 对每个点进行灰度 -> 以中心点的灰度值 83 作为基准 ,处理周围的像素点,大于 83 值为 1,否则为 0
最终得到lbp值 01111100 = 124 (注意顺时针)
代码流程如下:
/**
* 原始lbp:3x3的src
* 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<uchar>(i,j);
//取出对应 高、宽位置的像素 与 中心点位置进行比较
if(src.at<uchar>(i-1,j-1)>center) { lbp += 1 << 7;}
if(src.at<uchar>(i-1,j )>center) { lbp += 1 << 6;}
if(src.at<uchar>(i-1,j+1)>center) { lbp += 1 << 5;}
if(src.at<uchar>(i ,j+1)>center) { lbp += 1 << 4;}
if(src.at<uchar>(i+1,j+1)>center) { lbp += 1 << 3;}
if(src.at<uchar>(i+1,j )>center) { lbp += 1 << 2;}
if(src.at<uchar>(i+1,j-1)>center) { lbp += 1 << 1;}
if(src.at<uchar>(i ,j-1)>center) { lbp += 1 << 0;}
dst.at<uchar>(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、 等价LBP 等等是在基本LBP 的基础上算法优化提升
检测识别的原理:
将一幅图片划分为若干的子区域,对每个子区域内的每个像素点都提取LBP特征,然后,在每个子区域内建立LBPH(LBP特征的统计直方图)。 每个子区域就可以用一个统计直方图来进行描述;整个图片就由若干个统计直方图组成 之后,将图片和人脸的直方图进行相似性比较。
直方图:
把图片的亮度分为0到255共256个数值,数值越大,代表的亮度越高。其中0代表纯黑色的最暗区域,255表示最亮的纯白色,而中间的数字就是不同亮度的灰色。用横轴代表0-255的亮度数值。竖轴代表照片中对应亮度的像素数量,这个函数图像就被称为直方图。
简单来说,图像的直方图是用来表现图像中亮度分布的情况,给出的是图像中某个亮度或者某个范围亮度下共有几个像素
在统计学中,直方图是一种对数据分布情况的图形表示,是一种二维统计图表,它的两个坐标分别是统计样本(图像、视频帧)和样本的某种属性(亮度,像素值,梯度,方向,色彩等等任何特征)。