para - reconocimiento facial opencv android
detección de rostros girados (6)
¿Hay una biblioteca para detectar las caras que se han girado 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?
Aquí hay uno simple que escribí con Python cv2
No es la cosa más eficiente, y usa la manera ingenua sugerida por etarion, pero funciona bastante bien para la inclinación normal de la cabeza (detecta cualquier inclinación de la cabeza de -40 a 40, que es más o menos tanto como se puede inclinar la cabeza mantenerse en pie
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")
He estado lidiando con el mismo problema de detección de rostros para imágenes no frontales. Intente usar Multi Task CNN. Es la mejor solución para la detección y alineación de rostros. Puede tratar problemas como varias poses, iluminación, oclusión.
El documento está disponible en Link . El código está disponible en GitHub at Link . Usé la implementación de Python y los resultados son sobresalientes. Aunque el código es un poco lento si la imagen tiene muchas caras.
Aunque si desea adherirse a OpenCV, entonces se ha agregado un nuevo modelo de aprendizaje profundo para detección de rostros a OpenCV. Los resultados no son tan buenos como Multi Task CNN. Hay una implementación de OpenCV Deep Learning Model para detección de rostros en pyimagesearch Link
Los métodos para la detección de rostros basados en el histograma de colores son independientes de la orientación de la cara.
Manera ingenua:
- Generar una lista de ángulos (por ejemplo, de -170 a 180 en pasos de 10 grados)
- Para cada ángulo
n
en la lista:- Girar la imagen en
n
grados - Ejecutar el detector de rostros en la imagen girada
- Calcule la posición de las caras detectadas en la imagen original (deshaga la rotación)
- Girar la imagen en
- Realice una supresión no máxima en el resultado unido desde todos los ángulos (es probable que obtenga múltiples detecciones desde ángulos vecinos)
Personalmente, no sé de una biblioteca. Pero, lo que puedo decir es, usa una Haar Cascade de detección de ojos y traza una línea entre los ojos. Luego, puede usar la función atan
y encontrar el ángulo por el que gira la cabeza. (Suponiendo que la persona tiene ambos ojos en el mismo nivel horizontal cuando la cabeza no está girada)
deg = atan( (leftEye.y - rightEye.y) / (leftEye.x - rightEye.x) )
Una vez que obtienes este ángulo, gira la imagen que tienes en deg
negativos y deberías tener una cara que se puede detectar usando las cascadas Haar.
puede usar el método bolsa de palabras / bolsa de características con métodos AAM, ASM restrictivos. pero también pueden dar una solución no óptima, no converge al máximo global.
también las características tipo haar son solo una colección de características y puede usar características invariantes de rotación y ponerlas en adaboost classifer.