Files
MenuPython_QT/QT5_Project/KD_ZM_6/FaceDetection2.py

63 lines
2.3 KiB
Python

import sys
import cv2
import numpy as np
import mediapipe as mp
sys_path = sys.path[0].replace("\\", "/")
image = cv2.imread(sys_path + "/example.jpg")
# 初始化BlazeFace模型
mp_face_detection = mp.solutions.face_detection
face_detection = mp_face_detection.FaceDetection(min_detection_confidence=0.5, model_selection=2)
def process_face_detection(image : cv2.typing.MatLike, fps : int = 10) :
image_width = image.shape[1]
image_height = image.shape[0]
# 检测人脸
results = face_detection.process(image)
total_score = 0
if results.detections:
for face in results.detections:
relative_box = face.location_data.relative_bounding_box
# print(f'Detection score: {detection.score}')
# print(f'Box location: {relative_box}')
if face.score[0] < 0.55 :
continue
total_score += face.score[0]
# 在图片上绘制方框
xmin = relative_box.xmin
ymin = relative_box.ymin
ymax = relative_box.height + ymin
xmax = relative_box.width + xmin
# ymin, xmin, ymax, xmax = detection.location_data.relative_bounding_box
cv2.rectangle(image, (int(xmin * image_width), int(ymin * image_height)),
(int(xmax * image_width), int(ymax * image_height)), (0, 255, 0), 2)
key_points = np.array([(p.x, p.y) for p in face.location_data.relative_keypoints])
key_points_coords = np.multiply(key_points,[image_width,image_height]).astype(int)
for p in key_points_coords:
cv2.circle(image, p, 4, (255, 255, 255), 2)
cv2.circle(image, p, 2, (0, 0, 0), -1)
average_score = total_score / len(results.detections)
text = "fps : %d, score = %f"%(fps, average_score)
else :
text = "fps :%d"%(fps)
cv2.putText(image, text, org = (50, 50), fontFace = cv2.FONT_HERSHEY_SIMPLEX, fontScale = 1, color = (255, 255, 0), thickness = 1)
if __name__ == "__main__":
# 显示图片
image = cv2.imread(sys_path + "/example.jpg")
process_face_detection(image)
cv2.imshow("Face Detection", image)
cv2.waitKey(0)
cv2.destroyAllWindows()