opencvpython考勤_Python基于Opencv来快速实现人脸识别过程详解(完整版)

阅读: 评论:0

opencvpython考勤_Python基于Opencv来快速实现⼈脸识别
过程详解(完整版)
前⾔
随着⼈⼯智能的⽇益⽕热,计算机视觉领域发展迅速,尤其在⼈脸识别或物体检测⽅向更为⼴泛,今天就为⼤家带来最基础的⼈脸识别基础,从⼀个个函数开始⾛进这个奥妙的世界。
⾸先看⼀下本实验需要的数据集,为了简便我们只进⾏两个⼈的识别,选取了beyond乐队的主唱黄家驹和贝斯⼿黄家强,这哥俩长得有⼏分神似,这也是对⼈脸识别的⼀个考验:
两个⽂件夹,⼀个为训练数据集,⼀个为测试数据集,训练数据集中有两个⽂件夹0和1,之前看⼀些资料有说这⾥要遵循“slabel”命名规则,但后⾯处理起来⽐较⿇烦,因为⽬前opencv接受的⼈脸识别标签为整数,那我们就直接⽤整数命名吧:
为了⽅便,我们每个⼈⽤20张照⽚来训练,0代表黄家驹,1代表黄家强:
开始啦:
1.检测⼈脸
这应该是最基本的,给我们⼀张图⽚,我们要先检测出⼈脸的区域,然后才能
eps复合保温板进⾏操作,opencv已经内置了很多分类检测器,我们这次⽤haar:
def detect_face(img):
#将测试图像转换为灰度图像,因为opencv⼈脸检测器需要灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#加载OpenCV⼈脸检测分类器Haar
face_cascade = cv2.CascadeClassifier('./haarcascade_l')
#检测多尺度图像,返回值是⼀张脸部区域信息的列表(x,y,宽,⾼)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5)
# 如果未检测到⾯部,则返回原始图像
if (len(faces) == 0):
return None, None
#⽬前假设只有⼀张脸,xy为左上⾓坐标,wh为矩形的宽⾼
(x, y, w, h) = faces[0]
#返回图像的正⾯部分
return gray[y:y + w, x:x + h], faces[0]
2.有了数据集和检测⼈脸的功能后,我们就可以进⾏预训练了
最后返回所有训练图⽚的⼈脸检测信息和标签:
# 该函数将读取所有的训练图像,从每个图像检测⼈脸并将返回两个相同⼤⼩的列表,分别为脸部信息和标签
def prepare_training_data(data_folder_path):
# 获取数据⽂件夹中的⽬录(每个主题的⼀个⽬录)
dirs = os.listdir(data_folder_path)
# 两个列表分别保存所有的脸部和标签
faces = []
labels = []
# 浏览每个⽬录并访问其中的图像
for dir_name in dirs:
# dir_name(str类型)即标签
label = int(dir_name)
# 建⽴包含当前主题主题图像的⽬录路径
subject_dir_path = data_folder_path + "/" + dir_name
# 获取给定主题⽬录内的图像名称
subject_images_names = os.listdir(subject_dir_path)
# 浏览每张图⽚并检测脸部,然后将脸部信息添加到脸部列表faces[]
for image_name in subject_images_names:
# 建⽴图像路径
image_path = subject_dir_path + "/" + image_name
# 读取图像
image = cv2.imread(image_path)
# 显⽰图像0.1s
cv2.imshow("Training ", image)
cv2.waitKey(100)
# 检测脸部
face, rect = detect_face(image)
# 我们忽略未检测到的脸部
if face is not None:
#将脸添加到脸部列表并添加相应的标签
faces.append(face)
labels.append(label)
cv2.waitKey(1)
cv2.destroyAllWindows()
#最终返回值为⼈脸和标签列表
return faces, labels
3.有了脸部信息和对应标签后,我们就可以使⽤opencv⾃带的识别器来进⾏训练了:#调⽤prepare_training_data()函数
faces, labels = prepare_training_data("training_data")
#创建LBPH识别器并开始训练,当然也可以选择Eigen或者Fisher识别器
face_recognizer = cv2.face.LBPHFaceRecognizer_create()
ain(faces, np.array(labels))
4.训练完毕后就可以进⾏预测了
在这之前我们可以设定⼀下预测的格式,包括⽤矩形框框出⼈脸并标出其名字,当然最后别忘了建⽴标签与真实姓名直接的映射表:#根据给定的(x,y)坐标和宽度⾼度在图像上绘制矩形
def draw_rectangle(img, rect):
(x, y, w, h) = rect
# 根据给定的(x,y)坐标标识出⼈名
def draw_text(img, text, x, y):
cv2.putText(img, text, (x, y), cv2.FONT_HERSHEY_COMPLEX, 1, (128, 128, 0), 2)
#建⽴标签与⼈名的映射列表(标签只能为整数)
subjects = ["jiaju", "jiaqiang"]
5.现在就可以定义我们的预测函数了:
# 此函数识别传递的图像中的⼈物并在检测到的脸部周围绘制⼀个矩形及其名称
def predict(test_img):
#⽣成图像的副本,这样就能保留原始图像
img = py()
#检测⼈脸
face, rect = detect_face(img)
#预测⼈脸
label = face_recognizer.predict(face)
# 获取由⼈脸识别器返回的相应标签的名称
label_text = subjects[label[0]]
# 在检测到的脸部周围画⼀个矩形
draw_rectangle(img, rect)
# 标出预测的名字
draw_text(img, label_text, rect[0], rect[1] - 5)
#返回预测的图像
return img
6.最后使⽤我们test_data中的图⽚进⾏预测并显⽰最终效果:
#加载测试图像
test_img1 = cv2.imread("test_data/test1.jpg")
test_img2 = cv2.imread("test_data/test2.jpg")
#执⾏预测
predicted_img1 = predict(test_img1)
predicted_img2 = predict(test_img2)
#显⽰两个图像
蒸压加气块cv2.imshow(subjects[0], predicted_img1)
cv2.imshow(subjects[1], predicted_img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
来看看识别的结果:
这就是⼈脸识别最基本的流程,后续还会进⼀步的研究,下⼀篇我们将讨论本次实验的⼀些细节和注意事项,算是对本篇的⼀次挖掘和总结吧。
最后附上完整代码:
# # -*- coding:utf-8 -*-
import cv2
import os
import numpy as np
# 检测⼈脸
def detect_face(img):
#将测试图像转换为灰度图像,因为opencv⼈脸检测器需要灰度图像
无碳小车gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#加载OpenCV⼈脸检测分类器Haar双卡通
face_cascade = cv2.CascadeClassifier('./haarcascade_l')
#检测多尺度图像,返回值是⼀张脸部区域信息的列表(x,y,宽,⾼)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5)
# 如果未检测到⾯部,则返回原始图像
if (len(faces) == 0):
return None, None
#⽬前假设只有⼀张脸,xy为左上⾓坐标,wh为矩形的宽⾼
(x, y, w, h) = faces[0]
#返回图像的正⾯部分
return gray[y:y + w, x:x + h], faces[0]
# 该函数将读取所有的训练图像,从每个图像检测⼈脸并将返回两个相同⼤⼩的列表,分别为脸部信息和标签
def prepare_training_data(data_folder_path):
# 获取数据⽂件夹中的⽬录(每个主题的⼀个⽬录)
dirs = os.listdir(data_folder_path)
# 两个列表分别保存所有的脸部和标签
faces = []
labels = []
# 浏览每个⽬录并访问其中的图像
for dir_name in dirs:
# dir_name(str类型)即标签磁性刀架
label = int(dir_name)
# 建⽴包含当前主题主题图像的⽬录路径
subject_dir_path = data_folder_path + "/" + dir_name
# 获取给定主题⽬录内的图像名称
subject_images_names = os.listdir(subject_dir_path)
# 浏览每张图⽚并检测脸部,然后将脸部信息添加到脸部列表faces[] for image_name in subject_images_names:
# 建⽴图像路径
image_path = subject_dir_path + "/" + image_name
# 读取图像
image = cv2.imread(image_path)
# 显⽰图像0.1s
cv2.imshow("Training ", image)
cv2.waitKey(100)
# 检测脸部
face, rect = detect_face(image)
# 我们忽略未检测到的脸部
if face is not None:
#将脸添加到脸部列表并添加相应的标签
faces.append(face)
labels.append(label)果蔬纤维代餐粉
cv2.waitKey(1)
cv2.destroyAllWindows()
#最终返回值为⼈脸和标签列表
return faces, labels

本文发布于:2023-07-13 15:01:05,感谢您对本站的认可!

本文链接:https://patent.en369.cn/patent/2/175454.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:图像   脸部   识别   标签   检测   列表
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图