基于方向梯度直方图(HOG)的人脸检测(FD)——(一)

如下四篇博文:将HOG应用于FD(Face Detection)。

(一)
OpenCV3特征提取与目标检测之HOG(一)——HOG的概述与原理

(二)
OpenCV3特征提取与目标检测之HOG(二)——使用官方的行人分类器实现行人检测

(三)
基于方向梯度直方图(HOG)的人脸检测

(四)
CV之FD之HOG:人脸检测之基于HOG的人脸识别算法、简介、代码实现(偶像胡歌为例)之详细攻略

HOG(Histogram of Oriented Gradient):方向梯度直方图,一种特征描述子。通过计算与统计图像局部区域的梯度方向直方图来构成特征。
边缘是图像颜色剧变的区域;梯度主要存在于局部目标边缘的地方。
(1)局部目标的边缘
梯度(梯度幅值、梯度方向)。
(2)直方图
图像中像素强度分布的图像表达方式。
(3)HOG
将梯度方向角度值的范围变为[0,9)。

1.OpenCV3特征提取与目标检测之HOG(一)——HOG的概述与原理

1.1.Mat&
Mat:值传递;
Mat&:引用传递,少了对象的拷贝过程。
1.2.using namespace cv::ml;
OPENCV3中ML库
opencv3.0中,提供了一个ml.cpp的文件,这里面全是机器学习的算法。
1.3.积分图
在需要重复计算目标区域内像素值和的场合,积分图(图像积分图中每个点的值是原图像中该点左上角的所有像素值之和;“Summed Area Table”)都能大大地减少计算量。

积分图(一) - 原理及应用
积分图(二) - Block - Match(统计)滤波器
积分图(三) - Boxfilter 的实现过程分析

1.4.Sobel算子
Sobel算子是一个主要用于边缘检测的离散微分算子,它结合了高斯平滑和微分求导,用来计算图像灰度函数的近似梯度。在图像的任何一点使用次算子,都将会产生对应的梯度矢量或是其法矢量。
OpenCV——边缘检测(sobel算子、Laplacian算子、scharr滤波器)
1.5.OpenCV笛卡尔坐标转极坐标cartToPolar()
函数原型:void cartToPolar(const Mat& x, const Mat& y, Mat& magnitude, Mat& angle,bool angleInDegrees=false);
1.6.openCV中矩阵的计算函数
opencv中矩阵计算的一些函数
1.7.OpenCV中的Scalar
Scalar中包含4个元素的vector,主要用于表示一个像素。

template class Scalar_ : public Vec<_Tp, 4>
{
public:
    //! various constructors
    Scalar_();
    Scalar_(_Tp v0, _Tp v1, _Tp v2=0, _Tp v3=0);
    Scalar_(const CvScalar& s);
    Scalar_(_Tp v0);
    //! returns a scalar with all elements set to v0
    static Scalar_<_Tp> all(_Tp v0);
    //! conversion to the old-style CvScalar
    operator CvScalar() const;
    //! conversion to another data type
    template operator Scalar_() const;
    //! per-element product
    Scalar_<_Tp> mul(const Scalar_<_Tp>& t, double scale=1 ) const;
    // returns (v0, -v1, -v2, -v3)
    Scalar_<_Tp> conj() const;
    // returns true iff v1 == v2 == v3 == 0
    bool isReal() const;
};

1.8.OpenCV中integral()计算积分图
积分图是一种能够描述全局信息的矩阵表示方法,其构造方式是积分图像上位置(i,j)处的值ii(i,j)是原图像(i,j)左上角方向所有像素的和。
应用: 利用积分图可以可以快速的计算图像上某一区域内的像素和,如下图:
基于方向梯度直方图(HOG)的人脸检测(FD)——(一)_第1张图片
要计算区域D内的像素和,只需要获取到积分图上1、2、3/4点各自的像素值,分别表述为ii(1)、ii(2)、ii(3)、ii(4),则区域D的像素和=ii(4)+ii(1)-ii(2)-ii(3)。

Opencv中使用integral函数原型

void integral( InputArray src, OutputArray sum, int sdepth=-1 );

