facedetect.py sample works
authorAlexander Mordvintsev <no@email>
Thu, 7 Jul 2011 22:33:36 +0000 (22:33 +0000)
committerAlexander Mordvintsev <no@email>
Thu, 7 Jul 2011 22:33:36 +0000 (22:33 +0000)
samples/python2/facedetect.py

index 29b7447..4eed36f 100644 (file)
@@ -1,22 +1,52 @@
 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