XD blog

blog page

face recognition


2014-02-02 Détecter des visages avec opencv

Après avoir lu un blog sur la détection de visages, je me suis dit que c'est facile d'écrire un petit programme pour vérifier que cela marche. Et c'est vrai ou pas si loin. Voici la recette sur Windows.

Tout d'abord, il faut installer si vous ne l'avez jamais fait et en faisant bien attention aux numéros de version. J'ai testé les versions x86 (= win32).

Ensuite, il faut récupérer les modèles de détection de visages sur github et les place dans un répertoire de votre choix. On récupère une image comme la suivante qui est utilisée dans tous les exemples de programmes de traitement d'images :

Lenna.png

Finalement, il suffit d'exécuter ce programme python qu'on sauvegarde dans le répertoire où se trouve déjà l'image et le fichier haarcascade_frontalface_alt2.xml.

# coding:latin-1
import sys, os
import cv2
 
def detecte_visages(image, image_out, show = False):
    # on charge l'image en mémoire
    img = cv2.imread(image)
    # on charge le modèle de détection des visages
    face_model = cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml")
    
    
    # détection du ou des visages
    faces = face_model.detectMultiScale(img)
    
    # on place un cadre autour des visages
    print ("nombre de visages", len(faces), "dimension de l'image", img.shape, "image", image)
    for face in faces:
        cv2.rectangle(img, (face[0], face[1]), (face[0] + face[2], face[0] + face[3]), (255, 0, 0), 3)
        
    # on sauvegarde le résultat final
    cv2.imwrite(image_out, img)
    
    # pour voir l'image, presser ESC pour sortir
    if show :
        cv2.imshow("visage",img)
        if cv2.waitKey(5000) == 27: cv2.destroyWindow("visage")
  
if __name__ == "__main__":
    # applique 
    for file in os.listdir(".") :
        if file.startswith("visage") : continue # déjà traité
        if os.path.splitext(file)[-1].lower() in [".jpg", ".jpeg", ".png" ] :
            detecte_visages (file, "visage_" + file)

Et on obtient :

visage de Lenna

Quelques essais plus loin, on s'aperçoit que le modèle n'aime pas trop les profils. Une fois qu'on a extrait le visage, on peut essayer de le reconnaître. Mais ce sera pour une autre fois.


Xavier Dupré