opencv-第五章:人脸识别
·
OpenCV-计算机视觉技术(林伟鹏版)
opencv-第五章:人脸识别
文章目录
前言
本博客将教会大家如何使用opencv实现人脸识别
一、图像轮廓检测概念-第一步,图像读取
#第一步,图像读取
#导入cv模块
import cv2 as cv
#读取图片
img = cv.imread('2.hg.png')
#显示图片
cv.imshow('read_img',img)
#等待
cv.waitKey(0)
#释放内存
cv.destroyAllWindows()

二、人脸识别基础-第二步,灰度转换
#第二步,灰度转换
#导入cv模块
import cv2 as cv
#读取图片
img = cv.imread('face1.jpg')
#灰度转换,cvtColor 将图像由RGB转化为 GRAY 灰度图像
gray_img = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
#显示灰度图片
cv.imshow('gray',gray_img)
#保存灰度图片
cv.imwrite('gray_face1.jpg',gray_img)
#显示图片
cv.imshow('read_img',img)
#等待
cv.waitKey(0)
#释放内存
cv.destroyAllWindows()

三、人脸识别基础-第二步,灰度转换
#第三步,图像的尺寸修改
#导入cv模块
import cv2 as cv
#读取图片
img = cv.imread('face1.jpg')
#修改尺寸,将图像转化为200*200的大小
resize_img = cv.resize(img,dsize=(200,200))
#显示原图
cv.imshow('img',img)
#显示修改后的
cv.imshow('resize_img',resize_img)
#打印原图尺寸大小,使用shape方法展示图像的尺寸
print('未修改:',img.shape)
#打印修改后的大小
print('修改后:',resize_img.shape)
#等待
while True:
if ord('q') == cv.waitKey(0):
break
#释放内存
cv.destroyAllWindows()

四、人脸识别基础-第四步,给图像绘制矩形框
# 第四步,给图像绘制矩形框
#导入cv模块
import cv2 as cv
#读取图片
img = cv.imread('face1.jpg')
#坐标
x,y,w,h = 100,100,100,100
#绘制矩形,在(x,y)坐标,也就是在(100,100)这个位置,画一个长宽都为100的矩形,颜色
cv.rectangle(img,(x,y,x+w,y+h),color=(0,0,255),thickness=1)
#绘制圆形,同样也是在x,y)坐标,也就是在(100,100)这个位置,画一个radius=100的圆形
cv.circle(img,center=(x+w,y+h),radius=100,color=(255,0,0),thickness=5)
#显示
cv.imshow('re_img',img)
while True:
if ord('q') == cv.waitKey(0):
break
#释放内存
cv.destroyAllWindows()

五、人脸识别基础-第五步,人脸检查
- 关键注意寻找xml文件,在opencv库中
**#第五步,人脸检查
#使用的是opencv官方提供的代码,也是大家下载好opencv库后,我们本地的opencv文件夹夹中的一个文件
#找到我们本地的haarcascade_frontalface_alt2.xml的文件地址
# 导入OpenCV库,简写为cv方便后续调用
import cv2 as cv
# 定义人脸检测函数,封装检测逻辑
def face_detect_demo():
# 将彩色图像转换为灰度图像,人脸检测算法需要灰度图才能更准确识别
gary = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
# 加载OpenCV官方提供的人脸检测分类器(训练好的模型)
# 路径为OpenCV库自带的人脸检测xml文件位置
face_detect = cv.CascadeClassifier('C:/Users/HP/AppData/Roaming/Python/Python311/site-packages/cv2/data/haarcascade_frontalface_alt2.xml')
# 调用检测方法识别图片中的人脸
# gary:灰度图
# 1.01:图像缩放比例,越小检测越精细,速度越慢
# 5:最小邻域值,过滤误检测
# 0:参数保留位,固定为0
# (100,100):检测的最小人脸尺寸
# (300,300):检测的最大人脸尺寸
face = face_detect.detectMultiScale(gary,1.004,5,0,(80,80),(300,300))
# 遍历检测到的所有人脸坐标
# x,y:人脸左上角坐标;w,h:人脸宽度和高度
for x,y,w,h in face:
# 在原图上绘制红色矩形框标记人脸
# (0,0,255)表示红色,thickness=2表示边框粗细为2
cv.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)
# 创建窗口显示检测后的结果图像
cv.imshow('result',img)
# 读取本地图片文件,生成图像矩阵
# 图片路径为当前代码所在目录下的face1.jpg
img = cv.imread('face3.jpg')
# 调用人脸检测函数,执行检测并显示
face_detect_demo()
# 循环等待按键输入
# 实现窗口停留,不自动关闭
while True:
# 等待键盘按键,按下q键时退出循环
# cv.waitKey(0)表示无限等待按键输入
if ord('q') == cv.waitKey(0):
break
# 关闭所有OpenCV创建的窗口,释放系统资源
cv.destroyAllWindows()**

