mirror of https://github.com/opencv/opencv.git
Open Source Computer Vision Library
https://opencv.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
4.1 KiB
128 lines
4.1 KiB
#!/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 |
|
""" |
|
import sys |
|
from opencv.cv import * |
|
from opencv.highgui import * |
|
|
|
|
|
# Global Variables |
|
cascade = None |
|
storage = cvCreateMemStorage(0) |
|
cascade_name = "../../data/haarcascades/haarcascade_frontalface_alt.xml" |
|
input_name = "../c/lena.jpg" |
|
|
|
# Parameters for haar detection |
|
# From the API: |
|
# The default parameters (scale_factor=1.1, min_neighbors=3, flags=0) are tuned |
|
# for accurate yet slow object detection. For a faster operation on real video |
|
# images the settings are: |
|
# scale_factor=1.2, min_neighbors=2, flags=CV_HAAR_DO_CANNY_PRUNING, |
|
# 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((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: |
|
# 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) |
|
|
|
else: |
|
input_name = sys.argv[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) |
|
|
|
|
|
if input_name.isdigit(): |
|
capture = cvCreateCameraCapture( int(input_name) ) |
|
else: |
|
capture = cvCreateFileCapture( input_name ) |
|
|
|
cvNamedWindow( "result", 1 ) |
|
|
|
if capture: |
|
frame_copy = None |
|
while True: |
|
frame = cvQueryFrame( capture ) |
|
if not frame: |
|
cvWaitKey(0) |
|
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 |
|
|
|
else: |
|
image = cvLoadImage( input_name, 1 ) |
|
|
|
if image: |
|
detect_and_draw( image ) |
|
cvWaitKey(0) |
|
|
|
cvDestroyWindow("result")
|
|
|