python --face_recognition(人脸识别,检测,特征提取,绘制鼻子,眼睛,嘴巴,眉毛)/活体检测

dlib 安装方法 之前博文 https://blog.csdn.net/weixin_44634704/article/details/141332644

环境:

python==3.8
opencv-python==4.11.0.86
face_recognition==1.3.0
dlib==19.24.6

人脸检测

import cv2
import face_recognition# 读取人脸图片
img = cv2.imread(r"C:\Users\123\Desktop\1.jpg")
face_List = face_recognition.face_locations(img) # 检测人脸,返回人脸坐标信息
print(face_List)for x in face_List: # 画框cv2.rectangle(img, (x[3], x[0]), (x[1], x[2]), (0, 255, 0), 2)
cv2.imshow("a", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 输出: [(116, 306, 223, 199)]

在这里插入图片描述

人脸分割(切割)

import cv2
import face_recognition# 读取人脸图片
img = cv2.imread(r"C:\Users\123\Desktop\1.jpg")
face_List = face_recognition.face_locations(img) # 检测人脸,返回人脸坐标信息
print(face_List)for x in face_List: # 画框cv2.rectangle(img, (x[3], x[0]), (x[1], x[2]), (0, 255, 0), 2)qie_img = img[x[0]:x[2], x[3]:x[1]]cv2.imshow("a", qie_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

提取人脸特征向量

img = cv2.imread(r"C:\Users\123\Desktop\1.jpg")
# 提取人脸特征向量
face01 = face_recognition.face_encodings(img)[0]
print(face01)

人脸比对(欧式距离)

import cv2
import face_recognition
import numpy as np# 读取人脸图片
img = cv2.imread(r"C:\Users\123\Desktop\1.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # face_recognition库,处理是RGB格式, CV默认为BGR
# 提取人脸特征向量
face01 = face_recognition.face_encodings(img)[0]
# 读取人脸原图的图片
img2 = cv2.imread(r"C:\Users\123\Desktop\1.jpg")
face02 = face_recognition.face_encodings(img2)[0]
#
# 计算欧几里得距离
v = np.linalg.norm(face01 - face02)
if v < 0.8:print("是一个人")
else:print("不是一个人")

转为置信度

import cv2
import face_recognition
import numpy as npdef euclidean_distance_to_confidence(distance, max_distance):# 确保距离在合理范围内distance = min(distance, max_distance)# 计算置信度confidence = 1 - (distance / max_distance)return confidence# 读取人脸图片
img = cv2.imread(r"C:\Users\123\Desktop\1.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # face_recognition库,处理是RGB格式, CV默认为BGR
# 提取人脸特征向量
face01 = face_recognition.face_encodings(img)[0]
# 读取人脸原图的图片
img2 = cv2.imread(r"C:\Users\123\Desktop\1.jpg")
face02 = face_recognition.face_encodings(img2)[0]
#
# 计算欧几里得距离
v = np.linalg.norm(face01 - face02)
w = euclidean_distance_to_confidence(v, 1) # 置信度最大阈值为1
print(w) # 计算置信度,距离越小,置信度越高。

人脸比对(余弦)

import cv2
import face_recognition
import numpy as npdef cosine_similarity_to_confidence(similarity):# 将余弦相似度从 [-1, 1] 映射到 [0, 1]confidence = (similarity + 1) / 2return confidence# 读取人脸图片
img = cv2.imread(r"C:\Users\123\Desktop\1.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # face_recognition库,处理是RGB格式, CV默认为BGR
# 提取人脸特征向量
face01 = face_recognition.face_encodings(img)[0]
# 读取人脸原图的图片
img2 = cv2.imread(r"C:\Users\123\Desktop\1.jpg")
face02 = face_recognition.face_encodings(img2)[0]
#
dot_product = np.dot(face01, face02)
norm_face01 = np.linalg.norm(face01)
norm_face02 = np.linalg.norm(face02)
similarity = dot_product / (norm_face01 * norm_face02)
print("余弦相似度:", similarity)
confidence = cosine_similarity_to_confidence(similarity)
print("置信度:", confidence)

绘制眼睛,嘴巴,鼻子,轮廓线条

import cv2
import face_recognition
import numpy as np# 读取人脸图片
img = cv2.imread(r"C:\Users\123\Desktop\1.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # face_recognition库,处理是RGB格式, CV默认为BGR#img = face_recognition.load_image_file("face.jpg")
face_landmarks = face_recognition.face_landmarks(img)# 把特征点都画出来
for landmarks in face_landmarks:print(landmarks)# 画眼睛for eye in ('left_eye', 'right_eye'):pts = np.array(landmarks[eye], np.int32)cv2.polylines(img, (pts,), True, (0, 255, 0), 2)# 画嘴巴mouth_pts = np.array(landmarks['top_lip'], np.int32)cv2.polylines(img, (mouth_pts,), True, (0, 0, 255), 2)# 画鼻子nose_pts = np.array(landmarks['nose_bridge'], np.int32)cv2.polylines(img, (nose_pts,), True, (255, 0, 0), 2)# 绘制脸部轮廓chin_pts = np.array(landmarks['chin'], np.int32)cv2.polylines(img, [chin_pts], False, (255, 255, 0), 2)cv2.imwrite("landmarks.jpg", img[:, :, ::-1])

在这里插入图片描述

face_recognition 库检测出的人脸特征点中,默认是不包含耳朵特征点的。这是因为在很多常见的人脸识别应用场景里,耳朵的特征稳定性和独特性相对较弱,所以库没有专门对耳朵的特征点进行检测。
不过,要是你想要标记耳朵位置,可以考虑使用更高级的人脸关键点检测模型,像 dlib 库提供的 68 点或者 81 点人脸关键点检测器,其中 81 点模型包含了耳朵相关的关键点。

import cv2
import dlib
import numpy as np# 加载 dlib 的人脸检测器和 81 点关键点预测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_81_face_landmarks.dat")# 读取图片
image = cv2.imread(r"C:\Users\123\Desktop\1.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 检测人脸
faces = detector(gray)for face in faces:# 检测关键点landmarks = predictor(gray, face)# 绘制眼睛left_eye_points = [(landmarks.part(n).x, landmarks.part(n).y) for n in range(36, 42)]right_eye_points = [(landmarks.part(n).x, landmarks.part(n).y) for n in range(42, 48)]for eye_points in [left_eye_points, right_eye_points]:pts = np.array(eye_points, np.int32)cv2.polylines(image, [pts], True, (0, 255, 0), 2)# 绘制嘴巴mouth_points = [(landmarks.part(n).x, landmarks.part(n).y) for n in range(48, 60)]pts = np.array(mouth_points, np.int32)cv2.polylines(image, [pts], True, (0, 0, 255), 2)# 绘制鼻子nose_points = [(landmarks.part(n).x, landmarks.part(n).y) for n in range(27, 36)]pts = np.array(nose_points, np.int32)cv2.polylines(image, [pts], True, (255, 0, 0), 2)# 绘制脸部轮廓chin_points = [(landmarks.part(n).x, landmarks.part(n).y) for n in range(0, 17)]pts = np.array(chin_points, np.int32)cv2.polylines(image, [pts], False, (255, 255, 0), 2)# 绘制耳朵left_ear_points = [(landmarks.part(n).x, landmarks.part(n).y) for n in range(71, 75)]right_ear_points = [(landmarks.part(n).x, landmarks.part(n).y) for n in range(75, 79)]for ear_points in [left_ear_points, right_ear_points]:pts = np.array(ear_points, np.int32)cv2.polylines(image, [pts], False, (0, 255, 255), 2)# 保存图片
cv2.imwrite("landmarks.jpg", image)

实时取摄像头绘制

import numpy as np
import cv2
import face_recognition# 打开摄像头
video_capture = cv2.VideoCapture(0)while True:# 读取一帧视频ret, frame = video_capture.read()# 将图像从BGR颜色空间转换为RGB颜色空间,因为face_recognition库使用RGB格式rgb_frame = frame[:, :, ::-1]# 检测人脸特征点face_landmarks_list = face_recognition.face_landmarks(rgb_frame)# for face_landmarks in face_landmarks_list:#     # 打印所有特征点类型及其对应的关键点坐标#     for facial_feature in face_landmarks.keys():#         print(f"{facial_feature}: {face_landmarks[facial_feature]}")for face_landmarks in face_landmarks_list:# 绘制脸部轮廓chin_points = face_landmarks['chin']pts = [tuple(point) for point in chin_points]pts = np.array(pts, np.int32)cv2.polylines(frame, [pts], False, (255, 255, 0), 2)# 绘制眼睛for eye in ('left_eye', 'right_eye'):eye_points = face_landmarks[eye]pts = [tuple(point) for point in eye_points]pts = np.array(pts, np.int32)cv2.polylines(frame, [pts], True, (0, 255, 0), 2)# 绘制左右眉毛for eyebrow in ('left_eyebrow', 'right_eyebrow'):eyebrow_points = face_landmarks[eyebrow]eyebrow_pts = np.array(eyebrow_points, np.int32)cv2.polylines(frame, [eyebrow_pts], False, (255, 0, 255), 2)# 上嘴唇mouth_pts = np.array(face_landmarks['top_lip'], np.int32)cv2.polylines(frame, (mouth_pts,), True, (0, 0, 255), 2)# 下嘴唇bottom_lip_points = face_landmarks['bottom_lip']bottom_lip_pts = np.array(bottom_lip_points, np.int32)cv2.polylines(frame, [bottom_lip_pts], True, (0, 0, 255), 2)# 绘制鼻子代表鼻梁部分的关键点nose_bridge_points = face_landmarks['nose_bridge']pts = [tuple(point) for point in nose_bridge_points]pts = np.array(pts, np.int32)cv2.polylines(frame, [pts], True, (255, 0, 0), 2)# 绘制鼻尖nose_tip_points = face_landmarks['nose_tip']nose_tip_pts = np.array(nose_tip_points, np.int32)cv2.polylines(frame, [nose_tip_pts], True, (0, 255, 255), 2)# 显示结果图像cv2.imshow('Video', frame)# 按 'q' 键退出循环if cv2.waitKey(1) & 0xFF == ord('q'):break# 释放摄像头并关闭所有窗口
video_capture.release()
cv2.destroyAllWindows()

活体检测

import cv2
import face_recognition
import numpy as np# 计算眼睛的纵横比
def eye_aspect_ratio(eye):A = np.linalg.norm(np.array(eye[1]) - np.array(eye[5]))B = np.linalg.norm(np.array(eye[2]) - np.array(eye[4]))C = np.linalg.norm(np.array(eye[0]) - np.array(eye[3]))ear = (A + B) / (2.0 * C)return ear# 计算嘴巴的纵横比
def mouth_aspect_ratio(mouth):# 重新选择特征点top_mid = (np.array(mouth[2]) + np.array(mouth[3])) // 2bottom_mid = (np.array(mouth[10]) + np.array(mouth[11])) // 2left = np.array(mouth[0])right = np.array(mouth[6])A = np.linalg.norm(top_mid - bottom_mid)C = np.linalg.norm(left - right)mar = A / Creturn mar# 初始化变量
EYE_AR_THRESH = 0.2  # 眼睛纵横比阈值
EYE_AR_CONSEC_FRAMES = 3  # 连续闭眼帧数阈值
COUNTER_EYE = 0  # 连续闭眼帧数计数器
TOTAL_EYE = 0  # 眨眼次数计数器MOUTH_AR_CONSEC_FRAMES = 3  # 连续张嘴帧数阈值
COUNTER_MOUTH = 0  # 连续张嘴帧数计数器
TOTAL_MOUTH = 0  # 张嘴次数计数器PREVIOUS_LANDMARKS = None  # 上一帧的人脸特征点
HEAD_MOTION_THRESH = 10  # 头部运动阈值
HEAD_MOTION = False  # 头部是否移动标志# 动态阈值相关变量
INITIAL_FRAMES = 10  # 用于确定初始阈值的帧数
initial_mar_values = []
MOUTH_AR_THRESH = None# 打开摄像头
video_capture = cv2.VideoCapture(0)frame_count = 0
while True:# 读取一帧视频ret, frame = video_capture.read()# 将图像从 BGR 颜色空间转换为 RGB 颜色空间rgb_frame = frame[:, :, ::-1]# 检测人脸特征点face_landmarks_list = face_recognition.face_landmarks(rgb_frame)for face_landmarks in face_landmarks_list:# 提取左右眼睛的特征点left_eye = face_landmarks['left_eye']right_eye = face_landmarks['right_eye']# 计算左右眼睛的纵横比left_ear = eye_aspect_ratio(left_eye)right_ear = eye_aspect_ratio(right_eye)# 计算平均纵横比ear = (left_ear + right_ear) / 2.0# 检测眨眼if ear < EYE_AR_THRESH:COUNTER_EYE += 1else:if COUNTER_EYE >= EYE_AR_CONSEC_FRAMES:TOTAL_EYE += 1COUNTER_EYE = 0# 提取嘴巴的特征点mouth = face_landmarks['top_lip'] + face_landmarks['bottom_lip']# 计算嘴巴的纵横比mar = mouth_aspect_ratio(mouth)print(f"嘴巴纵横比: {mar}")  # 打印嘴巴纵横比,用于调试# 动态确定嘴巴纵横比阈值if frame_count < INITIAL_FRAMES:initial_mar_values.append(mar)if frame_count == INITIAL_FRAMES - 1:MOUTH_AR_THRESH = np.mean(initial_mar_values) * 1.2  # 阈值设为初始平均值的 1.2 倍else:# 检测张嘴if mar > MOUTH_AR_THRESH:COUNTER_MOUTH += 1else:if COUNTER_MOUTH >= MOUTH_AR_CONSEC_FRAMES:TOTAL_MOUTH += 1COUNTER_MOUTH = 0# 检测头部运动if PREVIOUS_LANDMARKS is not None:current_landmarks = []for feature in face_landmarks.values():current_landmarks.extend(feature)current_landmarks = np.array(current_landmarks)previous_landmarks = []for feature in PREVIOUS_LANDMARKS.values():previous_landmarks.extend(feature)previous_landmarks = np.array(previous_landmarks)displacement = np.linalg.norm(current_landmarks - previous_landmarks)if displacement > HEAD_MOTION_THRESH:HEAD_MOTION = Trueelse:HEAD_MOTION = FalsePREVIOUS_LANDMARKS = face_landmarks# 在图像上显示眨眼次数、张嘴次数和头部是否移动cv2.putText(frame, f"Blinks: {TOTAL_EYE}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)cv2.putText(frame, f"Opens: {TOTAL_MOUTH}", (10, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)cv2.putText(frame, f"Head Motion: {'Yes' if HEAD_MOTION else 'No'}", (10, 90), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)# 显示结果图像cv2.imshow('Video', frame)frame_count += 1# 按 'q' 键退出循环if cv2.waitKey(1) & 0xFF == ord('q'):break# 释放摄像头并关闭所有窗口
video_capture.release()
cv2.destroyAllWindows()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/73426.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【bug】[42000][1067] Invalid default value for ‘xxx_time‘

MySQL错误解决&#xff1a;Invalid default value for xxx_time’问题分析与修复方案 问题描述 在MySQL数据库操作中&#xff0c;当尝试创建或修改表结构时&#xff0c;可能会遇到以下错误信息&#xff1a; [bug] [42000][1067] Invalid default value for xxx_time这个错误…

Go环境相关理解

Linux上安装的环境变量 ## set go env export GOPATH$HOME/go_workspace export GOPATH/usr/local/go export PATH$PATH:$GOPATH/bin go.mod 和go.sum的理解 go.mod文件 ‌go.mod文件定义了模块的路径和依赖版本‌。它遵循 语义化版本2.0.0规范&#xff0c;记录了当前项目所依…

Next.js 深度解析:全栈React框架的架构哲学与实践精髓

Next.js 作为 React 生态中最流行的全栈框架&#xff0c;已经超越了简单的SSR工具&#xff0c;发展成为完整的Web开发解决方案。以下从八个维度进行深度剖析&#xff1a; 一、核心架构设计 双引擎驱动模型 页面路由系统&#xff1a;基于文件系统的约定式路由渲染引擎&#xff…

禾赛盈利了,但激光雷达没有胜利

还远没有到激光雷达党欢呼的时候。 3月&#xff0c;随着禾赛科技公布2024年报&#xff0c;全世界第一家也是唯一一家实现全年盈利的激光雷达上市公司诞生&#xff0c;为了这个盈利目标&#xff0c;禾赛科技奋斗了十年。 但极大的出货量和不高的盈利水平&#xff0c;让禾赛科技…

心房颤动新机制:ATM/p53通路早期抑制

急性心肌梗死&#xff08;AMI&#xff09;是心血管疾病中的“大魔头”&#xff0c;它悄无声息地侵蚀着心脏的肌肉&#xff0c;导致心脏功能受损&#xff0c;严重时甚至危及生命。而心房颤动&#xff08;AF&#xff09;&#xff0c;这一常见的心律失常&#xff0c;往往在AMI后悄…

Linux 安装 Redis

虚拟机安装 linux https://www.bilibili.com/video/BVldD42177qg?p16 1、安装 gcc,编译环境 yum y install gcc-g 2、将 redis-7.2.4.tar.gz放到 linux。如&#xff0c;放到 opt 里 3、进入/opt 目录下&#xff0c;解压 tar -zxvf redis-7.2.4.tar.gz 4、进入 redis-7.2.4.tar…

六级备考 词汇量积累(day11)

sculpture 雕像 allege 指责&#xff0c;声称 pledge 发誓 breach 违背&#xff0c;违反 defaulty 违约&#xff0c;违反 infringe 侵犯 infringing on small farmers interest blacmail 勒索 idle 无所事事的 deceive 欺骗 perceive 察觉 conceive 设想 conception 设想 verdi…

关于金碟K3,禁用和启用需要流程审批后执行

真是难受,是设计师蠢呢自己问题比较多呢,现在都还没有弄好 点击禁用和启用,通过流程来执行 到底是蠢呢还是设计问题,搞了半日没有效果,搞那么复杂! 而且有样板都没有草鞋成功 BOS设计,表单属性,操作列表: 1、启用禁用流程

导入 Excel 规则批量修改或删除 PDF 文档内容

需要对 PDF 文档内容进行修改的时候&#xff0c;通常我们会需要借助一些专业的工具来帮我们完成。那我们如果需要修改的 PDF 文档较多的时候&#xff0c;有什么方法可以帮我们实现批量操作呢&#xff1f;今天这篇文章就给大家介绍一下当我们需要批量修改多个 PDF 文档的时候&am…

msyql--基本操作之运维篇

检查 root 用户的权限 查看该用户针对这个数据库的权限 -- 如果在终端连接mysql时需要 mysql -u root -p -- 查看用户权限 SELECT user, host FROM mysql.user WHERE user root;可以看的出来root有他的访问权限&#xff0c;如过没有localhost或者% 说明没有访问权限 添加…

Vue 3使用 Socket

在 Vue 3 中使用 Socket&#xff08;如 WebSocket 或基于 WebSocket 的库比如 Socket.IO&#xff09;可以通过组合式 API&#xff08;Composition API&#xff09;来实现得更清晰、模块化。下面我给你展示一个完整的例子&#xff0c;包括使用原生 WebSocket 和使用 Socket.IO 的…

云计算:探索现代科技的未来之云

文章目录 云计算基本概念云计算是什么注意 云计算的价值云计算的部署模式云计算的服务模式主流的云计算技术AWS简介AWS建立了广阔的合作伙伴生态 VMware简介VMware服务介绍 华为云简介华为云Stack模式 云计算基本概念 云计算是什么 云计算是一种模型&#xff0c;它可以实现随时…

光学像差的类型与消除方法

### **光学像差的类型、理解与消除方法** 光学像差是指实际光学系统成像时&#xff0c;由于透镜或反射镜的非理想特性导致的光线偏离理想路径&#xff0c;从而影响成像质量的现象。像差可分为**单色像差**&#xff08;与波长无关&#xff09;和**色差**&#xff08;与波长相关…

什么是ecovadis验厂?ecovadis验厂的好处?ecovadis验厂的重要意义

1. 什么是EcoVadis验厂&#xff1f; EcoVadis验厂&#xff08;又称EcoVadis评估&#xff09;是国际权威的 企业社会责任&#xff08;CSR&#xff09;和可持续发展&#xff08;ESG&#xff09;在线评估&#xff0c;通过审核企业在 环境、劳工与人权、商业道德、可持续采购 四大…

STM32蜂鸣器播放音乐

STM32蜂鸣器播放音乐 STM32蜂鸣器播放音乐 Do, Re, Mi, Fa, 1. 功能概述 本系统基于STM32F7系列微控制器&#xff0c;实现了以下功能&#xff1a; 通过7个按键控制蜂鸣器发声&#xff0c;按键对应不同的音符。每个按键对应一个音符&#xff08;Do, Re, Mi, Fa, Sol, La, Si&a…

基于 OCO - 2 氧气 A 带辐射数据与地面台站气压观测数据构建近地面气压监测算法方案

基于 OCO - 2 氧气 A 带辐射数据与地面台站气压观测数据构建近地面气压监测算法方案 一、数据获取与准备 (一)OCO - 2 氧气 A 带辐射数据 数据下载:从 OCO - 2 官方数据发布平台(如 NASA 的相关数据存储库),按照研究所需的时间范围(例如,近 5 年的数据以获取足够的样本…

程序员英语口语练习笔记

我是一个程序员&#xff0c;专注于Java, Linux和k8s. I’m a programmer specializing in Java, Linux, and Kubernetes. 这个不是我的bug。 I don’t think this bug is caused by my work. 你能帮我看一下这个代码吗&#xff1f; Can you take a look at this code for me?…

网络地址转换技术(2)

NAT的配置方法&#xff1a; &#xff08;一&#xff09;静态NAT的配置方法 进入接口视图配置NAT转换规则 Nat static global 公网地址 inside 私网地址 内网终端PC2&#xff08;192.168.20.2/24&#xff09;与公网路由器AR1的G0/0/1&#xff08;11.22.33.1/24&#xff09;做…

从零开始理解基于深度学习的语义分割模型:RCA与RCM模块的实现

从零开始理解基于深度学习的语义分割模型:RCA与RCM模块的实现 随着深度学习技术的发展,图像分割任务取得了长足的进步。本文将从一个具体的PyTorch代码实例出发,带大家了解一种 novel 的语义分割网络架构——RCA(Rectangular Self-Calibration Attention)和 RCM(Rectang…

【Linux网络-多路转接select】

代码&#xff1a;https://gitee.com/nanyi-c/linux/tree/master/day50 一、I/O多路转接之select 1.初始select 系统提供select函数来实现多路复用输入/输出模型 select系统调用是用来让我们的程序监视多个文件描述符的状态变化的程序会停在select这里等待&#xff0c;直到被…