Facesample.py

From IPRE Wiki
Jump to: navigation, search
  1. !/usr/bin/python

""" This program is demonstration for face and object detection using haar-like features. The program finds faces in a camera image or video stream and displays a red box around them.

Original C implementation by:  ? Python implementation by: Roman Stanchak Modified by Keith O'Hara to use Fluke's camera Modified by Alexandra Funk and Doug Blank to work without myro """ import sys import opencv from opencv.cv import * from opencv.highgui import *

  1. from myro import *

import PIL

  1. Global Variables

cascade = None storage = cvCreateMemStorage(0) cascade_name = "/usr/share/opencv/haarcascades/haarcascade_frontalface_alt.xml"

  1. Parameters for haar detection
  2. From the API:
  3. The default parameters (scale_factor=1.1, min_neighbors=3, flags=0) are tuned
  4. for accurate yet slow object detection. For a faster operation on real video
  5. images the settings are:
  6. scale_factor=1.2, min_neighbors=2, flags=CV_HAAR_DO_CANNY_PRUNING,
  7. min_size=<minimum possible face size

min_size = cvSize(20,20) image_scale = 1.3 haar_scale = 1.2 min_neighbors = 2 haar_flags = 0


def detect_and_draw( img ):

   # allocate temporary images
   gray = cvCreateImage( cvSize(img.width,img.height), 8, 1 );
   small_img = cvCreateImage( cvSize( cvRound (img.width/image_scale),

cvRound (img.height/image_scale)), 8, 1 );

   # convert color input image to grayscale
   cvCvtColor( img, gray, CV_BGR2GRAY );
   # scale input image for faster processing
   cvResize( gray, small_img, CV_INTER_LINEAR );
   cvEqualizeHist( small_img, small_img );
   
   cvClearMemStorage( storage );
   if( cascade ):
       t = cvGetTickCount();
       faces = cvHaarDetectObjects( small_img, cascade, storage,
                                    haar_scale, min_neighbors, haar_flags, min_size );
       t = cvGetTickCount() - t;
       print "detection time = %gms" % (t/(cvGetTickFrequency()*1000.));
       if faces:
           for face_rect in faces:
               print "Hello human"
               
               # the input to cvHaarDetectObjects was resized, so scale the 
               # bounding box of each face and convert it to two CvPoints
               pt1 = cvPoint( int(face_rect.x*image_scale), int(face_rect.y*image_scale))
               pt2 = cvPoint( int((face_rect.x+face_rect.width)*image_scale),
                              int((face_rect.y+face_rect.height)*image_scale) )
               cvRectangle( img, pt1, pt2, CV_RGB(255,0,0), 3, 8, 0 );
   cvShowImage( "result", img );


if __name__ == '__main__':

   if len(sys.argv) > 1:
       if sys.argv[1].startswith("--cascade="):
           cascade_name = sys.argv[1][ len("--cascade="): ]
           if len(sys.argv) > 2:
               input_name = sys.argv[2]
       elif sys.argv[1] == "--help" or sys.argv[1] == "-h":
           print "Usage: facedetect --cascade=\"<cascade_path>\" [filename|camera_index]\n" ;
           sys.exit(-1)


   # the OpenCV API says this function is obsolete, but we can't
   # cast the output of cvLoad to a HaarClassifierCascade, so use this anyways
   # the size parameter is ignored
   cascade = cvLoadHaarClassifierCascade( cascade_name, cvSize(1,1) );
   
   if not cascade:
       print "ERROR: Could not load classifier cascade"
       sys.exit(-1)
   
   cvNamedWindow( "result", 1 );
   #init()
   
   frame_copy = None
   capture = cvCreateCameraCapture(0)
   while True: 
       #p = takePicture()
       #frame = opencv.PIL2Ipl(p.image.convert("RGB"))
       frame = opencv.highgui.cvQueryFrame(capture)
       if( not frame ):
           break;
       if( not frame_copy ):
           frame_copy = cvCreateImage( cvSize(frame.width,frame.height),
                                       IPL_DEPTH_8U, frame.nChannels );
       if( frame.origin == IPL_ORIGIN_TL ):
           cvCopy( frame, frame_copy );
       else:
           cvFlip( frame, frame_copy, 0 );
           
       detect_and_draw( frame_copy );
       
       if( cvWaitKey( 10 ) >= 0 ):
           break;