美文网首页
OpenCV 学习系列-基础篇

OpenCV 学习系列-基础篇

作者: 棍子哥丸子妹 | 来源:发表于2020-03-30 21:50 被阅读0次

简介

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.jpg

基本LBP

原始的LBP算子定义为在33的窗口内,处理83这个像素点的lbp值
由一张原始图片 -> 3
3 的像素区域 -> 对每个点进行灰度 -> 以中心点的灰度值 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的亮度数值。竖轴代表照片中对应亮度的像素数量,这个函数图像就被称为直方图。

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

直方图.jpg

在统计学中,直方图是一种对数据分布情况的图形表示,是一种二维统计图表,它的两个坐标分别是统计样本(图像、视频帧)和样本的某种属性(亮度,像素值,梯度,方向,色彩等等任何特征)。

相关文章

网友评论

      本文标题:OpenCV 学习系列-基础篇

      本文链接:https://www.haomeiwen.com/subject/keybuhtx.html