基于 opencv 的人脸识别系统

2022-03-29 08:54:30 浏览数 (1)

摘 要:

随着智能设备的不断发展,人脸检测技术应用于越来越多的领域,极大的丰富和方便了人们的生活,具有很大的商业价值和研究意义。人 脸 识 别 主 要 为 两 个 步 骤:人 脸 检 测(FaceDetection)和人脸识别(Face Recogniton)。人脸检测就是判断待检测图像中是否存在人脸以及人脸在图片中的位置,人脸识别则是将检测到的人脸与已知的人脸库中的人脸进行比对,得出相似度信息。本项目基于天嵌的 TQ2440(采用 S3C2440 处理器)硬件开发平台,扩展 USB 摄像头模块,搭建配置嵌入式开发环境,给出并实现了一个嵌入式人脸识别实现方案。本系统使用人脸类 harr 特征、Adaboost 算法进行人脸检测,采用 PCA(Principal Component Analysis)降维算法得到特征脸子空间,将在 PC 平台训练的人脸识别分类器预存到嵌入式目标平台,最后结合最近邻匹配算法实现在线人脸识别,实际采集的图片测试结果表明该系统效果良好。

系统实现

(一)图像采集

图像采集部分负责采集图像,将来自于外部设备的图像转换为可处理的数字图像格式。实验选用的是 Z301P芯片的 USB 摄像头,其驱动程序是 Linux 下常用的通用驱动 spca5xx。Linux 系统为视频捕获提供的统一的程序设计接口是 V4L(Video4Linux),通过调用 V4L 函数来实现视频采集功能。

(二)图像预处理在采集实时图像的时候,受拍摄角度、位置等因素影响,导致检测到的人脸在整幅图像中的位置和大小不确定。为了能准确地识别人脸,必须对其进行一定的预处理,使得人脸图像具有标准灰度等级、标准位置、标准大小。本系统用到的图像预处理方法主要是以下 4 种:

(1)几何归一化:将图像中检测到的人脸部分裁剪出来,然后缩放到统一大小。

(2)灰度归一化:彩色图像转换为灰度图像。

(3)平滑处理:也叫做“模糊处理”, 为了降噪和图像不失真,本系统采用高斯平滑。

(4)灰度均衡:采用直方图均衡,可以减小不同人脸图像的亮度差别,提高图像对比度。

(三)人脸检测与定位AdaBoost 算法可以通过不断添加弱分类器使得总分类器在训练集上的错误率任意小。首先,给每个训练样本引入一个权值 wi, 训练过程通过迭代实现。迭代训练过程当中,要尽量满足当前权值下的错误率最低。下一次的迭代,要更关注错误样本,可以通过增加错误样本的权值和减少正确样本的权值来达到目标 。

人脸检测方法的训练过程包括:采集训练样本集(人脸样本和分人脸样本),并对样本进行预处理(包括将彩色图像转换为灰度图、图像缩放到同一大小、

归一化等);利用积分图算法计算样本集中所有的类harr 特征 ;训练过程按照 Adaboost 算法,输入的是类Harr 特征,输出的是一个分级级联分类器。分级级联分类器包含了若干个强分类器, 每个强分类器又包含了若干个弱分类器,一个弱分类器对应一个按照某个规则选择出来的类 Harr 特征。人脸检测函数以不同比例大小的扫描窗口对目标图片进行匹配搜索,如果找到包含目标的方形区域,则返回这些方形区域。在处理和搜索到候选方形区域后,接着对这些候选区域进行合并,最后返回一系列足够大的合并后的平均方形区域。

(四)人脸识别

特征提取是人脸识别的关键问题之一。PCA 是一种数据降维方法,它将数据维数高的样本用尽可能少的特征向量去描述,以达到压缩数据的目的 [9]。在降维过程中,是使用向量线性变换来表征数据的关键信息,所以可以最大程度的保留人脸的主要信息。软件设计部分,自动人脸识别的大概过程如下:

step1:摄像头采集图像;

step2:平滑处理、灰度均衡;

step3:图像中的人脸检测与定位;

step4:归一化处理,并载入样本人脸库数据;

step5:将待识别人脸投影到之前训练好的特征子空间;

step6:计算待识别人脸与训练库中每张人脸的距离;

step7:根据最小距离计算相似度并判断是否是样本库中的人,结束。

关键代码如下:

nEigens = nTrainFaces-1;// nEigens 是特征值数

// 为特征向量分配存储空间

faceImageSize.width = faceImageArray[0]->width;

faceImageSize.height = faceImageArray[0]->height;

eigenVectorArray= (IplImage**)cvAlloc(sizeof(IplImage*)

* nEigens);

for(i=0; i<nEigens; i )

eigenVectorArray[i] = cvCreateImage(faceImageSize,

IPL_DEPTH_32F, 1);

// 将特征值存放到矩阵中

eigenValueMat = cvCreateMat( 1, nEigens, CV_32FC1 );

// 存放平均脸的图片

pAverageTrainImage = cvCreateImage(faceImageSize,IPL_DEPTH_32F, 1);

// PCA 迭代次数

calcLimit = cvTermCriteria( CV_TERMCRIT_ITER,nEigens, 1);

// 用 opencv 中提供的函数 cvCalcEigenObjects 计算平均脸、特征值和特征向量

cvCalcEigenObjects( nTrainFaces,(void*)faceImageArray,(void*)eigenVectorArray,CV_EIGOBJ_NO_CALLBACK, 0 , 0 , &calcLimit,pAverageTrainImage, eigenValueMat->data.fl);cvNormalize(eigenValueMat, eigenValueMat, 1, 0, CV_L1, 0); // 归一化数组元素。

0 人点赞