Подтвердить что ты не робот

Повернутое распознавание лица

Есть ли библиотека для обнаружения лиц, которые были повернуты в плоскости изображения? Или есть способ, которым я мог бы использовать каскад для обнаружения вертикального лица с помощью opencv, чтобы сделать это?

4b9b3361

Ответ 1

Вот простой, который я написал с 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")

Ответ 2

Наивный способ:

  • Создайте список углов (например, от -170 до 180 с шагом в 10 градусов)
  • Для каждого угла n в списке:
    • Повернуть изображение на n градусов
    • Запуск детектора лица на повернутом изображении
    • Вычислить положение обнаруженных лиц в исходном изображении (отменить вращение)
  • Выполните не максимальное подавление объединенного результата из всех углов (вы, вероятно, получите несколько обнаружений из соседних углов)

Ответ 3

Лично я не знаю о библиотеке. Но, что я могу сказать, используйте обнаружение глаз Haar Cascade и нарисуйте линию между глазами. Затем вы можете использовать функцию atan и найти угол поворота головы. (Предполагая, что у человека есть оба глаза на том же горизонтальном уровне, когда головка не вращается)

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

Как только вы получите этот угол, поверните изображение, имеющееся на отрицательные deg градусы, и вы должны иметь лицо, которое может быть обнаружено с помощью каскадов Хаар.

Ответ 4

Методы определения лица на основе цветовой гистограммы не зависят от ориентации лица.

Ответ 5

вы можете использовать пакет слов/мешок метода признаков со способами ограничения AAM, ASM. но они также могут дать не оптимальное решение сходится не к глобальному максимуму.

также haar-like-features - это всего лишь набор функций, и вы можете использовать функции инварианта вращения и поместить их затем в adaboost classifer.