(项目笔记)opencv人脸识别

article/2025/10/26 9:40:28

Haar级联:

Haar特征:边缘特征,线性特征,中心环绕特征,对角线特征
在这里插入图片描述

这些特征组合为特征模板,特征模板里有白色和黑色矩形,模板特征即为白色矩形像素和减去黑色矩形像素和。

Haar 特征的提取简单说就是通过不断改变模版的大小、位置和类型,白色矩形区域像素和‘减 去’黑色矩形区域像素和,以得到每种类型模版的大量子特征。

Haar特征提取需要大量重复计算各个像素,因此使用积分图可以很好减少计算量。积分图将图像以线性时间初始化(仅第二次遍历图像时),并可以通过矩形区域 四个角的值,提供像素的总和
在这里插入图片描述

在此例中,如要知道ABCD面积,只需要将左上角作为基准,计算以下四部分面积,最后图3 - 图1 - 图2 - 图4即为ABCD面积

Haar 级联是一个基于 Haar 特征的级联分类器,级联分类器把弱分类器转换为强分类器

人脸识别流程:

人脸检测,图像采集:
加载人脸检测器
图像预处理(灰度化,直方图均衡化)
detectMultiscal识别
rectangle函数绘制矩形框
在原图截取人脸图像

人脸识别:
样本归一化
加载训练好的分类器
预测输入图像值
判断角色

人脸数据采集程序

注:单纯安装opencv-python没有包含人脸识别所使用函数,因为人脸识别函数还属于opencv测试版内容,稳定性还无法保证,因此没有放在常规发行版。要安装opencv-contrib-python

pip install opencv-contrib-python -i https://mirrors.aliyun.com/pypi/simple/

import cv2
import numpy as np
import osdef generate_img(dirname):face_cascade = cv2.CascadeClassifier('D:\\opencv\\data\\haarcascades\\haarcascade_frontalface_default.xml')if (not os.path.isdir(dirname)):os.makedirs(dirname)cap = cv2.VideoCapture(0)count = 0while True:ret,frame = cap.read()x,y = frame.shape[0:2]small_frame = cv2.resize(frame, (int(y/2), int(x/2)))result = small_frame.copy()gray = cv2.cvtColor(small_frame, cv2.COLOR_BGR2GRAY)faces = face_cascade.detectMultiScale(gray,1.3,5)for (x, y, w, h) in faces:result = cv2.rectangle(result, (x, y), (x + w, y + h), (255, 0, 0), 2)f = cv2.resize(gray[y: y + h, x: x + w], (200, 200))if count < 20:cv2.imwrite(dirname + '%s.pgm' % str(count), f)print(count)count += 1cv2.imshow('face', result)if cv2.waitKey(30) & 0xFF == ord('q'):breakcap.release()cv2.destroyAllWindows()if __name__ == '__main__':generate_img(".\\photos\\raine")

说明:
1 face_cascade = cv2.CascadeClassifier('D:\\opencv\\data\\haarcascades\\haarcascade_frontalface_default.xml')
引入opencv的人脸检测器。该程序参数路径为标记好的图片的xml文件,关于人脸图片的xml文件可以自己标记创建,也可以直接下载opencv官方库(https://github.com/opencv/opencv/tree/master/data/haarcascades)。这里引入其中一个xml文件路径(我用的是正脸照片文件)。注意windows里路径要使用 \ 而非 \ 。 因为 \ 为转义字符标注,使用 \ 为 \ 的转义字符。

2

ret,frame = cap.read()
x,y = frame.shape[0:2]
small_frame = cv2.resize(frame, (int(y/2), int(x/2)))
result = small_frame.copy()
gray = cv2.cvtColor(small_frame, cv2.COLOR_BGR2GRAY)

获取相机照片,缩放图片使长宽缩为一半,复制图片,转换图片为灰度图

3 faces = face_cascade.detectMultiScale(gray,1.3,5)
调用face_cascade对象识别人脸,参数:
1 image表示的是要检测的输入图像
2 objects表示检测到的人脸目标序列
3 scaleFactor表示每次图像尺寸减小的比例
4 minNeighbors表示每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大小都可以检测到人脸)
5 minSize为目标的最小尺寸
6 minSize为目标的最大尺寸

4

 for (x, y, w, h) in faces:result = cv2.rectangle(result, (x, y), (x + w, y + h), (255, 0, 0), 2)f = cv2.resize(gray[y: y + h, x: x + w], (200, 200))

