手机网站建设 苏州,优秀个人网站设计图片,上海logo在线制作,phpnow超详细WordPress文章目录 dlib库dlib库——人脸应用实例——表情识别dlib库——人脸应用实例——疲劳检测 dlib库 dlib库的基础用法介绍可以参考这篇文章#xff1a;https://blog.csdn.net/lou0720/article/details/145968062?spm1011.2415.3001.5331#xff0c;故此这篇文章只介绍dlib的人… 文章目录 dlib库dlib库——人脸应用实例——表情识别dlib库——人脸应用实例——疲劳检测 dlib库 dlib库的基础用法介绍可以参考这篇文章https://blog.csdn.net/lou0720/article/details/145968062?spm1011.2415.3001.5331故此这篇文章只介绍dlib的人脸应用实例。 dlib库——人脸应用实例——表情识别 代码
import numpy as np
import cv2
import dlib
from sklearn.metrics.pairwise import euclidean_distances
from PIL import Image, ImageDraw, ImageFontdef cv2AddChineseText(img, text, position, textColor(0, 255, 0), textSize20): 向图片中添加中文 # 判断输入的 img 是否为 OpenCV 格式的图片即 numpy.ndarray 类型if isinstance(img, np.ndarray):# 如果是 OpenCV 格式将其从 BGR 颜色空间转换为 RGB 颜色空间# 因为 PIL 库使用 RGB 颜色空间而 OpenCV 使用 BGR 颜色空间img Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))# 在 img 图片上创建一个绘图对象用于后续绘制文本draw ImageDraw.Draw(img)# 定义字体的格式使用 simsun.ttc 字体文件指定字体大小为 textSize# 并设置编码为 UTF - 8 以支持中文显示fontStyle ImageFont.truetype(simsun.ttc, textSize, encodingutf-8)# 在指定的 position 位置使用指定的 textColor 颜色和 fontStyle 字体绘制文本draw.text(position, text, textColor, fontfontStyle)# 将绘制好文本的 PIL 图片转换回 numpy.ndarray 类型并将颜色空间从 RGB 转换回 BGR# 以符合 OpenCV 的要求return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)def MAR(shape):计算嘴巴纵横比Mouth Aspect Ratio:param shape: 68 个人脸特征点的坐标数组:return: 嘴巴纵横比# 计算嘴巴上下部分特定点之间的欧氏距离A euclidean_distances(shape[50].reshape(1, 2), shape[58].reshape(1, 2))B euclidean_distances(shape[51].reshape(1, 2), shape[57].reshape(1, 2))C euclidean_distances(shape[52].reshape(1, 2), shape[56].reshape(1, 2))# 计算嘴巴左右两侧特定点之间的欧氏距离D euclidean_distances(shape[48].reshape(1, 2), shape[54].reshape(1, 2))# 计算嘴巴纵横比即上下部分平均距离与左右距离的比值return ((A B C) / 3) / Ddef MJR(shape):计算嘴巴与下巴宽度比Mouth to Jaw Ratio:param shape: 68 个人脸特征点的坐标数组:return: 嘴巴与下巴宽度比# 计算嘴巴左右两侧特定点之间的欧氏距离M euclidean_distances(shape[48].reshape(1, 2), shape[54].reshape(1, 2))# 计算下巴左右两侧特定点之间的欧氏距离J euclidean_distances(shape[3].reshape(1, 2), shape[13].reshape(1, 2))# 计算嘴巴与下巴宽度比return M / Jdef MBR(shape):计算眉毛间距比Mouth to Brow Ratio:param shape: 68 个人脸特征点的坐标数组:return: 眉毛间距比# 计算左右眉毛内侧特定点之间的欧氏距离F euclidean_distances(shape[21].reshape(1, 2), shape[22].reshape(1, 2))# 计算左右眉毛外侧特定点之间的欧氏距离I euclidean_distances(shape[17].reshape(1, 2), shape[26].reshape(1, 2))# 计算眉毛间距比return F / I# 打开默认摄像头用于实时视频捕获
cap cv2.VideoCapture(0)
# 加载预训练的 68 点人脸特征预测模型
predictor dlib.shape_predictor(shape_predictor_68_face_landmarks.dat)
# 创建人脸检测器对象
detector dlib.get_frontal_face_detector()while True:# 从摄像头读取一帧视频ret, frame cap.read()# 水平翻转视频帧使画面看起来更自然frame cv2.flip(frame, 1)# 如果读取失败跳出循环if ret is None:break# 检测视频帧中的人脸faces detector(frame, 0)for face in faces:# 预测人脸的 68 个特征点shape predictor(frame, face)# 将特征点转换为 numpy 数组shape np.array([[p.x, p.y] for p in shape.parts()])# 计算嘴巴纵横比mar MAR(shape)# 计算嘴巴与下巴宽度比mjr MJR(shape)# 计算眉毛间距比mbr MBR(shape)# 初始化表情结果为正常result 正常# 打印各个比值print(mar, mar, \tmjr, mjr, mbr, mbr)# 根据比值判断表情if mar 0.5:result 大笑elif mjr 0.45:result 微笑elif mbr 0.15:result 生气# 计算嘴巴轮廓的凸包mouthHull cv2.convexHull(shape[48:61])# 在视频帧上添加中文表情结果frame cv2AddChineseText(frame, result, mouthHull[0, 0])# 在视频帧上绘制嘴巴轮廓cv2.drawContours(frame, [mouthHull], -1, (0, 255, 0), 1)# 显示处理后的视频帧cv2.imshow(img, frame)# 等待用户按键等待时间为 1 毫秒key cv2.waitKey(1)# 如果用户按下 ESC 键ASCII 码为 27跳出循环if key 27:break
# 释放摄像头资源
cap.release()
# 关闭所有 OpenCV 窗口
cv2.destroyAllWindows()dlib库——人脸应用实例——疲劳检测 当闭眼时间长时发出危险警告。 代码
import numpy as np
import cv2
import dlib
from sklearn.metrics.pairwise import euclidean_distances
from PIL import Image, ImageDraw, ImageFontdef cv2AddChineseText(img, text, position, textColor(0, 255, 0), textSize20): 向图片中添加中文 # 判断输入的 img 是否为 OpenCV 格式的图片即 numpy.ndarray 类型if isinstance(img, np.ndarray):# 如果是 OpenCV 格式将其从 BGR 颜色空间转换为 RGB 颜色空间# 因为 PIL 库使用 RGB 颜色空间而 OpenCV 使用 BGR 颜色空间img Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))# 在 img 图片上创建一个绘图对象用于后续绘制文本draw ImageDraw.Draw(img)# 定义字体的格式使用 simsun.ttc 字体文件指定字体大小为 textSize# 并设置编码为 UTF - 8 以支持中文显示fontStyle ImageFont.truetype(simsun.ttc, textSize, encodingutf-8)# 在指定的 position 位置使用指定的 textColor 颜色和 fontStyle 字体绘制文本draw.text(position, text, textColor, fontfontStyle)# 将绘制好文本的 PIL 图片转换回 numpy.ndarray 类型并将颜色空间从 RGB 转换回 BGR# 以符合 OpenCV 的要求return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)def eye_aspect_ratio(eye):计算眼睛的纵横比Eye Aspect RatioEAR:param eye: 眼睛的特征点坐标数组:return: 眼睛的纵横比# 计算眼睛垂直方向上的距离A euclidean_distances(eye[1].reshape(1, 2), eye[5].reshape(1, 2))B euclidean_distances(eye[2].reshape(1, 2), eye[4].reshape(1, 2))# 计算眼睛水平方向上的距离C euclidean_distances(eye[0].reshape(1, 2), eye[3].reshape(1, 2))# 计算眼睛纵横比即垂直方向平均距离与水平距离的比值ear ((A B) / 2) / Creturn eardef drawEye(eye):在图像上绘制眼睛的轮廓:param eye: 眼睛的特征点坐标数组# 计算眼睛特征点的凸包eyeHull cv2.convexHull(eye)# 在图像 frame 上绘制眼睛的轮廓cv2.drawContours(frame, [eyeHull], -1, (0, 255, 0), 1)# 初始化计数器用于记录眼睛闭合的帧数
COUNTER 0
# 创建人脸检测器对象用于检测图像中的人脸
detector dlib.get_frontal_face_detector()
# 打开默认摄像头用于实时视频捕获
cap cv2.VideoCapture(0)
# 加载预训练的 68 点人脸特征预测模型
predictor dlib.shape_predictor(shape_predictor_68_face_landmarks.dat)while True:# 从摄像头读取一帧视频ret, frame cap.read()# 水平翻转视频帧使画面看起来更自然frame cv2.flip(frame, 1)# 如果读取失败跳出循环if ret is None:break# 检测视频帧中的人脸faces detector(frame, 0)for face in faces:# 预测人脸的 68 个特征点shape predictor(frame, face)# 将特征点转换为 numpy 数组shape np.array([[p.x, p.y] for p in shape.parts()])# 提取右眼的特征点rightEye shape[36:42]# 提取左眼的特征点leftEye shape[42:48]# 计算右眼的纵横比rightEAR eye_aspect_ratio(rightEye)# 计算左眼的纵横比leftEAR eye_aspect_ratio(leftEye)# 计算左右眼纵横比的平均值ear (leftEAR rightEAR) / 2# 如果眼睛纵横比小于 0.3认为眼睛处于闭合状态if ear 0.3:# 闭合帧数计数器加 1COUNTER 1# 如果闭合帧数超过 50 帧认为可能存在危险情况if COUNTER 50:# 在视频帧上添加中文提示信息frame cv2AddChineseText(frame, 危险, (250, 250))else:# 如果眼睛处于睁开状态将闭合帧数计数器重置为 0COUNTER 0# 绘制左眼的轮廓drawEye(leftEye)# 绘制右眼的轮廓drawEye(rightEye)# 格式化眼睛纵横比信息保留两位小数info EAR:{:.2f}.format(ear[0][0])# 在视频帧上添加眼睛纵横比信息frame cv2AddChineseText(frame, info, (0, 30))# 显示处理后的视频帧cv2.imshow(Frame, frame)# 等待用户按键等待时间为 1 毫秒key cv2.waitKey(1)# 如果用户按下 ESC 键ASCII 码为 27跳出循环if key 27:break# 释放摄像头资源
cap.release()
# 关闭所有 OpenCV 窗口
cv2.destroyAllWindows()