第1关:人脸检测
在前面的几个实训中,我们已经学习了人脸识别的基本流程,包括人脸图像采集、人脸检测、特征点提取和人脸识别的整个流程。不仅了解了其中的原理,还学会了编写实际应用的代码。
本实训主要将介绍使用Face Recognition
库进行人脸识别。因为Face Recognition
是对Dlib
的封装,所以其原理和我们前几个实训中,讲解的相同。在本实训中主要为大家讲解其基本使用方法。
为什么在学习完整个流程之后还要讲Face Recognition
库呢?因为,在前面的实训中,我们主要使用Dlib
库,它是一个在工业界和学术界广受好评,极其优秀的库。而Face Recognition
基于Dlib
库做了高度封装,当之无愧的称之为世界上最简洁的人脸识别库。
所以,我们学习完基础的原理以及Dlib
库,就好比学会了“走路”;而Face Recognition
库的高效与简洁,可以让我们彻底“跑起来”。
任务描述
本关任务:使用 face_recognition
中 face_locations
函数,定位人脸位置。
相关知识
在face recognition
库中,人脸检测只需两步:
- 读取照片;
- 检测人脸。
也就是将模型选择之类的操作都封装,默认使用Dlib
库中已经训练完成的模型。
例如,我们要识别以下图片中的人脸:
读取照片
在face rcognition
中使用 load_image_file
函数读取图片:
load_image_file(file, mode='RGB')
其中,各个参数的含义如下:
file
:带检测的图片文件路径;
mode
:可选值,默认为RGB
,也可以指定为L
,代表转化为灰度照片。
示例代码如下:
image = face_recognition.load_image_file("./images/Sheldon.jpg")
检测照片中人脸并返回人脸位置
我们使用face_locations
函数检测人脸:
face_locations(img, number_of_times_to_upsample=1, model="hog")
其中,各个参数的含义如下:
img
:待检测的图片对象;
number_of_times_to_upsample
:可选值,为寻找人脸进行多少次图片变换,值越大,越能找到更小的人脸;
model
:可选值,默认使用hog
模式,hog
模式在CPU
上运行表现更好;如果有GPU
加速,也可以指定为cnn
模式。
示例代码如下:
face_locations = face_recognition.face_locations(image)
完整示例
一个简单的完整示例非常简洁,只需几行:
# 加载face_recognition库
import face_recognition
# 读取照片
image = face_recognition.load_image_file("./images/Sheldon.jpg")
# 获取检测到的人脸位置
face_locations = face_recognition.face_locations(image)
# 打印人脸位置
print(face_locations)
运行程序,输出如下:
[(171, 438, 439, 171)]
同之前所学的人脸检测输出一样,输出包含了人脸左上角的位置 (247, 718)
, 以及人脸的宽度632
,和人脸的高度332
。
绘制人脸区域
我们同样可以使用之前学到的OpenCV
绘制人脸区域,再前面识别的基础代码上,加上下面的绘制代码:
import cv2
for face_location in face_locations:
top, right, bottom, left = face_location
cv2.rectangle(image, (left, top), (right, bottom), (0, 255, 0), 2)
# Show the picture
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
cv2.imshow("sd.png", image_rgb)
cv2.waitKey(0)
得到的绘制图片结果如下:
编程要求
根据提示,在右侧编辑器补充代码,检测图片中人脸并绘制:
获取指定路径中图片文件中的人脸,并打印输出结果;
使用
cv2
绘制人脸区域框。
第1关任务——代码题
'''****************BEGIN****************'''
import face_recognition
image_path = './step1/image/children.jpg'
image = face_recognition.load_image_file(image_path)
face_locations = face_recognition.face_locations(image)
print(face_locations)
'''**************** END ****************'''import cv2
for face_location in face_locations:'''****************BEGIN****************'''top,right,bottom,left = face_locationcv2.rectangle(image,(left,top),(right,bottom),(0,255,0),2)'''**************** END ****************'''# 保存图片
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
cv2.imwrite("./step1/out/children.jpg", image_rgb)
第2关:人脸特征点获取
任务描述
本关任务:使用 face_recognition
中 face_landmarks
函数,获取人脸特征点。
相关知识
人脸特征点的提取,在face_recognition
库中同样分为两步:
读取照片;
获取照片中人脸特征点。
假设我们要获取如下图片的特征点:
1. 读取照片
同样的,我们使用 load_image_file
函数读取照片,传入参数为照片文件路径,代码如下:
image = face_recognition.load_image_file("./images/face.jpg")
2. 获取照片中人脸特征点
可以使用face_landmarks
函数,获取人脸中特征点:
face_landmarks(face_image, face_locations=None, model="large")
其中,各个参数含义如下:
face_image
:图片对象;
face_locations
:可选,默认为空,也可以指定要识别的人脸区域位置;
model
:可选,不指定时的默认值为large
,另一个值为small
。large
代表识别68
个特征点,small
代表识别5
个特征点。
例如:
face_landmarks_list = face_recognition.face_landmarks(image)
完整代码示例
完整的人脸特征点检测,代码同样十分简洁:
# 导入face_recognition库
import face_recognition
# 读取照片
image = face_recognition.load_image_file("./images/face.jpg")
# 获取中铺中人脸特征点
face_landmarks_list = face_recognition.face_landmarks(image)
程序运行结果的其中一个人脸特征值如下:
[{
'chin': [(366, 261), (367, 272), (368, 282), (372, 293), (375, 303), (380, 312), (387, 319), (396, 324), (407, 325), (420, 324), (432, 319), (443, 312), (452, 302), (457, 289), (460, 276), (462, 262), (463, 248)],
'left_eyebrow': [(367, 252), (369, 244), (376, 240), (384, 239), (393, 241)],
'right_eyebrow': [(402, 239), (412, 234), (423, 233), (434, 235), (443, 240)],
'nose_bridge': [(398, 251), (398, 257), (398, 263), (397, 269)],
'nose_tip': [(391, 280), (395, 280), (400, 281), (406, 279), (411, 278)],
'left_eye': [(375, 258), (379, 254), (385, 253), (391, 256), (385, 258), (379, 259)],
'right_eye': [(414, 253), (420, 248), (427, 248), (433, 250), (427, 253), (421, 253)],
'top_lip': [(388, 298), (392, 293), (397, 290), (401, 290), (406, 289), (415, 291), (423, 295), (421, 295), (407, 292), (402, 293), (398, 293), (391, 297)],
'bottom_lip': [(423, 295), (416, 302), (408, 305), (403, 306), (398, 306), (393, 304), (388, 298), (391, 297), (398, 300), (402, 300), (407, 299), (421, 295)]
}]
可以看出,返回的结果是一个一位数组,数组的元素为 JSON
格式,包含的特征区域细分为:
脸颊
chin
;左眼眉毛
left_eyebrow
;右眼眉毛
right_eyebrow
;鼻梁
nose_bridge
;鼻尖
nose_tip
;左眼
left_eye
;右眼
right_eye
;上嘴唇
top_lip
;下嘴唇
bottom_lip
。
如果指定为 small
模式:
face_landmarks_list = face_recognition.face_landmarks(image, model='small')
其中一张脸的5
个特征点结果如下:
[{
'nose_tip': [(401, 281)],
'left_eye': [(373, 258), (390, 256)],
'right_eye': [(433, 250), (414, 252)]
}]
绘制特征点
我们使用之前学到的OpenCV
绘制点的方法,再前面获取到人脸特征点的基础代码上,加上下面的绘制代码:
for face_landmarks in face_landmarks_list:
for facial_feature in face_landmarks.keys():
for pt_pos in face_landmarks[facial_feature]:
cv2.circle(image, pt_pos, 1, (255, 0, 0), 2)
# 展示图片
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
cv2.imshow("laugh.jpg", image_rgb)
cv2.waitKey(0)
得到的绘制图片结果如下:
(提示:点击图片可以放大查看。)
编程要求
根据提示,在右侧编辑器补充代码,获取特征并绘图保存,
获取指定路径下(
./step2/image/laugh.jpg
)得图片文件68
个特征点,并打印结果;使用
cv2
绘制人脸特征点,点的颜色为红色。
第2关任务——代码题
import face_recognition
'''****************BEGIN****************'''
# 获取人脸特征点
image_path = './step2/image/laugh.jpg'
image = face_recognition.load_image_file(image_path)
face_landmarks_list = face_recognition.face_landmarks(image)
print(face_landmarks_list)
'''**************** END ****************'''import cv2# 绘制人脸特征点
for face_landmarks in face_landmarks_list:'''****************BEGIN****************'''for facial_feature in face_landmarks.keys():for pt_pos in face_landmarks[facial_feature]:cv2.circle(image, pt_pos, 1, (255, 0, 0), 2)'''**************** END ****************'''# 保存图片
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
cv2.imwrite("./step2/out/laugh.jpg", image_rgb)
第3关:人脸识别
任务描述
本关任务:使用face_recognition
中 编写一个能识别人脸的程序。
相关知识
在face recognition
库中,人脸识别分为三步:
读取人脸图片,包括已知姓名图片和未知姓名图片;
对各图片中人脸进行编码,获取
128
维的特征向量;比较
128
维的特征向量距离,识别人脸。
1. 读取图片
与前面不同,因为是识别图片,所以我们需要分别读取已知名字图片和未知名字图片:
known_image = face_recognition.load_image_file("./step3/images/cyx2.jpg")
unknown_image = face_recognition.load_image_file("./step3/images/cyx4.jpg")
2. 获取128维的特征向量
可以使用 face_encodings
函数对人脸进行编码,获取到对应128
维的人脸特征向量:
face_encodings(face_image, known_face_locations=None, num_jitters=1)
其中,各个参数的含义如下:
face_image
:包含单个或者多个人脸的图片对象;
known_face_locations
:可选值,已经知道名字的人脸位置;
num_jitters
:当计算编码时,进行多少次的re-sample
操作,次数越多,越精准(但同时会更慢,例如,值为100
时,会慢100
倍)。
分别对已知名字的人脸和未知名字的人脸,进行编码,示例代码如下:
cyx_encoding = face_recognition.face_encodings(known_image)[0]
unknown_encoding = face_recognition.face_encodings(unknown_image)[0]
3. 比较特征向量,识别人脸
最后,使用 compare_faces
函数,比较已经人脸与未知人脸之间特征向量:
compare_faces(known_face_encodings, face_encoding_to_check, tolerance=0.6)
其中,各个参数的含义如下:
known_face_encodings
:已知人脸特征向量的数组;face_encoding_to_check
:一个用于与已知向量相比较的未知人脸特征向量;tolerance
:容错率,默认的容错率是0.6
,容错率越低,识别越严格准确。
如果未知图片高于指定的容错率阈值,将会返回真(True
);如果低于指定的阈值,将会返回假(False
)。
results = face_recognition.compare_faces([cyz_encoding], unknown_encoding, tolerance=0.4)
完整示例
我们以下 图片1
作为已知图片:
图片1
陈奕迅:
通过人脸识别,检测以下图片2
,是否是同一个人:
图片2
:
人脸识别的完整示例代码如下:
import face_recognition
# 导入图片
known_image_cyz = face_recognition.load_image_file(
"./step3/images/cyx2.jpg")
unknown_image = face_recognition.load_image_file("./step3/images/cyx3.jpg")
# 编码获取128维特征向量
cyz_encoding = face_recognition.face_encodings(known_image_cyz)[0]
unknown_encoding = face_recognition.face_encodings(unknown_image)[0]
# 比较特征向量值,识别人脸
results = face_recognition.compare_faces([cyz_encoding], unknown_encoding, tolerance=0.4)
# 打印结果
print(results)
程序运行结果为:
[True]
可以看出,人脸识别结果正确。
编程要求
请在右侧编辑器中的BEGIN-END
之间编写代码,完成如下要求:
导入已知和未知图片;
编码已知和未知图片的编码获取
128
维特征向量;分别识别第一张和第二张未知图片,其中tolerance值设定为0.5。
第3关任务——代码题
import face_recognitiondef recognition():'''****************BEGIN****************'''# 导入图片known_image_path = "./step3/known_image/cyx1.jpg"known_image_cyz = face_recognition.load_image_file(known_image_path)unknown_image_1_path = "./step3/unknown_image/cyx2.jpg"unknown_image_2_path = "./step3/unknown_image/wlh.jpg"unknown_image_1 = face_recognition.load_image_file(unknown_image_1_path)unknown_image_2 = face_recognition.load_image_file(unknown_image_2_path)'''**************** END ****************''''''****************BEGIN****************'''# 编码获取128维特征向量cyz_encoding = face_recognition.face_encodings(known_image_cyz)[0]unknown_encoding_1 = face_recognition.face_encodings(unknown_image_1)[0]unknown_encoding_2 = face_recognition.face_encodings(unknown_image_2)[0]'''**************** END ****************''''''****************BEGIN****************'''# 比较特征向量值,识别人脸face1_result = face_recognition.compare_faces([cyz_encoding],unknown_encoding_1, tolerance=0.5)face2_result = face_recognition.compare_faces([cyz_encoding],unknown_encoding_2, tolerance=0.5)'''**************** END ****************'''return face1_result, face2_result
第4关:人脸识别绘制并展示
任务描述
本关任务:识别人脸并将识别的人名结果绘制到图片上。
相关知识
在前面的关卡中,我们学会了人脸检测和人脸识别。现在让我们整合之前学到的内容,完成一个完整的人脸识别流程,并将识别的人名结果绘制到图片上。
给定一系列已知的人脸图片和一系列未知的人脸图片,通过人脸识别技术,自动化的识别出未知人脸图片中包含人脸的名字,主要分为以下五个流程:
- 导入已知图片;
- 编码已知图片;
- 导入未知图片;
- 遍历识别;
- 绘制姓名和人脸。
我们以《军师联盟》中的四个人物:曹操、司马懿、张春华和荀彧为例。讲解以上五个步骤。
1. 导入已知图片
首先,我们准备已经名字的图片,如下:
使用load_image_file
导入这些图片,代码如下:
# 加载已知图片
known_image_cc = face_recognition.load_image_file("./step3/know_image/Caocao.jpg")
known_image_xy = face_recognition.load_image_file("./step3/know_image/XunYu.jpg")
known_image_smy = face_recognition.load_image_file("./step3/know_image/SiMayi.jpg")
known_image_zch= face_recognition.load_image_file("./step3/know_image/ZhangChunhua.jpg")
2. 编码已知图片
然后,使用face_encodings
对图片进行编码,获取128
维特征向量。同时,之后我们需要遍历已经照片来识别,所以先将已知人脸存为数组。
代码如下:
# 对图片进行编码,获取128维特征向量
caocao_encoding = face_recognition.face_encodings(known_image_cc)[0]
xy_encoding = face_recognition.face_encodings(known_image_xy)[0]
zys_encoding = face_recognition.face_encodings(known_image_smy)[0]
cyz_encoding = face_recognition.face_encodings(known_image_zch)[0]
# 存为数组以便之后识别
known_faces = [
caocao_encoding,
xy_encoding,
zys_encoding,
cyz_encoding
]
3. 导入未知图片
准备好已知图片信息之后,我们加载将要识别的未知图片:
四张照片分布对应于不同的已知照片中的任务。
代码如下:
# 加载待识别图片
unknown_image_1 = face_recognition.load_image_file(
"./step3/unknown_image/Caocao.jpg")
unknown_image_2 = face_recognition.load_image_file(
"./step3/unknown_image/SiMayi.jpg")
unknown_image_3 = face_recognition.load_image_file(
"./step3/unknown_image/ZhangChunhua.jpg")
unknown_image_4 = face_recognition.load_image_file(
"./step3/unknown_image/XunYu.jpg")
unknown_faces = [
unknown_image_1,
unknown_image_2,
unknown_image_3,
unknown_image_4
]
4. 遍历识别
遍历未知图片,对每一种未知图片,获取其人脸位置和特征向量。将得到的位置图片特征向量与所有已知的特征向量进行比较,判断是否为同一个人。需要注意的是这里我们设置 tolerance
为0.5
,实际应用时,可以根据自己对准确度的要求,进行调整。
# 初始化一些变量
face_locations = []
face_encodings = []
face_names = []
frame_number = 0
for frame in unknown_faces:
face_names = []
# 获取人脸区域位置
face_locations = face_recognition.face_locations(frame)
# 对图片进行编码,获取128维特征向量
face_encodings = face_recognition.face_encodings(frame, face_locations)
for face_encoding in face_encodings:
# 识别图片中人脸是否匹配已知图片
match = face_recognition.compare_faces(
known_faces, face_encoding, tolerance=0.5)
得到是否是同一个人的结果之后,我们可以对应其姓名,添加到face_names
数组中。
代码如下:
name = None
if match[0]:
name = "Caocao"
elif match[1]:
name = "XunYu"
elif match[2]:
name = "SiMayi"
elif match[3]:
name = 'ZhangChunhua'
else:
name = 'Unknown'
face_names.append(name)
5. 绘制姓名和人脸
得到对应的人脸识别结果之后,我们将遍历每一张未知图片中的人脸,通过 OpenCV
的rectangle
绘制脸部区域框和putText
对应的人名。
代码如下:
# 结果打上标签
for (top, right, bottom, left), name in zip(face_locations, face_names):
# 绘制脸部区域框
cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)
# 在脸部区域下面绘制人名
cv2.rectangle(frame, (left, bottom - 25),
(right, bottom), (0, 0, 255), cv2.FILLED)
font = cv2.FONT_HERSHEY_DUPLEX
cv2.putText(frame, name, (left + 6, bottom - 6),
font, 0.5, (255, 255, 255), 1)
最后,再将绘制完成的代码展示或者保存。
完整代码示例
整合以上五个步骤,完整的代码示例如下:
import face_recognition
import cv2
# 加载已知图片
known_image_cc = face_recognition.load_image_file(
"./step3/know_image/Caocao.jpg")
known_image_xy = face_recognition.load_image_file(
"./step3/know_image/XunYu.jpg")
known_image_smy = face_recognition.load_image_file(
"./step3/know_image/SiMayi.jpg")
known_image_zch = face_recognition.load_image_file(
"./step3/know_image/ZhangChunhua.jpg")
# 对图片进行编码,获取128维特征向量
caocao_encoding = face_recognition.face_encodings(known_image_cc)[0]
xy_encoding = face_recognition.face_encodings(known_image_xy)[0]
zys_encoding = face_recognition.face_encodings(known_image_smy)[0]
cyz_encoding = face_recognition.face_encodings(known_image_zch)[0]
# 存为数组以便之后识别
known_faces = [
caocao_encoding,
xy_encoding,
zys_encoding,
cyz_encoding
]
# 加载待识别图片
unknown_image_1 = face_recognition.load_image_file(
"./step3/unknown_image/Caocao.jpg")
unknown_image_2 = face_recognition.load_image_file(
"./step3/unknown_image/SiMayi.jpg")
unknown_image_3 = face_recognition.load_image_file(
"./step3/unknown_image/ZhangChunhua.jpg")
unknown_image_4 = face_recognition.load_image_file(
"./step3/unknown_image/XunYu.jpg")
unknown_faces = [
unknown_image_1,
unknown_image_2,
unknown_image_3,
unknown_image_4
]
# 初始化一些变量
face_locations = []
face_encodings = []
face_names = []
frame_number = 0
for frame in unknown_faces:
face_names = []
# 获取人脸区域位置
face_locations = face_recognition.face_locations(frame)
# 对图片进行编码,获取128维特征向量
face_encodings = face_recognition.face_encodings(frame, face_locations)
for face_encoding in face_encodings:
# 识别图片中人脸是否匹配已知图片
match = face_recognition.compare_faces(
known_faces, face_encoding, tolerance=0.5)
name = None
if match[0]:
name = "Caocao"
elif match[1]:
name = "XunYu"
elif match[2]:
name = "SiMayi"
elif match[3]:
name = 'ZhangChunhua'
else:
name = 'Unknown'
face_names.append(name)
# 结果打上标签
for (top, right, bottom, left), name in zip(face_locations, face_names):
if not name:
continue
# 绘制脸部区域框
cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)
# 在脸部区域下面绘制人名
cv2.rectangle(frame, (left, bottom - 25),
(right, bottom), (0, 0, 255), cv2.FILLED)
font = cv2.FONT_HERSHEY_DUPLEX
cv2.putText(frame, name, (left + 6, bottom - 6),
font, 0.5, (255, 255, 255), 1)
# 显示图片
image_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
cv2.imshow("laugh.jpg", image_rgb)
cv2.waitKey(0)
完成了整个流程,看看人脸识别的效果吧:
编程要求
请在右侧编辑器中的BEGIN-END
之间编写代码,识别人脸并绘制人脸区域和名字,具体任务如下:
导入已知图片,图片路径已经指定;
对导入的已知图片进行编码,获得特征向量;
将已经图片编码存为数组
known_faces
;导入未知图片,图片路径也已经指定;
将未知图片存为数组
unknown_faces
;对于每一张未知图片,获取其人脸区域
face_locations
以及特征编码face_encodings
;对于图片中的每一个人脸编码,识别图片中人脸是否匹配已知图片;
将匹配的图片,与名字一一对应;
绘制脸部区域框并在在脸部区域下面绘制人名。
第4关任务——代码题
import face_recognition
import cv2'''****************BEGIN****************'''
# 加载已知图片
known_image_c_path = "./step4/known_image/Caocao.jpg"
known_image_xy_path = "./step4/known_image/XunYu.jpg"
known_image_smy_path = "./step4/known_image/SiMayi.jpg"
known_image_zch_path = "./step4/known_image/ZhangChunhua.jpg"
known_image_cc = face_recognition.load_image_file(known_image_c_path)
known_image_xy = face_recognition.load_image_file(known_image_xy_path)
known_image_smy = face_recognition.load_image_file(known_image_smy_path)
known_image_zch = face_recognition.load_image_file(known_image_zch_path)
'''**************** END ****************''''''****************BEGIN****************'''
# 对图片进行编码,获取128维特征向量
caocao_encoding = face_recognition.face_encodings(known_image_cc)[0]
xy_encoding = face_recognition.face_encodings(known_image_xy)[0]
zys_encoding = face_recognition.face_encodings(known_image_smy)[0]
cyz_encoding = face_recognition.face_encodings(known_image_zch)[0]
'''**************** END ****************''''''****************BEGIN****************'''
# 存为数组以便之后识别
known_faces = [caocao_encoding,xy_encoding,zys_encoding,cyz_encoding
]
'''**************** END ****************''''''****************BEGIN****************'''
# 加载待识别图片
unknown_image_1_path = "./step4/unknown_image/Caocao.jpg"
unknown_image_2_path = "./step4/unknown_image/Cuple.jpg"
unknown_image_3_path = "./step4/unknown_image/ZhangChunhua.jpg"
unknown_image_4_path = "./step4/unknown_image/XunYu.jpg"
unknown_image_5_path = './step4/unknown_image/A.jpg'
unknown_image_1 = face_recognition.load_image_file(unknown_image_1_path)
unknown_image_2 = face_recognition.load_image_file(unknown_image_2_path)
unknown_image_3 = face_recognition.load_image_file(unknown_image_3_path)
unknown_image_4 = face_recognition.load_image_file(unknown_image_4_path)
unknown_image_5 = face_recognition.load_image_file(unknown_image_5_path)
'''**************** END ****************''''''****************BEGIN****************'''
# 存为数组以遍历识别
unknown_faces = [unknown_image_1,unknown_image_2,unknown_image_3,unknown_image_4,unknown_image_5
]
'''**************** END ****************'''# 初始化一些变量
face_locations = []
face_encodings = []
face_names = []
frame_number = 0
for frame in unknown_faces:face_names = []'''****************BEGIN****************'''# 获取人脸区域位置face_locations = face_recognition.face_locations(frame)# 对图片进行编码,获取128维特征向量face_encodings = face_recognition.face_encodings(frame, face_locations)'''**************** END ****************'''for face_encoding in face_encodings:'''****************BEGIN****************'''# 识别图片中人脸是否匹配已知图片match = face_recognition.compare_faces(known_faces, face_encoding,tolerance=0.5)'''**************** END ****************''''''****************BEGIN****************'''name = Noneif match[0]:name = "Caocao"elif match[1]:name = "XunYu"elif match[2]:name = "SiMayi"elif match[3]:name = 'ZhangChunhua'else:name = 'Unknown''''**************** END ****************'''face_names.append(name)# 结果打上标签for (top, right, bottom, left), name in zip(face_locations, face_names):if not name:continue'''****************BEGIN****************'''# 绘制脸部区域框cv2.rectangle(frame, (left, top), (right, bottom),(0, 0, 255), 2)# 在脸部区域下面绘制人名cv2.rectangle(frame, (left, bottom - 25),(right, bottom), (0, 0, 255), cv2.FILLED)font = cv2.FONT_HERSHEY_DUPLEXcv2.putText(frame, name, (left + 6, bottom - 6),font, 0.5, (255, 255, 255), 1)'''**************** END ****************'''print(frame[left+6, bottom-6])print(frame[left, bottom])print(face_locations)print(face_names)# 保存图片image_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)path = './step4/out/' + name + str(face_locations[0][0]) + '.jpg'cv2.imwrite(path, image_rgb)