OpenCV实现人脸识别
发布时间 - 2026-01-11 00:33:11 点击率:次主要有以下步骤:

1、人脸检测
2、人脸预处理
3、从收集的人脸训练机器学习算法
4、人脸识别
5、收尾工作
人脸检测算法:
基于Haar的脸部检测器的基本思想是,对于面部正面大部分区域而言,会有眼睛所在区域应该比前额和脸颊更暗,嘴巴应该比脸颊更暗等情形。它通常执行大约20个这样的比较来决定所检测的对象是否为人脸,实际上经常会做上千次。
基于LBP的人脸检测器基本思想与基于Haar的人脸检测器类似,但它比较的是像素亮度直方图,例如,边缘、角落和平坦区域的直方图。
这两种人脸检测器可通过训练大的图像集找到人脸,这些图像集在opencv中存在XML文件中以便后续使用。
这些级联分类检测器通常至少需使用1000个独特的人脸图像和10000个非人脸图像作为训练,训练时间一般LBP要几个小时,
Haar要一个星期。
项目中的关键代码如下:
initDetectors faceCascade.load(faceCascadeFilename); eyeCascade1.load(eyeCascadeFilename1); eyeCascade2.load(eyeCascadeFilename2); initWebcam videoCapture.open(cameraNumber); cvtColor(img, gray, CV_BGR2GRAY); //有需要则缩小图片使检测运行更快,之后要恢复原来大小 resize(gray, inputImg, Size(scaledWidth, scaledHeight)); equalizeHist(inputImg, equalizedImg); cascade.detectMultiScale(equalizedImg......);
人脸预处理:
实际中通常训练(采集图像)和测试(来自摄像机图像)的图像会有很大不同,受(如光照、人脸方位、表情等),
结果会很差,因此用于训练的数据集很重要。
人脸预处理目的是减少这类问题,有助于提高整个人脸识别系统的可靠性。
人脸预处理的最简单形式就是使用equalizeHist()函数做直方图均衡,这与人脸检测那步一样。
实际中,为了让检测算法更可靠,会使用面部特征检测(如,检测眼睛、鼻子、嘴巴和眉毛),本项目只使用眼睛检测。
使用OpenCV自带的训练好的眼部探测器。如,正面人脸检测完毕后,得到一个人脸,在使用眼睛检测器提取人脸的左眼区域和右眼区域,并对每个眼部区域进行直方图均衡。
这步涉及的操作有以下内容:
1、几何变换和裁剪
人脸对齐很重要,旋转人脸使眼睛保持水平,缩放人脸使眼睛之间距离始终相同,平移人脸使眼睛总是在所需高度上水平居中,
裁剪人脸外围(如图像背景、头发、额头、耳朵和下巴)。
2、对人脸左侧和右侧分别用直方图均衡
3、平滑
用双边滤波器来减少图像噪声
4、椭圆掩码
将剩余头发和人脸图像背景去掉
项目中的关键代码如下:
detectBothEyes(const Mat &face, CascadeClassifier &eyeCascade1, CascadeClassifier &eyeCascade2, Point &leftEye, Point &rightEye, Rect *searchedLeftEye, Rect *searchedRightEye); topLeftOfFace = face(Rect(leftX, topY, widthX, heightY)); //在左脸区域内检测左眼 detectLargestObject(topLeftOfFace, eyeCascade1, leftEyeRect, topLeftOfFace.cols); //右眼类似,这样眼睛中心点就得到了 leftEye = Point(leftEyeRect.x + leftEyeRect.width/2, leftEyeRect.y + leftEyeRect.height/2); //再得到两眼的中点,然后计算两眼之间的角度 Point2f eyesCenter = Point2f( (leftEye.x + rightEye.x) * 0.5f, (leftEye.y + rightEye.y) * 0.5f ); //仿射扭曲(Affine Warping)需要一个仿射矩阵 rot_mat = getRotationMatrix2D(eyesCenter, angle, scale); //现在可变换人脸来得到检测到的双眼出现在人脸的所需位置 warpAffine(gray, warped, rot_mat, warped.size()); //先对人脸左侧和右侧分开进行直方图均衡 equalizeHist(leftSide, leftSide); equalizeHist(rightSide, rightSide); //再合并,这里合并时左侧1/4和右侧1/4直接取像素值,中间的2/4区域像素值通过一定计算进行处理。 //双边滤波 bilateralFilter(warped, filtered, 0, 20.0, 2.0); //采用椭圆掩码来删除一些区域 filtered.copyTo(dstImg, mask);
收集并训练人脸:
一个好的数据集应包含人脸变换的各种情形,这些变化可能出现在训练集中。如只测试正面人脸,则只需训练图像有完全正面人脸即可。
因此一个好的训练集应包含很多实际情形。
本项目收集的图像之间至少有一秒的间隔,使用基于L2范数的相对错误评价标准来比较两幅图像素之间的相似性。
errorL2 = norm(A, B, CV_L2); similarity = errorL2 / (double)(A.rows * A.cols);
再与收集新人脸的阈值相比来决定是否收集这次图像。
可用很多技巧来获取更多的训练数据,如,使用镜像人脸、加入随机噪声、改变人脸图像的一些像素、旋转等。
//翻转 flip(preprocessedFace, mirroredFace, 1);
对每个人收集到足够多的人脸图像后,接下来必须选择适合人脸识别的机器学习算法,通过它来学习收集的数据,从而训练出一个人脸识别系统。
人脸识别算法:
1、特征脸,也称PCA(主成分分析)
2、Fisher脸,也称LDA(线性判别分析)
3、局部二值模式直方图(Local Binary Pattern Histograms,LBPH)
其他人脸识别算法:www.face-rec.org/algorithms/
OpenCV提供了CV::Algorithm类,该类有几种不同的算法,用其中一种算法就可以完成简单而通用的人脸识别。
OpenCV的contrib模板中有一个FaceRecognizer类,它实现以上这些人脸识别算法。
initModule_contrib(); model = Algorithm::create<FaceRecognizer>(facerecAlgorithm); model->train(preprocessedFaces, faceLabels);
这一代码将执行所选人脸识别的整个训练算法。
人脸识别:
1、人脸识别:通过人脸来识别这个人
可以简单调用FaceRecognizer::predict()函数来识别照片中的人,
int identity = model->predict(preprocessedFace);
它带来的问题是它总能预测给定的人(即使输入图像不属于训练集中的人)。
解决此问题的办法是制定置信度标准,置信度过低则可判读是一个不认识的人。
2、人脸验证:验证图像中是否有想找的人
为了验证是否可靠,或者说系统是否能对一个不认识的人进行正确识别,这需要进行人脸验证。
这里计算置信度的方法是:
使用特征向量和特征值重构人脸图,然后将输入的图像与重构图进行比较。如果一个人在训练集中有多张人脸图,用特征向量和特征
值重构后应该有非常好的效果,如果没有则差别很大,表明它可能是一个未知的人脸。
subspaceProject()函数将人脸图像映射到特征空间,再用subspaceReconstruct()函数从特征空间重构图像。
收尾:交互式GUI
利用OpenCV函数很容易绘制一些组件,鼠标点击等。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# opencv
# 人脸识别
# opencv 做人脸识别 opencv 人脸匹配分析
# 基于OpenCV的PHP图像人脸识别技术
# python使用opencv进行人脸识别
# 详解如何用OpenCV + Python 实现人脸识别
# Python opencv实现人眼/人脸识别以及实时打码处理
# python opencv3实现人脸识别(windows)
# 基于OpenCv实现的人脸识别(附Python完整代码)
# 的人
# 是一个
# 会有
# 出现在
# 重构
# 所需
# 面人
# 很重要
# 不认识
# 对人
# 两眼
# 眼部
# 也称
# 脸来
# 的是
# 识别系统
# 掩码
# 特征值
# 有一
# 这一
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
Win11关机界面怎么改_Win11自定义关机画面设置【工具】
Laravel如何使用模型观察者?(Observer代码示例)
佛山网站制作系统,佛山企业变更地址网上办理步骤?
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
如何确保FTP站点访问权限与数据传输安全?
Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道
如何在企业微信快速生成手机电脑官网?
什么是javascript作用域_全局和局部作用域有什么区别?
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
Win11怎样安装网易有道词典_Win11安装词典教程【步骤】
进行网站优化必须要坚持的四大原则
Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程
如何在阿里云部署织梦网站?
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程
长沙做网站要多少钱,长沙国安网络怎么样?
js代码实现下拉菜单【推荐】
如何在建站之星绑定自定义域名?
JavaScript如何操作视频_媒体API怎么控制播放
如何快速搭建高效香港服务器网站?
如何用PHP工具快速搭建高效网站?
如何用VPS主机快速搭建个人网站?
Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
,交易猫的商品怎么发布到网站上去?
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
如何在建站宝盒中设置产品搜索功能?
大同网页,大同瑞慈医院官网?
Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】
Laravel如何使用Telescope进行调试?(安装和使用教程)
详解Huffman编码算法之Java实现
佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】
Laravel怎么判断请求类型_Laravel Request isMethod用法
Python文件操作最佳实践_稳定性说明【指导】
Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】
JS实现鼠标移上去显示图片或微信二维码
安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出
桂林网站制作公司有哪些,桂林马拉松怎么报名?
Laravel PHP版本要求一览_Laravel各版本环境要求对照
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
Laravel如何创建自定义Facades?(详细步骤)