用矩形框框出人脸。创建图像 f 为截取的人脸部分图片

5

if count < 20:cv2.imwrite(dirname + '%s.pgm' % str(count), f)print(count)count += 1

保存图片,count加一,count为20时停止保存
效果如下:

在这里插入图片描述

人脸识别
opencv有三种人脸识别方法:
1 Fisherfaces:PCA 衍生版本,更高级,速度更快
2 Eigenfaces:通过 PCA 处理,计算训练集相对于数据库发散程度,越小则数据库与检测 到人脸差别越小
3 Local Binary Pattern Histogram(LBPH):将人脸分成小单元,与模型对应单元比对,每 个比对区域产生一个直方图

人脸数据模型训练及识别

import os
import sys
import cv2
import numpy as np# search for face photos in the files 
def read_images(path, sz = None):index = 0images, indexes = [], []names = []# find path for samplesfor root, dirs, files in os.walk(path): # transverse the pathfor subdirs in dirs:    # get files in the childrens in pathsubject_path = os.path.join(root, subdirs)for filename in os.listdir(subject_path):   # get each photostry:if (filename == ".directory"):continue# find the path for each photofilepath = os.path.join(subject_path, filename)im = cv2.imread(os.path.join(subject_path, filename), cv2.IMREAD_GRAYSCALE) # read face samples# negative samplesif (im is None):print("image" + filepath + "is None")# positive samplesif (sz is not None):    im = cv2.resize(im, sz)images.append(np.asarray(im, dtype = np.uint8))indexes.append(index)except:print("unexpected error")raise # throw an exceptionindex = index + 1names.append(subdirs)return [names, images, indexes]# detect and classify face images
def face_rec(read_dir):# get face samples[names, x, y] = read_images(read_dir, sz = (200, 200))y = np.asarray(y, dtype=np.int32)model = cv2.face_EigenFaceRecognizer.create() # create face classifier modelmodel.train(np.asarray(x), np.asarray(y))   # train model# create face detector modelface_cascade = cv2.CascadeClassifier('C:/Users/linli/Desktop/faceDetect/haarcascade_frontalface_default.xml')cap = cv2.VideoCapture(0)while True:# get gray imageret, frame = cap.read()x, y = frame.shape[0:2]small_frame = cv2.resize(frame, (int(y / 2), int(x / 2)))result = small_frame.copy()gray = cv2.cvtColor(small_frame, cv2.COLOR_BGR2GRAY)# find face in the video framefaces = face_cascade.detectMultiScale(gray, 1.3, 5)for (x, y, w, h) in faces:# mark the face with a rectangleresult = cv2.rectangle(result, (x, y), (x + w, y + h), (255, 0, 0), 2)roi = gray[x:x + w, y:y + h]centerX = int(x + w / 2)centerY = int(y + h / 2)result = cv2.circle(result, (centerX, centerY), 5, (0, 0, 255), -1)try:roi = cv2.resize(roi, (200,200), interpolation=cv2.INTER_LINEAR)[p_label, p_confidence] = model.predict(roi)    # predict the face identityprint(p_confidence)# showthe prediction in textcv2.putText(result, names[p_label], (x, y - 20), cv2.FONT_HERSHEY_SIMPLEX, 1, 255, 2)except:continuecv2.imshow("recognize_face", result)if cv2.waitKey(30) & 0xFF == ord('q'):breakcap.release()cv2.destroyAllWindows()if __name__ == "__main__":face_rec("./photos")       

1 Python里os获取路径基本函数
os.path.join(String*):接受多个字符串为参数,将字符串连接为文件路径,如果出现以 / 开头的参数,路径从最后一个以 / 开头参数开始
os.listdir(path):参数为一个路径,返回该路径下所有文件和文件夹名称
os.walk(path):遍历选定路径文件夹,返回root,dirs,files。其中root为当前文件夹path的绝对路径,dirs为当前文件夹子文件夹,files为当前文件夹下文件

2 def read_images(path, sz = None):
该函数搜索文件夹里已有的人脸样本,得到一个路径(names)+图像(images)+序号(indexes)二维列表

3

model = cv2.face_EigenFaceRecognizer.create() # create face classifier model
model.train(np.asarray(x), np.asarray(y))   # train model

创建人脸分类对象并利用之前获得的人脸图片训练模型

