Skip to content

Instantly share code, notes, and snippets.

@dannyarcher
Created December 28, 2011 10:18
Show Gist options
  • Save dannyarcher/1527458 to your computer and use it in GitHub Desktop.
Save dannyarcher/1527458 to your computer and use it in GitHub Desktop.
Python opencv face detection example
#!/usr/bin/env /usr/local/bin/python
import glob, os, sys, uuid
import cv
from Foundation import *
from objc import *
from AppKit import *
from PIL import *
class FaceDetect():
def __init__(self):
NSApplication.sharedApplication().activateIgnoringOtherApps_(True)
cv.NamedWindow ("FaceDetect", 1)
self.capture = cv.CaptureFromCAM( 0 )
self.writer = None
def detect(self):
faces = []
cv.CvtColor(self.frame, self.grayscale, cv.CV_RGB2GRAY)
#equalize histogram
cv.EqualizeHist(self.grayscale, self.grayscale)
# detect objects
for cascade in self.cascades:
faces.extend(
cv.HaarDetectObjects(
image=self.frame,
cascade=cascade,
storage=self.storage,
scale_factor=1.2,
min_neighbors=2,
flags=cv.CV_HAAR_DO_CANNY_PRUNING)
)
for (x,y,w,h),n in faces:
if n > 10:
cv.Circle(self.frame, (int(2*x+w)/2,int(2*y+h)/2), int(w+h+h*0.5)/4, (128, 255, 128))
cv.Rectangle(self.frame, (x,y), (x+w,y+h), 255)
def procKey(self, k):
if k == 0x1b: # ESC
print 'ESC pressed. Exiting ...'
sys.exit(1)
return False
elif k == ord('s'):
currentFrame = cv.GetCaptureProperty(self.capture, cv.CV_CAP_PROP_POS_MSEC )
cv.SetCaptureProperty(self.capture, cv.CV_CAP_PROP_POS_MSEC , abs(currentFrame+1000) )
elif k == ord('b'):
currentFrame = cv.GetCaptureProperty(self.capture, cv.CV_CAP_PROP_POS_MSEC )
cv.SetCaptureProperty(self.capture, cv.CV_CAP_PROP_POS_MSEC , abs(currentFrame-1000) )
elif k == ord('o'):
op = NSOpenPanel.openPanel()
op.runModalForTypes_(None)
if len(op.filenames()):
self.capture = cv.CreateFileCapture(op.filenames()[0])
self.writer = cv.CreateVideoWriter(
str(uuid.uuid1())+".avi",
cv.CV_FOURCC('D','I','V','X'),
cv.GetCaptureProperty(self.capture, cv.CV_CAP_PROP_FPS),
(int(cv.GetCaptureProperty(self.capture, cv.CV_CAP_PROP_FRAME_WIDTH)), int(cv.GetCaptureProperty(self.capture, cv.CV_CAP_PROP_FRAME_HEIGHT))),
True)
op.setReleasedWhenClosed_(True)
op.close()
elif k >= ord('0') and k <= ord('9'):
self.capture = cv.CaptureFromCAM( k-48 )
self.writer = None
def run(self):
# check if capture device is OK
if not self.capture:
print "Error opening capture device"
sys.exit(1)
if self.capture:
self.frame = cv.QueryFrame(self.capture)
if self.frame:
self.image_size = cv.GetSize(self.frame)
if self.writer:
cv.WriteFrame(self.writer, self.frame)
# create grayscale version
self.grayscale = cv.CreateImage(self.image_size, 8, 1)
# create storage
self.storage = cv.CreateMemStorage(1024)
self.cascades = []
self.cascades.append(cv.Load('haarcascade_frontalface_alt2.xml'))
while 1:
# do forever
if self.capture:
self.frame = cv.QueryFrame(self.capture)
if self.frame:
self.image_size = cv.GetSize(self.frame)
if self.image_size:
self.grayscale = cv.CreateImage(self.image_size, 8, 1)
if self.frame is None:
break
# face detection
self.detect()
if self.writer:
cv.WriteFrame(self.writer, self.frame)
# display webcam image
if self.frame:
cv.ShowImage('FaceDetect', self.frame)
# handle events
k = cv.WaitKey(10)
if self.procKey(k) == False:
break
if __name__ == "__main__":
print "Press ESC to exit ..."
face_detect = FaceDetect()
face_detect.run()

do this

easy_install pyobjc==2.2 brew install pil brew install opencv

then

python facedetect-example.py

have fun

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment