基于opencv的人脸识别和检测

article/2025/10/26 9:46:24

人脸识别作为一个热门项目,目前有多种方法实现,利用python和opencv来实现,是一个比较简单的项目。

1.环境配置

windows平台

python版本:3.8.6

pycharm版本:2019.1.2

Opencv版本:4.5.3

安装了python后,在命令行直接安装opencv库

pip install opencv-python

然后再去opencv官网,下载软件源码,如果下载速度过慢,可以选择网盘下载

2.实现思路

1.读取图片

2.灰度转换

3.修改图片大小

4.确定识别范围(脸)

5.实现人脸检测

6.多个目标的同时检测

7.对视频流实现检测

8.收集数据(录有带有人脸图片)

10.训练数据

11.实现人脸识别

3.具体实现

1.读取图片

#导入cv模块
import cv2 as cv
#读取图片
img = cv.imread('face1.jpg')
#显示图片
cv.imshow('show_img',img)
#等待,0表示无限等待后关闭窗口
cv.waitKey(0)
#释放内存
cv.destroyAllWindows()

cv的自带函数用起来很方便,imread,imshow函数等

2.灰度转换

#导入cv模块
import cv2 as cv
#读取图片
img = cv.imread('face2.jpg')
#灰度转换,使用到了cvt函数,其中img为图片参数,第二个为转换的颜色参数
gray_img = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
#显示灰度图片
cv.imshow('gray_img',gray_img)
#保存灰度图片
cv.imwrite('gray_face2.jpg',gray_img)
#显示图片
cv.imshow('show_img',img)
#等待
cv.waitKey(0)
#释放内存
cv.destroyAllWindows()

3.修改图片大小

#导入cv模块
import cv2 as cv
#读取图片
img = cv.imread('face2.jpg')
#修改尺寸,使用到resize函数,参数为图片名和修改后的大小
resize_img = cv.resize(img,dsize=(200,200))
#显示原图
cv.imshow('img',img)
#显示修改后的
cv.imshow('resize_img',resize_img)
#打印原图尺寸大小
print('未修改:',img.shape)
#打印修改后的大小
print('修改后:',resize_img.shape)
#等待关闭窗口
while True:if ord('g') == cv.waitKey(0):break
#释放内存
cv.destroyAllWindows()

 这一步中,我们可以自主选择是否关闭窗口,采用一个if语句,如果我们按下g键,关闭窗口

4.确定识别范围(脸)

#导入cv模块
import cv2 as cv
#读取图片
img = cv.imread('face2.jpg')
#坐标,确定识别的起始像素点位置坐标,识别的高度和宽度
x,y,w,h = 100,100,100,100
#绘制矩形,使用到rectangle函数,参数img为绘制的矩形位置和大小,边框颜色(bgr),边框粗细
cv.rectangle(img,(x,y,x+w,y+h),color=(0,0,255),thickness=2)
#绘制圆形,使用circle函数,参数为圆心,半径
cv.circle(img,center=(x+w,y+h),radius=100,color=(255,0,0),thickness=2)
#显示
cv.imshow('re_img',img)
while True:if ord('g') == cv.waitKey(0):break
#释放内存
cv.destroyAllWindows()

5.实现人脸检测

调用opencv训练好的分类器和自带的检测函数检测人脸人眼等的步骤简单直接:

1.加载分类器,当然分类器事先要放在工程目录中去。分类器本来的位置是在*\opencv\sources\data\haarcascades(harr分类器,也有其他的可以用,也可以自己训练)

2.调用detectMultiScale()函数检测,调整函数的参数可以使检测结果更加精确。

3.把检测到的人脸等用矩形(或者圆形等其他图形)画出来。