4

faces = face_cascade.detectMultiScale(gray, 1.3, 5)

调用人脸识别模型,在视频画面中寻找人脸图像

5

roi = cv2.resize(roi, (200,200), interpolation=cv2.INTER_LINEAR)

Eigenfaces算法要求识别目标图像和样本图像大小一致,这里统一设为200*200

6

centerX = int(x + w / 2)
centerY = int(y + h / 2)
result = cv2.circle(result, (centerX, centerY), 5, (0, 0, 255), -1)

找到人脸中心并绘制圆
注:circle函数参数:图像,圆心,半径,颜色,线宽(负数代表填充)
圆心必须为int型

7

[p_label, p_confidence] = model.predict(roi) 

获取预测结构,包括标签名称和置信区间

效果如下:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/dVUsxABN.shtml

相关文章

【opencv】基于opencv实现人脸识别,原理代码部分

上一部分我们解决了环境问题&#xff0c;这一部分我们可以开始上代码&#xff0c;环境没有配好的可以参照上一篇博客&#xff1a;环境搭建解决&#xff1a; 下面先说一下原理&#xff1a; 一.原理部分 本文基于opencv来实现人脸识别&#xff0c;大致实现流程可以描述为&#…

基于opencv的人脸识别和检测

人脸识别作为一个热门项目&#xff0c;目前有多种方法实现&#xff0c;利用python和opencv来实现&#xff0c;是一个比较简单的项目。 1.环境配置 windows平台 python版本&#xff1a;3.8.6 pycharm版本&#xff1a;2019.1.2 Opencv版本&#xff1a;4.5.3 安装了python后…

C++ OpenCV【人脸识别人眼识别】

此文章仅对人脸位置进行检测&#xff0c;使用haar级联的方法[OpenCV自带] #include <iostream> #include <opencv2/opencv.hpp> #include <vector> #include <cstdio> using namespace std; using namespace cv;//定义7种颜色&#xff0c;用于标记人脸…

通过opencv实现简单的人脸识别

文章目录 通过opencv实现简单的人脸识别1.环境配置2.收集数据集3.人脸数据的处理4.通过神经网络训练模型5.进行人脸识别6.总结 通过opencv实现简单的人脸识别 ​ 网上有很多通过opencv实现的简单人脸识别&#xff0c;本文于其他文章差别不大&#xff0c;仅为作者复现代码后的一…

基于OpenCv的人脸识别(Python完整代码)

实验环境&#xff1a;python 3.6 opencv-python 3.4.14.51 建议使用 anaconda配置相同环境 背景 人脸识别步骤 图1&#xff1a;人脸识别流程图 人脸采集 采集人脸图片的方法多种多样&#xff0c;可以直接从网上下载数据集&#xff0c;可以从视频中提取图片&#xff0c;还可以…

使用opencv实现简单的人脸识别

一、opencv模块的使用 1、简介 opencv-python是一个python绑定库&#xff0c;旨在解决计算机视觉问题。使用opencv模块&#xff0c;可以实现一些对图片和视频的操作。 2、安装 安装opencv之前需要先安装numpy, matplotlib。然后使用pip安装opencv库即可。 3、导入 使用im…

opencv实现人脸识别(c++实现)

1 说明 本文章基于opencv VS2015 实现人脸检测 2 效果 可以直接打开摄像头对人脸进行识别&#xff0c;这些标识框也会跟随你的人脸移动。隐私问题&#xff0c;我这里对图片进行了识别。 3 相关类及函数介绍 opencv中文文档 3.1 cv::VideoCapture 官方文档说明 功能 &am…

11 OpenCV图像识别之人脸识别

文章目录 1 Eigenfaces1.1 建模流程1.2 示例代码 2 Fisherfaces2.1 建模流程2.2 示例代码 3 Local Binary Histogram3.1 建模流程3.2 示例代码 OpenCV 提供了三种人脸识别方法&#xff1a; Eigenfaces Eigenfaces是一种基于PCA&#xff08;Principal Component Analysis&#…

OpenCV人脸识别

OpenCV人脸识别与口罩检测 下载文件 人脸检测 人脸检测的检测方法主要有两类:基于知识(根据眼睛,眉毛,嘴巴,鼻子等器官特征及相互几何位置关系来检测)和基于统计(将人脸看作一个二维像素矩阵,通过大量人脸图像样本构造人脸模式空间,由相似度量判断人脸是否存在). 基于知识的…

