黑人人脸检测

对着背影说爱祢 提交于 2019-12-24 18:01:26

黑人人脸检测

由于黑人肤色偏深,往往无法直接被检测到人脸,我将处理黑人人脸的问题转化为不均匀光照下人脸检测的问题,通过边缘增强和明暗均衡的两个滤波器实现黑人人脸检测

import cv2
import dlib
import numpy as np
from PIL import Image,ImageFilter

path = "C:/Users/gufei/Desktop/black/black1.jpg"
path = "black.png"

img = Image.open(path)
org= cv2.imread(path)

def face_enhance(img):
    enhance = img.filter(ImageFilter.EDGE_ENHANCE_MORE)#大阈值边缘增强
    result = cv2.cvtColor(np.asarray(enhance), cv2.COLOR_RGB2BGR)
    gamma=0.2
    scale = float(np.iinfo(result.dtype).max - np.iinfo(result.dtype).min)
    result = ((result.astype(np.float32) / scale) ** gamma) * scale#自适应gamma增强
    result = np.clip(result, 0, 255).astype(np.uint8)
    return result

def show_recognition(img,org):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 人脸检测画框
    detector = dlib.get_frontal_face_detector()
    # 获取人脸关键点检测器
    predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
    # 获取人脸框位置信息
    dets = detector(gray, 1)  # 1表示采样(upsample)次数  0识别的人脸少点,1识别的多点,2识别的更多,小脸也可以识别

    for i in range(len(dets)):
        shape = predictor(img, dets[i])  # 寻找人脸的68个标定点
        # 遍历所有点,打印出其坐标,并圈出来
        for pt in shape.parts():
            pt_pos = (pt.x, pt.y)
            cv2.circle(org, pt_pos, 2, (0, 0, 255), 1)  # img, center, radius, color, thickness

    for i, d in enumerate(dets):
        print("第", i + 1, "个人脸的矩形框坐标:",
              "left:", d.left(), "right:", d.right(), "top:", d.top(), "bottom:", d.bottom())
        cv2.rectangle(org, tuple([d.left(), d.top()]), tuple([d.right(), d.bottom()]), (0, 0, 255), 2)

img=face_enhance(img)
show_recognition(img,org)
cv2.imshow("image", org)
cv2.waitKey(0)#等待键盘输入
cv2.destroyAllWindows()

运行结果如下:运行结果

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!