六、人脸识别基础-第六步,检测多个人脸
#第六步,检测多个人脸
# 导入OpenCV计算机视觉库,并用别名cv方便调用
import cv2 as cv
# 定义人脸检测功能函数
def face_detect_demo():
# 将读取的彩色图像转换为灰度图像
# 人脸检测算法必须使用灰度图才能正常工作
gary = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
# 加载OpenCV自带的人脸检测分类器(训练好的模型文件)
# 这个XML文件是官方训练好的正面人脸检测器
face_detect = cv.CascadeClassifier('C:/Users/HP/AppData/Roaming/Python/Python311/site-packages/cv2/data/haarcascade_frontalface_default.xml')
# 调用检测方法,在灰度图中检测人脸
# 无额外参数时,使用默认配置检测所有大小的人脸
face = face_detect.detectMultiScale(gary)
# 遍历检测到的所有人脸区域
# x,y:人脸左上角坐标 w:宽度 h:高度
for x,y,w,h in face:
# 在原始彩色图像上绘制红色矩形框标记人脸
# color=(0,0,255) 表示红色 thickness=2 表示边框粗细
cv.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)
# 创建名为result的窗口,显示标记好人脸的图像
cv.imshow('result',img)
# 从当前代码目录下读取图片文件 face2.jpg
img = cv.imread('face2.jpg')
# 调用已经定义好的人脸检测函数,执行检测并显示结果
face_detect_demo()
# 无限循环等待按键输入,让图像窗口保持显示
while True:
# 监听键盘按键,当按下 q 键时退出循环
# cv.waitKey(0) 表示无限等待按键
if ord('q') == cv.waitKey(0):
break
# 关闭所有OpenCV打开的窗口,释放系统资源
cv.destroyAllWindows()

七、人脸识别基础-第七步,视频检查
#第七步,视频检查
#导入cv模块
import cv2 as cv
#检测函数
def face_detect_demo(img):
gary = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
face_detect = cv.CascadeClassifier('C:/Users/HP/AppData/Roaming/Python/Python311/site-packages/cv2/data/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)
#读取摄像头
cap = cv.VideoCapture(0)
#循环
while True:
flag,frame = cap.read()
if not flag:
break
face_detect_demo(frame)
if ord('q') == cv.waitKey(1):
break
#释放内存
cv.destroyAllWindows()
#释放摄像头
cap.release()
八、人脸识别基础-第八步,拍照保存,制作人脸数据集
#第八步,拍照保存,制作人脸数据集
#导入模块
import cv2
#摄像头
cap=cv2.VideoCapture(0)
falg = 1
num = 1
while(cap.isOpened()):#检测是否在开启状态
ret_flag,Vshow = cap.read()#得到每帧图像
cv2.imshow("Capture_Test",Vshow)#显示图像
k = cv2.waitKey(1) & 0xFF#按键判断
if k == ord('s'):#保存
cv2.imwrite("D:mycodetest/opencv/data/jm/"+str(num)+".123"+".jpg",Vshow)
print("success to save"+str(num)+".jpg")
print("-------------------")
num += 1
elif k == ord(' '):#退出
break
#释放摄像头
cap.release()
#释放内存
cv2.destroyAllWindows()
九、人脸识别基础-第九步,训练数据
- 数据结构如下图:1表示图像序号,lena、hg、lyf表示图像标签,这个可以根据自己想法该,也可以一个文件夹名称一个类别人脸图像。

#第九步,训练数据
import os
import cv2
import sys
from PIL import Image
import numpy as np
# 全局姓名映射表(自动把 lena 转成数字 1,zhangsan 转成数字 2...)
name_to_id = {}
current_id = 1
def getImageAndLabels(path):
global current_id
facesSamples=[]
ids=[]
imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
#检测人脸
face_detector = cv2.CascadeClassifier('C:/Users/HP/AppData/Roaming/Python/Python311/site-packages/cv2/data/haarcascade_frontalface_alt2.xml')
#打印数组imagePaths
print('数据排列:',imagePaths)
#遍历列表中的图片
for imagePath in imagePaths:
#打开图片,黑白化
PIL_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)
# 获取真正的标签:从 1.lena.jpg 取出 lena(核心修复)
name = os.path.split(imagePath)[1].split('.')[1]
# 自动把姓名转为数字 ID,满足训练要求
if name not in name_to_id:
name_to_id[name] = current_id
current_id += 1
id = name_to_id[name]
#预防无面容照片
for x,y,w,h in faces:
ids.append(id)
facesSamples.append(img_numpy[y:y+h,x:x+w])
#打印脸部特征和id
print('姓名:', name, ' 数字ID:', id)
print('fs:', facesSamples)
# 保存姓名对照表,给识别程序用
with open('trainer/names.txt','w',encoding='utf-8') as f:
for name in name_to_id:
f.write(name + '\n')
return facesSamples,ids
if __name__ == '__main__':
#图片路径
path='./data/jm/'
#获取图像数组和id标签数组和姓名
faces,ids=getImageAndLabels(path)
#获取训练对象
recognizer=cv2.face.LBPHFaceRecognizer_create()
recognizer.train(faces,np.array(ids))
#保存文件
if not os.path.exists('./trainer/'):
os.makedirs('./trainer/')
recognizer.write('trainer/trainer.yml')

十、人脸识别基础-第十步,人脸识别部分
- 图像识别,也可以进行视频识别
#第十步,人脸识别部分
import cv2 as cv
import numpy as np
import os
# coding=utf-8
import urllib
import urllib.request
import hashlib
#加载训练数据集文件
recogizer=cv2.face.LBPHFaceRecognizer_create()
recogizer.read('trainer/trainer.yml')
names=[]
warningtime = 0
def md5(str):
import hashlib
m = hashlib.md5()
m.update(str.encode("utf8"))
return m.hexdigest()
#准备识别的图片
def face_detect_demo(img):
gray=cv2.cvtColor(img,cv.COLOR_BGR2GRAY)#转换为灰度
face_detector=cv2.CascadeClassifier('C:/Users/HP/AppData/Roaming/Python/Python311/site-packages/cv2/data/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 = recogizer.predict(gray[y:y + h, x:x + w])
#print('标签id:',ids,'置信评分:', confidence)
if confidence > 80:
cv2.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/jm/'
#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)
# 读取单张图片(替换视频)
frame = cv2.imread('3.lyf.jfif')
name()
# 执行识别
face_detect_demo(frame)
# 等待按键退出
cv2.waitKey(0)
cv2.destroyAllWindows()

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)