旋转面部检测

时间:2011-02-16 10:16:05

标签: opencv face-detection

是否有用于检测已在图像平面中旋转的面的库?或者是否有某种方法可以使用级联来进行直接面部检测并使用opencv来执行此操作?

8 个答案:

答案 0 :(得分:9)

这是我用Python cv2编写的一个简单的

这不是最有效的方法,它采用了etarion建议的天真方式,但它对于正常的头部倾斜效果相当好(它可以检测到-40到40度的任何头部倾斜,这大致相当于你能做到的倾斜你的头直立。

import cv2
from math import sin, cos, radians

camera =  cv2.VideoCapture(0)
face = cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml")

settings = {
    'scaleFactor': 1.3, 
    'minNeighbors': 3, 
    'minSize': (50, 50), 
    'flags': cv2.cv.CV_HAAR_FIND_BIGGEST_OBJECT|cv2.cv.CV_HAAR_DO_ROUGH_SEARCH
}

def rotate_image(image, angle):
    if angle == 0: return image
    height, width = image.shape[:2]
    rot_mat = cv2.getRotationMatrix2D((width/2, height/2), angle, 0.9)
    result = cv2.warpAffine(image, rot_mat, (width, height), flags=cv2.INTER_LINEAR)
    return result

def rotate_point(pos, img, angle):
    if angle == 0: return pos
    x = pos[0] - img.shape[1]*0.4
    y = pos[1] - img.shape[0]*0.4
    newx = x*cos(radians(angle)) + y*sin(radians(angle)) + img.shape[1]*0.4
    newy = -x*sin(radians(angle)) + y*cos(radians(angle)) + img.shape[0]*0.4
    return int(newx), int(newy), pos[2], pos[3]

while True:
    ret, img = camera.read()

    for angle in [0, -25, 25]:
        rimg = rotate_image(img, angle)
        detected = face.detectMultiScale(rimg, **settings)
        if len(detected):
            detected = [rotate_point(detected[-1], img, -angle)]
            break

    # Make a copy as we don't want to draw on the original image:
    for x, y, w, h in detected[-1:]:
        cv2.rectangle(img, (x, y), (x+w, y+h), (255,0,0), 2)

    cv2.imshow('facedetect', img)

    if cv2.waitKey(5) != -1:
        break

cv2.destroyWindow("facedetect")

答案 1 :(得分:3)

就个人而言,我不知道图书馆。但是,我可以说,使用眼睛检测Haar Cascade,并在眼睛之间画一条线。然后,您可以使用atan功能并找到旋转头部的角度。 (假设当头部未旋转时,人的双眼处于同一水平位置)

deg = atan( (leftEye.y - rightEye.y) / (leftEye.x - rightEye.x) )

获得此角度后,将图像旋转负deg度,您应该有一张可以使用Haar Cascades检测到的脸部。

答案 2 :(得分:2)

朴素的方式:

  • 生成角度列表(例如,以10度为单位从-170到180)
  • 对于列表中的每个角度n
    • n
    • 旋转图像
    • 在旋转图像上运行面部检测器
    • 计算原始图像中检测到的面部的位置(撤消旋转)
  • 对所有角度的连接结果执行非最大抑制(您可能会从相邻角度进行多次检测)

答案 3 :(得分:1)

基于颜色直方图的人脸检测方法与面部方向无关。

答案 4 :(得分:1)

我一直在处理非正面图像的面部检测问题。尝试使用多任务CNN。这是面部检测和对齐的最佳解决方案。它能够处理各种姿势,灯光,遮挡等问题。

该文件可在Link获得。该代码可在Link的GitHub上获得。我使用了python实现,结果非常出色。虽然如果图像有很多面孔,代码有点慢。

虽然如果你想坚持使用OpenCV,那么OpenCV就会增加一个新的人脸检测深度学习模型。结果不如多任务CNN好。在pyimagesearch Link

上实现了用于人脸检测的OpenCV深度学习模型

答案 5 :(得分:0)

你可以使用限制AAM,ASM方法的词袋/特征包方法。 但它们也可以给出非最优解,而不是全局最大值。

haar-like-features也只是一组功能,你可以使用旋转不变的功能,然后把它放在adaboost classifer中。

答案 6 :(得分:0)

mtcnn效果很好。看来只有当脸非常接近90度或180度时才有问题。因此,如果正常检测失败,则将图像旋转45度,然后重试。如果图像中有面部,则应该将其检测出来。

我很好奇,为什么当面部正好旋转90度或反转(旋转180度)时mtcnn失败

答案 7 :(得分:0)

此存储库可以将对象检测为旋转的边界框:https://github.com/NVIDIA/retinanet-examples

您可以通过将包含“人脸”类的图像随机旋转-30至30度,从“打开的图像”中创建数据集,然后训练该网络来检测这些人脸。