#导入cv模块
import cv2 as cv
#定义检测函数
def face_detect_demo():#灰度转换gary = cv.cvtColor(img,cv.COLOR_BGR2GRAY)#加载调用opencv自带分类器cv.CascadeClassifier,减少训练成本face_detect = cv.CascadeClassifier('D:/Opencv453/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml')#调用函数,后两个参数表示检测的矩形范围。face = face_detect.detectMultiScale(gary,1.01,5,0,(100,100),(300,300))#绘制检测范围for x,y,w,h in face:cv.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)cv.imshow('face_detect',img)
#读取图像
img = cv.imread('face2.jpg')
#检测函数
face_detect_demo()
#等待
while True:if ord('g') == cv.waitKey(0):break
#释放内存
cv.destroyAllWindows()

 这一步采用了opencv自带的分类器,Haar特征分类器就是一个XML文件,该文件中会描述人体各个部位的Haar特征值。包括人脸、眼睛、嘴唇等等。加载分类器的步骤如下:

加载分类器cv.CascadeClassifier

找到opencv的安装目录,如下图

在har下提供大量的分类器

我们先把路径复制,粘贴到

再把我们需要使用的分类器的名称复制

粘贴到

再把路径中的符号更改

同时使用到opencv中的face_detect.detectMultiScale函数

总共有5个参数

1.image表示的是要检测的输入图像(一般为灰度图,加快检测速度)

2.objects表示检测到的人脸目标序列,检测物体的矩形框向量组

3.scaleFactor表示每次图像尺寸减小的比例

4. minNeighbors表示每一个目标至少要被检测到n次才算是真的目标(因为周围的像素和不同的窗口大小都可以检测到人脸),

5.默认为0

6.minSize为目标的最小尺寸

7.minSize为目标的最大尺寸

改变上面的2,3,4参数,可以让检测到的人脸矩形框更准确

6.多个目标的同时检测

#导入cv模块
import cv2 as cv
#检测函数
def face_detect_demo():#灰度转换gary = cv.cvtColor(resize_img,cv.COLOR_BGR2GRAY)face_detect = cv.CascadeClassifier('D:/Opencv453/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')face = face_detect.detectMultiScale(gary)for x,y,w,h in face:cv.rectangle(resize_img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)cv.imshow('multi_face_detect',resize_img)
img = cv.imread('duoren.jpg')
resize_img = cv.resize(img,dsize=(2048,1024))
print('未修改:',img.shape)
print('修改后:',resize_img.shape)
#检测函数
face_detect_demo()
#等待
while True:if ord('g') == cv.waitKey(0):break
#释放内存
cv.destroyAllWindows()

此步导入多目标图片即可

7.对视频流实现检测

#导入cv模块
import cv2 as cv
#检测函数
def face_detect_demo(img):gary = cv.cvtColor(img,cv.COLOR_BGR2GRAY)face_detect = cv.CascadeClassifier('D:/Opencv453/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')face = face_detect.detectMultiScale(gary)for x,y,w,h in face:cv.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)cv.imshow('result',img)#读取摄像头,参数为0,调用默认摄像头
#cap = cv.VideoCapture(0)
#读取视频,按帧数读取
cap = cv.VideoCapture("test1.mp4")
#循环
while True:#调用cap.read函数flag,frame = cap.read()if not flag:breakface_detect_demo(frame)if ord('g') == cv.waitKey(1):break
#释放内存
cv.destroyAllWindows()
#释放摄像头
cap.release()

8.收集数据(录有带有人脸图片)

#导入模块
import cv2
#摄像头
cap=cv2.VideoCapture(0)falg = 1
num = 1while(cap.isOpened()):#检测是否在开启状态ret_flag,Vshow = cap.read()#得到每帧图像cv2.imshow("Capture_Test",Vshow)#显示图像k = cv2.waitKey(1) & 0xFF#按键判断if k == ord('s'):#保存cv2.imwrite("E:/PycharmProjects/facer/opencv/data/facedata/"+str(num)+".lumengyun"+".jpg",Vshow)print("success to save"+str(num)+".jpg")print("-------------------")num += 1elif k == ord(' '):#退出break
#释放摄像头
cap.release()
#释放内存
cv2.destroyAllWindows()
#将人脸照片保存后,后续可以通过特征提取,识别人脸

 当然,也可以直接将数据把保存在待训练数据集data里

