Détection des visages avec OpenCV et Python

Salut à tous,

Après quelques semaine d’absence… J’ai décidé de vous écrire un petit article afin de vous partager: un scripte python qui permet de détecter un visage sur une photo.

Les quelques ligne de code, serve à détecter les visages dans les images en utilisant OpenCV,
Python, Web.py et ImageMagick.

  1. import web, sys, os, subprocess, uuid
  2. from opencv.cv import *
  3. from opencv.highgui import *
  4. from shutil import copy
  5.  
  6. def detectObjects(image, imagefile):
  7.   """Converts an image to grayscale and prints the locations of any
  8.     faces found"""
  9.   grayscale = cvCreateImage(cvSize(image.width, image.height), 8, 1)
  10.   cvCvtColor(image, grayscale, CV_BGR2GRAY)
  11.  
  12.   storage = cvCreateMemStorage(0)
  13.   cvClearMemStorage(storage)
  14.   cvEqualizeHist(grayscale, grayscale)
  15.   cascade = cvLoadHaarClassifierCascade(
  16.     ‘/usr/share/doc/opencv-doc/examples/haarcascades/haarcascades/haarcascade_frontalface_default.xml.gz’,
  17.     cvSize(1,1))
  18.   faces = cvHaarDetectObjects(grayscale, cascade, storage, 1.2, 2,
  19.                              CV_HAAR_DO_CANNY_PRUNING, cvSize(50,50))
  20.  
  21.   if faces.total > 0:
  22.     for f in faces:
  23.         print("found a face: [(%d,%d) -> (%d,%d)]" % (f.x, f.y, f.x+f.width, f.y+f.height))
  24.         foundFace(imagefile, f)
  25.   return faces.total
  26.  
  27. def foundFace(imagefile, f):
  28.     #os.system("convert {image} -stroke red -fill red -draw \"rectangle {a},{b} {c},{d}\" {output}".format(
  29.     os.system("convert {image} -draw \"image SrcOver {a},{b} {c},{d} biglazer.png\" {output}".format(
  30.                     image=imagefile,
  31.                     a=f.x+6,
  32.                     b=f.y,
  33.                     c=f.width,
  34.                     d=f.height,
  35.                     output=imagefile));
  36.  
  37. urls = (
  38.     ‘/upload’, ‘Upload’,
  39. )
  40.  
  41. class Upload:
  42.     def GET(self):
  43.         web.header("Content-Type","text/html; charset=utf-8")
  44.         return """<html><head><link rel="shortcut icon" href="/static/favicon.ico"
  45. type="image/x-icon"></head><body>
  46. <form method="POST" enctype="multipart/form-data" action="">
  47. <input type="file" name="myfile" />
  48. <br/>
  49. <input type="submit" />
  50. </form>
  51. </body></html>"""
  52.     def POST(self):
  53.         x = web.input(myfile={})
  54.         filedir = ‘/home/mike/python/uploads’ # change this to the directory you want to store the file in.
  55.         if ‘myfile’ in x: # to check if the file-object is created
  56.             filepath=x.myfile.filename.replace(\\,‘/’) # replaces the windows-style slashes with linux ones.
  57.             #filename=filepath.split(‘/’)[-1] # splits the and chooses the last part (the filename with extension)
  58.             filename = str(uuid.uuid4())
  59.             fout = open(filedir +‘/’+ filename,‘w’) # creates the file where the uploaded file should be stored
  60.             fout.write(x.myfile.file.read()) # writes the uploaded file to the newly created file.
  61.             fout.close() # closes the file, upload complete.
  62.             # detect face
  63.             imagefile = filedir +‘/’+ filename;
  64.             image = cvLoadImage(imagefile);
  65.             unique_name = str(uuid.uuid4())
  66.             output_path = ‘/home/mike/python/static/%s.png’ % unique_name
  67.             if (detectObjects(image, imagefile) > 0):
  68.                 copy(imagefile, output_path)
  69.                 web.redirect("static/%s.png" % unique_name)
  70.             else:
  71.                 return """No face found."""
  72.         raise web.seeother(‘/upload’)
  73.  
  74. if __name__ == "__main__":
  75.    app = web.application(urls, globals(), True)
  76.    app.run()

Il ya quelques problèmes – il n’aime pas Bitmap (*. bmp), ni les images de type dessin animé. Voici quelques exemples d’images qui a travaillé:

Pour finir en beauté cette article j’annonce que d’ici la fin de la semaine un cadeau sera à gagner sur QuentinZone :) .

Recherches qui ont permis de trouver cet article:

Laisser un commentaire


Blogroll