File size: 1,379 Bytes
ca46a75
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/usr/bin/env python
# -*- coding: utf-8 -*-
r"""
@DATE: 2024/9/5 19:32
@File: face_detector.py
@IDE: pycharm
@Description:
    人脸检测器
"""
from mtcnnruntime import MTCNN
from .context import Context
from hivision.error import FaceError
import cv2

mtcnn = None


def detect_face(ctx: Context, scale: int = 2):
    """
    人脸检测处理者,只进行人脸数量的检测
    :param ctx: 上下文,此时已获取到原始图和抠图结果,但是我们只需要原始图
    :param scale: 最大边长缩放比例,原图:缩放图 = 1:scale
    :raise FaceError: 人脸检测错误,多个人脸或者没有人脸
    """
    global mtcnn
    if mtcnn is None:
        mtcnn = MTCNN()
    image = cv2.resize(
        ctx.origin_image,
        (ctx.origin_image.shape[1] // scale, ctx.origin_image.shape[0] // scale),
        interpolation=cv2.INTER_AREA,
    )
    faces, _ = mtcnn.detect(image)
    if len(faces) != 1:
        # 保险措施,如果检测到多个人脸或者没有人脸,用原图再检测一次
        faces, _ = mtcnn.detect(ctx.origin_image)
    else:
        for item, param in enumerate(faces[0]):
            faces[0][item] = param * 2
    if len(faces) != 1:
        raise FaceError("Expected 1 face, but got {}".format(len(faces)), len(faces))
    ctx.face = (faces[0][0], faces[0][1], faces[0][2], faces[0][3], faces[0][4])