10.训练数据 

这一步就是将前面几步录入人脸数据进行训练,通过将人脸特征和人脸的ID对应起来,完成人脸识别,每张图片都有一个ID

在data里面的facedata作为我们的待训练数据,获取到facedata

使用函数getImageAndLabels,得到图片的特征faces和ID(ids)

再用cv2.face.LBPHFaceRecognizer_create()函数,得到训练对象。

FaceRecognizer类,里面有相关的一些人脸识别的算法及函数接口

LBP是一种特征提取方式,能提取出图像的局部的纹理特征,最开始的LBP算子是在3X3窗口中,取中心像素的像素值为阀值,与其周围八个像素点的像素值比较,若像素点的像素值大于阀值,则此像素点被标记为1,否则标记为0。这样就能得到一个八位二进制的码,转换为十进制即LBP码,于是得到了这个窗口的LBP值,用这个值来反映这个窗口内的纹理信息。LBPH是在原始LBP上的一个改进,在opencv支持下我们可以直接调用函数直接创建一个LBPH人脸识别的模型。

再利用我们recognizer对象.去训练整合(train)之前得到的图像特征和图像ID(faces,np.array(ids))

最后将训练后的数据(向量)保存到trainer.yml,以后进行人脸识别,直接调用这个文件就可以了

函数getImageAndLabels的实现原理

首先先建立数组来存储需要的人脸特征相关数据和ID相关数据

再把所有的信息通过路径存储在IMagePaths中

加载分类器

再对上面保存的所有信息,进行一个遍历读取   for imagePath in imagePaths:

首先

#打开图片,以灰度化方式打开。PIL_img=Image.open(imagePath).convert('L')

PIL有九种不同模式:1,L,P,RGB,RGBA,CMYK,YCbCr,I,F 

#图片以灰度表示后,就是用数字来表示,这时候对它进行向量化,将图像转换为数组,以黑白深浅 。img_numpy=np.array(PIL_img,'uint8')

#获取图片人脸特征 。faces = face_detector.detectMultiScale(img_numpy)

#获取每张图片的id和姓名  id = int(os.path.split(imagePath)[1].split('.')[0])

#这里要注意预防无面容照片

for x,y,w,h in faces:ids.append(id)facesSamples.append(img_numpy[y:y+h,x:x+w])

 #打印脸部特征和id。print('id:', id),print('fs:', facesSamples)

最后将这些遍历的数据,全部都return到faces和ids中,得到全部训练后的数据集

import os
import cv2
import sys
from PIL import Image
import numpy as npdef getImageAndLabels(path):facesSamples=[]ids=[]imagePaths=[os.path.join(path,f) for f in os.listdir(path)]#检测人脸face_detector = cv2.CascadeClassifier('D:/Opencv453/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml')#打印数组imagePathsprint('数据排列:',imagePaths)#遍历列表中的图片for imagePath in imagePaths:#打开图片,灰度化。PIL有九种不同模式:1,L,P,RGB,RGBA,CMYK,YCbCr,I,FPIL_img=Image.open(imagePath).convert('L')# PIL_img = cv2.resize(PIL_img, dsize=(400, 400))# 向量化,将图像转换为数组,以黑白深浅img_numpy=np.array(PIL_img,'uint8')#获取图片人脸特征faces = face_detector.detectMultiScale(img_numpy)#获取每张图片的id和姓名id = int(os.path.split(imagePath)[1].split('.')[0])#预防无面容照片for x,y,w,h in faces:ids.append(id)facesSamples.append(img_numpy[y:y+h,x:x+w])#打印脸部特征和id#print('fs:', facesSamples)print('id:', id)#print('fs:', facesSamples[id])print('fs:', facesSamples)#print('脸部例子:',facesSamples[0])#print('身份信息:',ids[0])return facesSamples,idsif __name__ == '__main__':#图片路径path='./data/facedata/'#获取图像数组和id标签数组和姓名faces,ids=getImageAndLabels(path)#获取训练对象recognizer=cv2.face.LBPHFaceRecognizer_create()#recognizer.train(faces,names)#np.array(ids)recognizer.train(faces,np.array(ids))#保存文件recognizer.write('trainer/trainer.yml')#save_to_file('names.txt',names)

 此步是核心,决定人脸识别的准确与否,

