帮我写一个python活体检测代码
时间: 2023-08-20 07:11:31 浏览: 148
好的,以下是一个基于OpenCV和dlib库的Python活体检测代码示例:
```python
import cv2
import dlib
import numpy as np
# 加载dlib的人脸检测器和68个关键点检测器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
# 定义函数来计算欧氏距离
def euclidean_distance(a, b):
return np.sqrt(np.sum(np.square(a - b)))
# 定义函数来检测是否为活体
def is_real_face(img):
# 缩放图像以加快检测速度
img = cv2.resize(img, (0, 0), fx=0.5, fy=0.5)
# 将图像转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 使用dlib的人脸检测器检测人脸
faces = detector(gray, 1)
if len(faces) == 0:
return False
# 获取第一个人脸的68个关键点
landmarks = predictor(gray, faces[0])
# 将68个关键点转换为numpy数组
landmarks = np.array([[p.x, p.y] for p in landmarks.parts()])
# 计算左眼和右眼的中心点
left_eye_center = np.mean(landmarks[36:42], axis=0)
right_eye_center = np.mean(landmarks[42:48], axis=0)
# 计算左眼和右眼的直径
left_eye_diameter = euclidean_distance(landmarks[36], landmarks[39])
right_eye_diameter = euclidean_distance(landmarks[42], landmarks[45])
# 计算左眼和右眼的长宽比
left_eye_aspect_ratio = (euclidean_distance(landmarks[37], landmarks[41]) + euclidean_distance(landmarks[38], landmarks[40])) / (2 * left_eye_diameter)
right_eye_aspect_ratio = (euclidean_distance(landmarks[43], landmarks[47]) + euclidean_distance(landmarks[44], landmarks[46])) / (2 * right_eye_diameter)
# 计算左眼和右眼的灰度值差异
left_eye_gray = cv2.mean(gray[int(left_eye_center[1] - left_eye_diameter / 2): int(left_eye_center[1] + left_eye_diameter / 2), int(left_eye_center[0] - left_eye_diameter / 2): int(left_eye_center[0] + left_eye_diameter / 2)])[0]
right_eye_gray = cv2.mean(gray[int(right_eye_center[1] - right_eye_diameter / 2): int(right_eye_center[1] + right_eye_diameter / 2), int(right_eye_center[0] - right_eye_diameter / 2): int(right_eye_center[0] + right_eye_diameter / 2)])[0]
eye_gray_diff = abs(left_eye_gray - right_eye_gray)
# 如果左眼和右眼的长宽比不在范围内或灰度值差异太大,则判定为假脸
if left_eye_aspect_ratio < 0.2 or right_eye_aspect_ratio < 0.2 or left_eye_aspect_ratio > 0.35 or right_eye_aspect_ratio > 0.35 or eye_gray_diff > 15:
return False
else:
return True
# 打开摄像头
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
# 展示实时视频流
cv2.imshow("Live", frame)
# 检测是否为活体
if is_real_face(frame):
print("Real face")
else:
print("Fake face")
# 按下ESC键退出
key = cv2.waitKey(1)
if key == 27:
break
# 释放摄像头并关闭窗口
cap.release()
cv2.destroyAllWindows()
```
这个代码可以通过计算左眼和右眼的长宽比、灰度值差异来判断是否为活体。实际应用中,可能还需要加入其他的检测方式来提高准确率。