其中,参数src,可以使灰度图或RGB彩色图,单通道和三通道均可作为输入,但每个通道的精度必须是8位int或32位、64位浮点型;
参数sum,积分图,若输入src是灰度图,则积分图也是灰度图,若输入src是RGB三通道图,则积分图sum也是RGB三通道彩色。sum的图像深度是32位整型或32位、64位浮点型,这取决于第三个参数sdepth的定义;
参数sdepth,定义积分图的深度(depth),32位整型或者32位、64位浮点型(注意:图像的深度跟图像的通道数无关)。
1.9.OpenCV Mat中的相关属性
Opencv Mat矩阵中data、size、depth、elemSize、step等属性的理解
1.10.矩阵的归一化 normalize()函数
函数作用:Normalizes the norm or value range of an array。(归一化数据:范围归一化与数据值归一化。)
函数原型:

    void normalize(InputArray src,OutputArray dst, double  alpha=1, double  beta=0,
     int norm_type=NORM_L2, int dtype=-1, InputArray mask=noArray() )

其中,参数含义如下:
src :输入数组;
dst :输出数组,数组的大小和原数组一致;
alpha :1,规范数值,2.规范范围,并且是下限;
beta:只用来规范范围并且是上限;
norm_type:归一化选择的数学公式类型;
dtype:为负时,输出在大小深度通道数都等于输入;为正时,输出只在深度与输入不同,不同的地方由dtype决定;
mark:掩码,选择感兴趣区域,选定后只能对该区域进行操作。
归一化的类型norm_type的取值:设数组中原有{A1,A2,A3…An}
NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用。(Ak不属于{max(Ai)},min(Ai),当Ak等于max(Ai)时p=1,等于min(Ai)时p=0)
在这里插入图片描述
NORM_INF: 此类型的定义没有查到,根据OpenCV 1的对应项,可能是归一化数组的C-范数(绝对值的最大值) 。
在这里插入图片描述
NORM_L1 : 归一化数组的L1-范数(绝对值的和)
在这里插入图片描述
NORM_L2: 归一化数组的(欧几里德)L2-范数。
在这里插入图片描述
1.11颜色空间转换cvtColor()函数
函数作用:将图像从一个颜色空间转换到另一个颜色空间的转换,并且在转换的过程中能够保证数据的类型不变,即转换后的图像的数据类型和位深与源图像一致。但是从RGB向其他类型转换时,必须明确指出图像的颜色通道,在opencv中,其默认的颜色制式排列是BGR而非RGB。 所以对于24位颜色图像来说,前8-bit是蓝色,中间8-bit是绿色,最后8-bit是红色。
常见的R,G,B通道的取值范围为:
0-255 :CV_8U类型图片
0-65535: CV_16U类型图片
0-1: CV_32F类型图片
函数原型:

 C++: void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 );

其中,
src: 输入图像即要进行颜色空间变换的原图像,可以是Mat类 ;
dst: 输出图像即进行颜色空间变换后存储图像,也可以Mat类 ;
code: 转换的代码或标识,即在此确定将什么制式的图片转换成什么制式的图片;
dstCn = 0: 目标图像通道数,如果取值为0,则由src和code决定。
如下表格列出转换的标识符:
基于方向梯度直方图(HOG)的人脸检测(FD)——(一)_第2张图片
RGBA是代表Red(红色)、Green(绿色)、Blue(蓝色)和Alpha的色彩空间。Alpha参数一般用作不透明度参数,如果一个像素的alpha通道数值为0%,那它就是完全透明的也就是肉眼不可见,而数值为100%则意味着一个完全不透明的像素,传统的数字图像就是alpha值为100%。
1.12.Mat 矩阵数据类型转换convertTo()函数
函数作用:一般图像文件格式使用的是unsigned 8bits(Mat保存图片时,只能保存unsigned 8bits类型的格式,其他格式可以显示但不能imwrite),对应的数据类型有:CV_8UC1、CV_8UC2,CV_8UC3;其中,CV_8UC3表示3通道8位的unsigned char型。
函数原型(Mat类的成员函数):

void convertTo( OutputArray m, int rtype, double alpha=1, double beta=0 ) const;

其中,
m: 目标矩阵。如果m在运算前没有合适的尺寸或类型,将被重新分配;
rtype:目标矩阵的类型。因为目标矩阵的通道数与源矩阵一样,所以rtype也可以看做是目标矩阵的位深度。如果rtype为负值,目标矩阵和源矩阵将使用同样的类型;
alpha:尺度变换因子(可选);
beta:附加到尺度变换后的值上的偏移量(可选)。
opencv笔记(三十一)——Mat 矩阵数据类型转换convertTo

3.基于方向梯度直方图(HOG)的人脸检测

4.CV之FD之HOG:人脸检测之基于HOG的人脸识别算法、简介、代码实现(偶像胡歌为例)之详细攻略

你可能感兴趣的:(计算机视觉CV)