обнаружение повернутого лица - PullRequest
26 голосов
/ 16 февраля 2011

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

Ответы [ 6 ]

9 голосов
/ 14 апреля 2013

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

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

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

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

2 голосов
/ 16 февраля 2011

Наивный путь:

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

Я имел дело с той же проблемой распознавания лиц для нефронтальных изображений.Попробуйте использовать Multi Task CNN.Это лучшее решение для обнаружения и выравнивания лица.Он способен справляться с такими проблемами, как различные позы, освещение, окклюзия.

Бумага доступна по адресу Ссылка .Код доступен на GitHub на Ссылка .Я использовал реализацию Python и результаты выдающиеся.Хотя код немного медленный, если на изображении много лиц.

Хотя, если вы хотите придерживаться OpenCV, в OpenCV была добавлена ​​новая модель глубокого обучения для обнаружения лиц.Результаты не так хороши, как Multi Task CNN.В pyimagesearch Link

есть реализация модели глубокого обучения OpenCV для распознавания лиц.
1 голос
/ 25 февраля 2011

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

0 голосов
/ 10 августа 2012

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

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

...