【OpenCV】 人脸识别

目录 一&#xff1a;前言 二&#xff1a;人脸识别案例 实现步骤及完整代码 步骤1 灰度化处理 步骤2 将灰度图再次进行 行列压缩 步骤3 直方图均值化 步骤4 使用模型 对每一个像素点遍历 图像甄别 人脸识别案例 源码分享 结果测试&#xff1a;可对人脸框选识别 三&…

OpenCv人脸识别开发实战

一、OpenCV简介 OpenCV&#xff08;全称&#xff1a;Open Source Computer Vision Library&#xff09;&#xff0c;是一个跨平台的计算机视觉库。OpenCV可用于开发实时的图像处理、计算机视觉以及模式识别程序。 ​ OpenCV用C语言编写&#xff0c;它的主要接口也是C语言&#…

opencv-人脸识别

人脸识别即程序对输入的图像进行判别是否有人脸&#xff0c;并识别出有人脸的图像所对应的人。即我们常说的人脸识别一般包含了人脸检测和人脸识别两部分。下面对其在opencv中的相应模块进行分别介绍。 在opencv官网中&#xff0c;有许多推荐人脸在线数据集&#xff1a;http:/…

基于opencv的人脸识别

目录 一、OpenCV的简介 1、应用场景 二、人脸识别 1、人脸识别简介 2、人脸识别系统基本组成 三、人脸识别流程 四、主要代码注释 1、人脸采集函数 2、人脸训练函数 3、人脸识别函数&#xff08;注取消语音播报识别会流畅多&#xff09; 五、功能实现 六、演示视频…

最简单体验opencv人脸识别

所需软件&#xff1a;PyCharm 所需硬件&#xff1a;一台电脑 如果没有安装PyCharm&#xff0c;csdn上面搜一下安装教程就行&#xff0c;很简单的。 打开PyCharm&#xff0c;如果没有装opencv&#xff0c;则点击最下面的terminal&#xff0c;在终端下输入pip install opencn-p…

基于opencv的人脸识别(适合初学者)

简单易懂的人脸识别&#xff0c;学不会直接跪倒&#xff01; 一、人脸识别步骤 二、直接上代码 &#xff08;1&#xff09;录入人脸.py import cv2face_name cjw # 该人脸的名字# 加载OpenCV人脸检测分类器 face_cascade cv2.CascadeClassifier("D:/BaiduNetdiskDow…

手把手教你opencv做人脸识别(附源码+文档)

文章目录 一、环境二、使用Haar级联进行人脸检测三、Haar级联结合摄像头四、使用SSD的人脸检测五、 SSD结合摄像头人脸检测六、结语 一、环境 pip install opencv-pythonpython3.9 pycharm2020 人狠话不多&#xff0c;直接上代码&#xff0c;注释在代码里面&#xff0c;不说废…

SIFT算法实现图片匹配

SIFT (Scale-Invariant Feature Transform)是David Lowe 在1999发明的一种算法。它在世界范围内&#xff0c;作为图像对齐和对象识别的参考方法。此方法的鲁棒性能够检测场景的不同比例、角度和照明的因素。silx 中可用的实现使用 OpenCL&#xff0c;这意味着它可以在图形处理单…

SIFT

SIFT features Scale Invariant Feature Transform (SIFT) is an approach for detecting and extracting local feature descriptors that are reasonably invariant to change in illumination, image noise, rotation, scaling, and small changes in viewpoint. SIFT是一…

对SIFT算法的理解,尤其是尺度不变性

SIFT算法四大块 1&#xff0c;尺度空间的建立&#xff0c;最难理解的部分&#xff0c;这一步是为了找到极值点的潜在位置 2&#xff0c;极值点精确定位&#xff0c;通过曲线拟合找到极值点的确切位置 3&#xff0c;分配主方向&#xff0c;为特征点赋予一个方向标志&#xff…

第九章三续:SIFT算法的应用--目标识别之Bag-of-words模型

SIFT算法的应用 &#xff0d;目标识别之用Bag-of-words模型表示一幅图像 作者&#xff1a;wawayu&#xff0c;July。编程艺术室出品。 出处&#xff1a;http://blog.csdn.net/v_JULY_v 。 引言 本blog之前已经写了四篇关于SIFT的文章&#xff0c;请参考九、图像特征提取与匹配…