2011-02-16 21 views
22

¿Hay una biblioteca para detectar las caras que se han rotado en el plano de la imagen? ¿O hay alguna forma en la que podría usar una cascada para la detección de la cara vertical con opencv para hacerlo?detección de rostros girados

+0

¿Has probado la biblioteca EXIF ​​?. Estoy seguro de que será útil. –

Respuesta

2

manera Naive:

  • lista de ángulos Generar (por ejemplo, de -170 a 180 en 10 pasos grado)
  • Para cada ángulo n en la lista: Girar imagen
    • por n grados
    • Run face detector en la imagen girada
    • Calcula la posición de las caras detectadas en la imagen original (deshace la rotación)
  • Realizar la supresión máxima no en el resultado sumado de todos los ángulos (es probable que obtener múltiples detecciones desde ángulos vecinos)
+1

esto hace que la detección sea muy lenta y devuelve muchos más falsos positivos, pero es probablemente la única manera de hacer que la detección de Haar sea un tipo de rotación invariante ... – Ben

0

métodos para la detección de rostros basado en histograma de color es independiente de la orientación de la cara.

0

puede usar la bolsa de palabras/bolsa del método de funciones con los métodos AAM, ASM. pero también pueden dar una solución no óptima que no converge al máximo global.

también las características similares a haar son solo una colección de características y puede usar características invariantes de rotación y ponerlas luego en adaboost classifer.

6

Aquí es un simple que escribí con Python cv2

No es lo más eficiente, y se utiliza de la manera ingenua sugerido por etarion, pero funciona bastante bien para casi normal de la cabeza basculante (Se detecta nada de - 40 a 40 inclinación de la cabeza, que es más o menos todo lo que puede inclinar la cabeza mantenerse en posición vertical.

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

Personalmente, no sé de una biblioteca. Pero, lo que puedo decir es, utilizo un sistema de detección de ojos Haar Cascade, y traza una línea entre los ojos. Luego, puedes usar la función atan y encontrar el ángulo por el cual la cabeza está rota ed. (Suponiendo que la persona tiene los dos ojos en el mismo nivel horizontal cuando la cabeza no se gira)

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

Una vez que este punto de vista, rotar la imagen que tiene por negativos deg grados y usted debe tener una cara que puede ser detectado usando las Cascadas Haar.

Cuestiones relacionadas