Example #1
0
    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