Source code for cannycam.haarcam
#!/usr/bin/env python2.7
import cv2
from basecam import BaseCam
from util import apply_doc, get_cascade_file_path, is_escape, wait_frames
[docs]class HaarCam(BaseCam):
"""
Webcam that performs Haar Cascade object detection on the video stream.
"""
@apply_doc(BaseCam.__init__)
def __init__(self, window):
super(HaarCam, self).__init__(window)
self._face_classifier = self._init_classifier("haarcascade_frontalface_default.xml")
self._fullbody_classifier = self._init_classifier("haarcascade_fullbody.xml")
self._lowerbody_classifier = self._init_classifier("haarcascade_lowerbody.xml")
self._upperbody_classifier = self._init_classifier("haarcascade_upperbody.xml")
[docs] def detect_parts(self, img, classifier):
"""
Detect anatomical parts in ``img`` with Haar Cascade object detection.
:param img: Image read from webcam.
:param classifier: Classifier to detect anatomical parts.
"""
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
parts = classifier.detectMultiScale(gray, 1.3, 5)
for x, y, w, h in parts:
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), thickness=2)
return img
[docs] @apply_doc(BaseCam.run)
def run(self, frame_throttle, classifier=None):
"""
:param classifier: Classifier to detect anatomical parts. Defaults \
to a face classifier if ``None``.
"""
if classifier is None:
classifier = self.face_classifier
try:
for _ in wait_frames(throttle=frame_throttle):
ret_val, img = self.cam.read()
detected = self.detect_parts(img, classifier)
cv2.imshow(self.window, detected)
# esc to quit
if is_escape(cv2.waitKey(1)):
break
finally:
cv2.destroyWindow(self.window)
@property
def face_classifier(self):
"""
Get a face classifier.
"""
return self._face_classifier
@property
def fullbody_classifier(self):
"""
Get a full body classifier.
"""
return self._fullbody_classifier
@property
def lowerbody_classifier(self):
"""
Get a lower body classifier.
"""
return self._lowerbody_classifier
@property
def upperbody_classifier(self):
"""
Get an upper body classifier.
"""
return self._upperbody_classifier
def _init_classifier(self, cascade_file):
"""
Initialize a Haar Cascade Classifier.
:param cascade_file: Name of cascade file in the ``xmls`` directory.
"""
return cv2.CascadeClassifier(get_cascade_file_path(cascade_file))
def main():
h = HaarCam("haarcam")
h.run(frame_throttle=10)
if __name__ == "__main__":
main()