11.实现人脸识别

将我们训练后存放在yml文件中的数据,导入到recognizer中,用这个文件来判断我们脸部特征是否符合,给出可执行评分

name = [] 存放我们训练数据图片文件名中,第一个.后面的字符,定义为名字

face_detect_demo中和上面的作用差不多,先把图片灰度化,然后加载分类器,然后进行检测,将整张图片中的人脸部分框起来,这部分就是我们得到的人脸照片。

得到的人脸照片,我们需要进行一个预测评分recoginzer.predict,得到的评分就是confidence

根据这个评分,来进行人脸识别,如果confidence过大,说明程序没有对这个人脸进行训练,无法通过验证,给出unknown提示

confidence未达到预警值,说明这个人脸被我们识别过,这是把上一步中训练识别得到的name打到矩形框上,给出人名。

import cv2
import numpy as np
import os
# coding=utf-8
import urllib
import urllib.request
import hashlib# 加载训练数据集文件
recognizer = cv2.face.LBPHFaceRecognizer_create()
recoginzer.read('trainer/trainer.yml')
# 名称
names = []
warningtime = 0# 准备识别的图片
def face_detect_demo(img):gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转换为灰度face_detector = cv2.CascadeClassifier('D:/Opencv453/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml')face = face_detector.detectMultiScale(gray, 1.1, 5, cv2.CASCADE_SCALE_IMAGE, (100, 100), (300, 300))# face=face_detector.detectMultiScale(gray)for x, y, w, h in face:cv2.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 255), thickness=2)cv2.circle(img, center=(x + w // 2, y + h // 2), radius=w // 2, color=(0, 255, 0), thickness=1)# 人脸识别ids, confidence = recoginzer.predict(gray[y:y + h, x:x + w])# print('标签id:',ids,'置信评分:', confidence)if confidence > 80:global warningtimewarningtime += 1if warningtime > 100:warningtime = 0cv2.putText(img, 'unkonw', (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)else:cv2.putText(img, str(names[ids - 1]), (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)cv2.imshow('result', img)# print('bug:',ids)def name():path = './data/facedata/'# names = []imagePaths = [os.path.join(path, f) for f in os.listdir(path)]for imagePath in imagePaths:name = str(os.path.split(imagePath)[1].split('.', 2)[1])names.append(name)cap = cv2.VideoCapture(0)
name()
while True:flag, frame = cap.read()if not flag:breakface_detect_demo(frame)if ord(' ') == cv2.waitKey(10):break
cv2.destroyAllWindows()
cap.release()
# print(names)


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

相关文章

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;请参考九、图像特征提取与匹配…

SIFT算法简介

1、 STFT&#xff08;Scale Invariant Feature Transform&#xff09;简介 1.1 SIFT特征检测的步骤1.2 SIFT算法的特点1.3 SIFT算法可以解决的问题 2 、尺度空间 2.1 多分辨率金字塔2.2 高斯金字塔构建示例2.3 高斯尺度空间&#xff08;使用不同的参数&#xff09; 3、DoG空间极…

经典算法研究系列:九、图像特征提取与匹配之SIFT算法

经典算法研究系列&#xff1a;九、SIFT算法研究 作者:July、二零一一年二月十五日。 推荐阅读&#xff1a;David G. Lowe, "Distinctive image features from scale-invariant keypoints," International Journal of Computer Vision, 60, 2 (2004), pp. 91-110---…