def evaluate(self,frame): if self.processor.enough_samples: normalized_amplitude = self.processor.normalized_amplitude bpm_id = np.argmax(normalized_amplitude) self.bpm.append(self.f[bpm_id]) if len(self.bpm) > 300: del self.bpm[0] self.snr.append(calculateSNR(normalized_amplitude,bpm_id)) write_text(frame,"BPM : " + str(self.bpm[-1])) write_text(frame,"SNR : " + str(self.snr[-1]))
def get_frame(self): self.frame += 1 curpath = self.next_path self.next_path = self.video_folder + str(self.frame) + ".bmp" exists = os.path.isfile(self.next_path) if exists: frame = cv2.imread(curpath) write_text(frame, "Frame : " + str(self.frame)) return frame, False else: frame = cv2.imread(curpath) write_text(frame, "Frame : " + str(self.frame)) return frame, True
def display_marks(self, frame): if not len(self.points) == 0: write_text(frame, "Left Eye trackers : " + str(len(self.eyel))) write_text(frame, "Right Eye trackers : " + str(len(self.eyer))) write_text(frame, "Mouth trackers : " + str(len(self.mouth))) eyel = self.points[:5] eyer = self.points[6:11] mouth = self.points[11:] ## Second error check for i in range(eyel.shape[0]): col = (255, 255, 0) if i in self.blacklist: col = (0, 0, 255) cv2.circle(frame, (eyel[i, 0, 0], eyel[i, 0, 1]), 1, col, -1) for i in range(eyer.shape[0]): col = (0, 255, 0) if i + 6 in self.blacklist: col = (0, 0, 255) cv2.circle(frame, (eyer[i, 0, 0], eyer[i, 0, 1]), 1, col, -1) for i in range(mouth.shape[0]): col = (255, 0, 0) if i + 11 in self.blacklist: col = (0, 0, 255) cv2.circle(frame, (mouth[i, 0, 0], mouth[i, 0, 1]), 1, col, -1) try: cv2.line(frame, self.peyel, self.peyer, (255, 0, 0), 1) cv2.line(frame, self.peyel, self.pmouth, (255, 0, 0), 1) cv2.line(frame, self.peyer, self.pmouth, (255, 0, 0), 1) except Exception: pass
def mark_landmarks(self, frame): eyel = self.points[:5] eyer = self.points[6:11] mouth = self.points[11:] for i in range(eyel.shape[0]): col = (255, 255, 0) if i in self.blacklist: col = (0, 0, 255) cv2.circle(frame, (eyel[i, 0, 0], eyel[i, 0, 1]), 1, col, -1) for i in range(eyer.shape[0]): col = (0, 255, 0) if i + 6 in self.blacklist: col = (0, 0, 255) cv2.circle(frame, (eyer[i, 0, 0], eyer[i, 0, 1]), 1, col, -1) for i in range(mouth.shape[0]): col = (255, 0, 0) if i + 11 in self.blacklist: col = (0, 0, 255) cv2.circle(frame, (mouth[i, 0, 0], mouth[i, 0, 1]), 1, col, -1) eyel_ids = [id for id in range(5) if id not in self.blacklist] eyer_ids = [id for id in range(6, 11) if id not in self.blacklist] mouth_bl = [ id for id in range(11, self.points.shape[0]) if id not in self.blacklist ] self.eyel = self.points[eyel_ids] self.eyer = self.points[eyer_ids] self.mouth = self.points[mouth_bl] write_text(frame, "Left Eye trackers : " + str(len(self.eyel))) write_text(frame, "Right Eye trackers : " + str(len(self.eyer))) write_text(frame, "Mouth trackers : " + str(len(self.mouth))) self.peyel = mean_pos(self.eyel) self.peyer = mean_pos(self.eyer) self.pmouth = mean_pos(self.mouth) try: cv2.line(frame, self.peyel, self.peyer, (255, 0, 0), 1) cv2.line(frame, self.peyel, self.pmouth, (255, 0, 0), 1) cv2.line(frame, self.peyer, self.pmouth, (255, 0, 0), 1) except Exception: pass
def detect(self, frame): gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) if self.mouth.shape[0] < 20 or self.eyel.shape[ 0] < 5 or self.eyer.shape[0] < 5: eyes = eye_cascade.detectMultiScale(gray, 1.35, 10) if len(eyes) > 1: rects = self.detector(gray, 0) if len(rects) == 1: rect = rects[0] shape = self.predictor(gray, rect) shape = shape_to_np(shape) self.blacklist = [] shape = shape[37:] newpoints = np.zeros((len(shape), 1, 2), dtype=np.float32) for i, (x, y) in enumerate(shape): newpoints[i, 0, 0] = x newpoints[i, 0, 1] = y eyel = newpoints[:5] eyer = newpoints[6:11] mouth = newpoints[11:] peyel = mean_pos(eyel) peyer = mean_pos(eyer) reye_ok = False leye_ok = False for eye in eyes: draw_rect(frame, eye) peye = eye[0] + eye[2] / 2, eye[1] + eye[3] / 2 dl = dist(peye, peyel) dr = dist(peye, peyer) if dl < 10: leye_ok = True elif dr < 10: reye_ok = True if reye_ok and leye_ok: write_text(frame, "Detecting") self.points = newpoints self.blacklist = [] self.prev_points = [] self.prev_gray = [] else: write_text(frame, "Tracking") self.track(gray) else: write_text(frame, "Tracking") self.track(gray) else: write_text(frame, "Tracking") self.track(gray) else: write_text(frame, "Tracking") self.track(gray) frame_rot = self.mark_landmarks(frame) self.prev_gray.append(gray) self.prev_points.append(self.points) if len(self.prev_gray) > 8: del self.prev_gray[0] if len(self.prev_points) > 8: del self.prev_points[0] self.cnt += 1 #self.displaymarks(frame) return frame_rot