예제 #1
0
class recognitionGui:
    def __init__(self, video_name):
        self.title_window = "Demonstrateur reconnaissance de personne"
        self.skeletonService = Skeleton()
        self.cap = cv2.VideoCapture(video_name)
        self.opWrapper = op.WrapperPython()
        self.opWrapper.configure(params)
        self.opWrapper.start()
        self.gaitClassifier = GaitClassifier()
        self.last_frame = None
        self.kp_frames = []
        self.stop = False
        w, h = (int(self.cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
                int(self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
        self.out = cv2.VideoWriter(
            "Recording_" + datetime.datetime.now().strftime("%Y%m%d_%H%M%S") +
            ".mp4", cv2.VideoWriter_fourcc(*'MP4V'), 25, (w, h))

    def run(self):
        while (self.cap.isOpened() and not self.stop):
            self.putFrame()

        cv2.imshow(self.title_window, self.last_frame)
        self.out.write(self.last_frame)

        self.kp_frames = np.asarray(self.kp_frames)
        print(self.kp_frames.shape)
        if self.kp_frames.shape[0] >= 140:
            for i in range(3):
                mean = np.mean(self.kp_frames[:, i::3], axis=0)
                std = np.std(self.kp_frames[:, i::3], axis=0)
                self.kp_frames[:, i::3] = np.divide(self.kp_frames[:, i::3] -
                                                    mean,
                                                    std,
                                                    where=(std != 0))
            pred, pred_value = self.gaitClassifier.demo(self.kp_frames)
            pred = Gait(pred).name
        else:
            pred = "Unknown"
            pred_value = None
        self.last_frame = self.putPhoto("people/" + pred + ".png",
                                        self.last_frame)
        self.last_frame = self.putName(pred, self.last_frame)
        if pred_value != None:
            self.last_frame = self.putName(str(int(pred_value * 10000) / 100) +
                                           " %",
                                           self.last_frame,
                                           offset=15)
        cv2.imshow(self.title_window, self.last_frame)

        for i in range(25):
            self.out.write(self.last_frame)
        self.out.release()
        cv2.waitKey(0)

    def putFrame(self):

        ret, frame = self.cap.read()
        if ret:
            try:
                # Process Image
                datum = op.Datum()
                datum.cvInputData = frame
                self.opWrapper.emplaceAndPop([datum])
            except:
                pass

            kp = datum.poseKeypoints
            if not len(kp.shape) == 0:
                self.kp_frames.append(kp[0].flatten())

            frame = self.putSkeleton(kp, frame)
            frame = self.putPhoto("people/Unknown.png", frame)
            self.last_frame = np.array(frame)
            frame = self.putName(None, frame)
            cv2.imshow(self.title_window, frame)
            self.out.write(frame)
            key = cv2.waitKey(1)
            if key == ord('q'):
                self.stop = True
        else:
            self.cap.release()

    def putSkeleton(self, kp, frame):
        img = np.zeros(frame.shape, np.uint8)
        img += 180

        if not len(kp.shape) == 0:
            window_size = [frame.shape[0], frame.shape[1], 50, 90]
            img = self.skeletonService.drawSkeleton(kp, window_size, img)

        img = cv2.resize(img, (int(
            int(1 / 3 * frame.shape[0]) * 4 / 3), int(1 / 3 * frame.shape[0])))
        img_w, img_h, _ = img.shape
        frame[frame.shape[0] - img_w - 10:frame.shape[0] - 10,
              frame.shape[1] - img_h - 10:frame.shape[1] - 10] = img
        return frame

    def putPhoto(self, path, frame):
        photo = cv2.imread(path)
        photo = cv2.resize(
            photo, (int(1 / 3 * frame.shape[0]), int(1 / 3 * frame.shape[0])))

        photo_w, photo_h, _ = photo.shape
        frame[10:photo_w + 10, 10:photo_h + 10] = photo
        return frame

    def putName(self, name, frame, offset=0):

        if name == None:
            name = "Reconnaissance en cours ..."
            font_scale = .3
        else:
            font_scale = .6 if offset == 0 else 0.45
        font = cv2.FONT_HERSHEY_SIMPLEX
        (text_width, text_height) = cv2.getTextSize(name,
                                                    font,
                                                    fontScale=font_scale,
                                                    thickness=1)[0]

        img = frame.copy()
        img = cv2.rectangle(
            img, (10, int(offset + 11 + text_height + 1 / 3 * frame.shape[0])),
            (int(10 + 1 / 3 * frame.shape[0]),
             int(offset + 10 + 1 / 3 * frame.shape[0])), (255, 255, 255),
            cv2.FILLED)
        frame = cv2.addWeighted(img, .5, frame, .5, 0)

        frame = cv2.putText(
            frame, name,
            (int(10 + 1 / 6 * frame.shape[0] - text_width / 2),
             int(offset + 15 + text_height / 2 + 1 / 3 * frame.shape[0])),
            font, font_scale, (20, 30, 0), 1, cv2.LINE_AA)

        return frame
예제 #2
0
        try:
            # Process Image
            datum = op.Datum()
            datum.cvInputData = frame
            opWrapper.emplaceAndPop([datum])
        except:
            break

        #Get keypoints
        kp = datum.poseKeypoints

        if args["mode"] == "skeleton":
            frame = np.zeros(frame.shape, np.uint8)
            frame += 200
            try:
                frame = skeleton.drawSkeleton(kp, (x, y, w, h), frame)
            except:
                pass

        else:
            #Add skeleton
            if viewSkeleton:
                frame = datum.cvOutputData

            #Normalize keypoints and predict pose
            if args["mode"] != "openpose":
                try:
                    frame = service.displayPrediction(frame, kp)
                    if args["mode"] == "pose" and isInDevMode and isSavingData:
                        dev_data = service.getData()
                        for data in dev_data: