def _detect_faces(self, img): """Detects faces on the image. Args: img -- image Returns: faces -- LIST of np.array([x,y,w,h]) face coordinates """ if not self._face_cascade.empty(): gray = img_to_gray(img) faces = self._face_cascade.detectMultiScale(gray, \ scaleFactor=1.3, \ minNeighbors=4, \ minSize=(30, 30), \ flags=cv2.CASCADE_SCALE_IMAGE) if len(faces) == 0: return [] return faces
def substract_bg(self, frame): """Apply Background Substraction from frame. Args: frame -- current frame Returns: fgmask -- foreground mask """ # Get FGMASK with MOG2 gray = img_to_gray(frame) fgmask = self._bs_mog2.apply(gray, learningRate=self.learningRate) # Elliptical Kernel for morphology func kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,( \ self.kernel_size, self.kernel_size)) # Open (remove white points from the background) fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel) # Close (remove black points from the object) fgmask = cv2.morphologyEx(fgmask, cv2.MORPH_CLOSE, kernel) # Dilation alg (increases white regions size) fgmask = cv2.dilate(fgmask, kernel, iterations=self.iters) return fgmask
def track_faces(self, img): """Apply oval mask over faces detected in the image. Args: img -- image Updates: self.faces -- list of faces detected self.gc_rect -- coords. tuple for GrabCut algorithm (x, y, w, h) Returns: fgmask -- binary mask with faces highlighted with oval """ faces = self._detect_faces(img) if faces != []: # Face coords detected self.faces = faces self.gc_rect = self._faces_to_gc_rect(faces) else: # Default values self.faces = self.def_face self.gc_rect = self._faces_to_gc_rect(self.faces, 1) fgmask = np.zeros((self.height, self.width, 3), np.uint8) fgmask = draw_ellipse(fgmask, self.faces) fgmask = img_to_gray(fgmask) return fgmask