You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
XZNSH-Code-AI/opencv_face_dec/Positive_face_recognition.py

188 lines
6.1 KiB
Python

import cv2
import numpy as np
import os
def detect_frontal_face(img_path,save_path):
img = cv2.imread(img_path)
"""检测人脸并判断是否为正脸"""
# 灰度化图片
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 加载haarface级联分类器
face_cascade = cv2.CascadeClassifier(r'D:\anaconda3\envs\py38\Library\etc\haarcascades\haarcascade_frontalface_default.xml')
# 检测人脸
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
if len(faces)>=1:
# 在原图img上画矩形
for (x, y, w, h) in faces:
# 获取人脸矩形区域
face_img = img[y:y+h, x:x+w]
cv2.imshow('Face Detection', face_img)
cv2.waitKey(0)
# # 判断人脸矩形宽高比是否为正脸
if w / h < 1.2 and w / h > 0.8:
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
label = 'Frontal Face'
else:
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 2)
label = 'Not Frontal'
# 在图片上打标签
cv2.putText(img, label, (x, y - 5),cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 255), 2)
# 展示图片
# cv2.imshow('Face Detection', img)
# cv2.waitKey(0)
cv2.imwrite(save_path,img)
else:
# cv2.imwrite(save_path, img)
print("No facial information was detected")
dir_path = r'.\img'
save_path = r'.\img_result'
imgs = os.listdir(dir_path)
# print(imgs)
for img in imgs:
img_path = os.path.join(dir_path, img)
# 判断是否为图片文件
if img_path.endswith('.jpg') or img_path.endswith('.png'):
detect_frontal_face(img_path,os.path.join(save_path,"result_"+img))
# def is_frontal_face(face_path):
# flag = 0
# face_img = cv2.imread(face_path)
# # cv2.imshow('image',face_img)
# # cv2.waitKey(0)
# # cv2.destroyAllWindows()
# """判断是否是正脸"""
# # D:\anaconda3\envs\py38\Library\etc\haarcascades
# face_cascade = cv2.CascadeClassifier(r'D:\anaconda3\envs\py38\Library\etc\haarcascades\haarcascade_frontalface_default.xml')
# # face_cascade.load(r'D:\anaconda3\envs\py38\Library\etc\haarcascades\haarcascade_frontalface_default.xml')
# face_img_gray = cv2.cvtColor(face_img, cv2.COLOR_BGR2GRAY)
# faces = face_cascade.detectMultiScale(face_img_gray, 1.3, 5)
# if len(faces) != 1:
# return False
# face_x, face_y, face_w, face_h = faces[0]
# center_x = face_x + face_w/2
# center_y = face_y + face_h/2
# eye_cascade = cv2.CascadeClassifier(r'D:\anaconda3\envs\py38\Library\etc\haarcascades\haarcascade_eye.xml')
# eyes = eye_cascade.detectMultiScale(face_img_gray, 1.3, 5,
# minSize=(30, 30))
# if len(eyes) != 2:
# return False
# left_eye_x, left_eye_y, left_eye_w, left_eye_h = eyes[0]
# right_eye_x, right_eye_y, right_eye_w, right_eye_h = eyes[1]
# left_eye_center_x = left_eye_x + left_eye_w/2
# left_eye_center_y = left_eye_y + left_eye_h/2
# right_eye_center_x = right_eye_x + right_eye_w/2
# right_eye_center_y = right_eye_y + right_eye_h/2
# x_diff = abs(left_eye_center_x - right_eye_center_x)
# y_diff = abs(left_eye_center_y - right_eye_center_y)
# # 两眼距离小于面部宽度的60%视为正脸
# if x_diff <= 0.6 * face_w and y_diff <= 0.6 * face_h:
# flag = 1
# return True
# return False
# print(is_frontal_face(img_paht))
# opencv_detect_frontal_faces(img_paht)
# def opencv_detect_frontal_faces(face_path):
# img = cv2.imread(face_path)
# # cv2.imshow('image',face_img)
# # cv2.waitKey(0)
# # cv2.destroyAllWindows()
# """判断是否是正脸"""
# # D:\anaconda3\envs\py38\Library\etc\haarcascades
# face_cascade = cv2.CascadeClassifier(r'D:\anaconda3\envs\py38\Library\etc\haarcascades\haarcascade_frontalface_default.xml')
# # face_cascade.load(r'D:\anaconda3\envs\py38\Library\etc\haarcascades\haarcascade_frontalface_default.xml')
# img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# faces = face_cascade.detectMultiScale(img_gray, 1.3, 5)
# if len(faces) >= 1:
# face_x, face_y, face_w, face_h = faces[0]
# center_x = face_x + face_w/2
# center_y = face_y + face_h/2
# eye_cascade = cv2.CascadeClassifier(r'D:\anaconda3\envs\py38\Library\etc\haarcascades\haarcascade_eye.xml')
# eyes = eye_cascade.detectMultiScale(img_gray, 1.3, 5,
# minSize=(30, 30))
# print(eyes)
# left_eye_x, left_eye_y, left_eye_w, left_eye_h = eyes[0]
# right_eye_x, right_eye_y, right_eye_w, right_eye_h = eyes[1]
# left_eye_center_x = left_eye_x + left_eye_w/2
# left_eye_center_y = left_eye_y + left_eye_h/2
# right_eye_center_x = right_eye_x + right_eye_w/2
# right_eye_center_y = right_eye_y + right_eye_h/2
# x_diff = abs(left_eye_center_x - right_eye_center_x)
# y_diff = abs(left_eye_center_y - right_eye_center_y)
# for (x, y, w, h) in faces:
# # 获取人脸矩形区域
# face_img = img[y:y+h, x:x+w]
# if len(eyes) ==2:
# # 两眼距离小于面部宽度的60%视为正脸
# if x_diff <= 0.6 * face_w and y_diff <= 0.6 * face_h:
# cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
# label = 'Frontal Face'
# else:
# cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 2)
# label = 'Not Frontal'
# else:
# cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 2)
# label = 'Not Frontal'
# # 在图片上打标签
# cv2.putText(img, label, (x, y - 5),cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 255), 2)
# cv2.imshow('Face Detection', img)
# cv2.waitKey(0)
# else:
# print("No facial information was detected")