import numpy as np\r
-import cv2\r
+import cv2, cv\r
from video import create_capture\r
\r
+help_message = '''\r
+USAGE: facedetect.py [--cascade <cascade_fn>] [--nested-cascade <cascade_fn>] [<video_source>]\r
+'''\r
+\r
+def detect(img, cascade):\r
+ rects = cascade.detectMultiScale(img, scaleFactor=1.3, minNeighbors=4, minSize=(30, 30))\r
+ if len(rects) == 0:\r
+ return []\r
+ rects[:,2:] += rects[:,:2]\r
+ return rects\r
+\r
+def draw_rects(img, rects, color):\r
+ for x1, y1, x2, y2 in rects:\r
+ cv2.rectangle(img, (x1, y1), (x2, y2), color)\r
+\r
if __name__ == '__main__':\r
import sys, getopt\r
+ print help_message\r
\r
args, video_src = getopt.getopt(sys.argv[1:], '', ['cascade=', 'nested-cascade='])\r
try: video_src = video_src[0]\r
- except: video_src = '0'\r
+ except: video_src = 'synth:bg=../cpp/lena.jpg:noise=0.05'\r
+ args = dict(args)\r
cascade_fn = args.get('--cascade', "../../data/haarcascades/haarcascade_frontalface_alt.xml")\r
- nested_fn = args.get('--nested-cascade', "../../data/haarcascades/haarcascade_eye.xml.xml")\r
+ nested_fn = args.get('--nested-cascade', "../../data/haarcascades/haarcascade_eye.xml")\r
\r
+ cascade = cv2.CascadeClassifier(cascade_fn)\r
+ nested = cv2.CascadeClassifier(nested_fn)\r
\r
cam = create_capture(video_src)\r
\r
while True:\r
ret, img = cam.read()\r
- cv2.imshow('facedetect', img)\r
+ gray = cv2.cvtColor(img, cv.CV_BGR2GRAY)\r
+ gray = cv2.equalizeHist(gray)\r
+ rects = detect(gray, cascade)\r
+ vis = cv2.cvtColor(gray, cv.CV_GRAY2BGR)\r
+ draw_rects(vis, rects, (0, 255, 0))\r
+ for x1, y1, x2, y2 in rects:\r
+ roi = gray[y1:y2, x1:x2]\r
+ vis_roi = vis[y1:y2, x1:x2]\r
+ subrects = detect(roi.copy(), nested)\r
+ draw_rects(vis_roi, subrects, (255, 0, 0))\r
+\r
+ cv2.imshow('facedetect', vis)\r
\r
if cv2.waitKey(5) == 27:\r
break\r