print(e)
            raise e

        return outputImage


if __name__ == "__main__":

    image_path = "images/Subway/00006.jpg"
    fp = FilePath(image_path)
    dir_name = fp.getDirectory() + "\\processed\\"
    time_identifier = datetime.now().strftime("%Y%m%d-%H%M%S-")

    output_path = dir_name + time_identifier + fp.getFileName(
    ) + fp.getExtension()
    log_file = os.path.abspath(dir_name + time_identifier + fp.getFileName() +
                               ".log")
    logger = Log.setup_logger(fp.getFileName(), log_file)
    imageToProcess = cv2.imread(image_path)

    ImagePose().analyze(image=imageToProcess,
                        image_id=None,
                        show_skeleton=True,
                        show_num_of_people=True,
                        classify_pose=True,
                        show_pose=True,
                        display_image=True,
                        wait_key=0,
                        logger=logger,
                        export_path=output_path)
Ejemplo n.º 2
0
    def analyze(self,
                video_path,
                fps=None,
                max_frame=np.inf,
                start_frame=1,
                show_skeleton=True,
                show_num_of_people=True,
                classify_pose=False,
                show_pose=False,
                track_pose_id=False,
                frames_to_disappear=None,
                show_pose_id=False,
                display_image=True,
                wait_key=1,
                log=False,
                export_frame=False):

        if start_frame < 1:
            raise Exception(
                "argument 'start_frame' in VideoPose.analyze() cannot be less than 1"
            )

        fp = FilePath(video_path)
        dir_name = fp.getDirectory() + "\\" + fp.getFileName() + "\\"
        time_identifier = datetime.now().strftime("%Y%m%d-%H%M%S-")

        if export_frame is True or log is True:
            try:
                os.mkdir(dir_name)
                print("Directory", dir_name, "Created ")
            except FileExistsError:
                print("Directory", dir_name, "already exists")

        if log is True:
            log_file = os.path.abspath(dir_name + time_identifier +
                                       fp.getFileName() + ".log")
            logger = Log.setup_logger(fp.getFileName(), log_file)
            logger.info('Processing Video: ' + str(video_path) + "\n")
        else:
            logger = None

        try:
            cap = cv2.VideoCapture(video_path)
            original_fps = cap.get(cv2.CAP_PROP_FPS)
            frame_width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
            frame_height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
            if fps is None:
                fps = original_fps
            if track_pose_id is True:
                if frames_to_disappear is None:
                    self.__keypoint_tracker = KeypointTracker(
                        frame_width=frame_width,
                        frame_height=frame_height,
                        logger=logger)
                else:
                    self.__keypoint_tracker = KeypointTracker(
                        frame_width=frame_width,
                        frame_height=frame_height,
                        max_disappeared=frames_to_disappear,
                        logger=logger)

            num_frame = start_frame
            for i in range(start_frame):
                cap.read()
                for j in range(int(original_fps / fps) - 1):
                    cap.read()

            while cap.isOpened() and (max_frame is None
                                      or num_frame <= max_frame):
                ret, frame = cap.read()
                for i in range(int(original_fps / fps) - 1):
                    ret, frame = cap.read()

                if ret is False or frame is None:
                    break

                print("Processing Frame:", num_frame)
                if log is True:
                    logger.info('Processing Frame: ' + str(num_frame))

                self.__pose_estimator.processImage(frame)
                if show_skeleton is True:
                    outputImage = self.__pose_estimator.getOutputImage()
                else:
                    outputImage = frame
                keypoints = self.__pose_estimator.getPoseKeypoints()
                if show_num_of_people is True:
                    ImageProcessing.outputNumberOfPeopleToImage(
                        outputImage, len(keypoints))

                if classify_pose is True:
                    index = 1
                    for keypoint in keypoints:
                        print('Passenger', index)
                        if log is True:
                            logger.info('Passenger' + str(index))
                            logger.info('\n' + str(keypoint))
                        pose = PoseClassifier.predictPoseBody25(
                            keypoint, logger)
                        text = str(index) + ': ' + pose.name
                        print(text + "\n")
                        if log is True:
                            logger.info('Passenger ' + text + '\n')
                        if show_pose is True:
                            ImageProcessing.outputIndividualPoseToImage(
                                outputImage, text, keypoint)
                        index += 1

                if track_pose_id is True:
                    self.__keypoint_tracker.update(keypoints)
                    keypoints = self.__keypoint_tracker.getKeypointsInFrame()
                    if show_pose_id is True:
                        for (pose_id, keypoint) in zip(keypoints.keys(),
                                                       keypoints.values()):
                            ImageProcessing.outputIndividualIdToImage(
                                outputImage, pose_id, keypoint)

                if export_frame is True:
                    output_path = dir_name + time_identifier + 'Frame ' + str(
                        num_frame) + ".jpg"
                    cv2.imwrite(output_path, outputImage)
                    print(output_path)
                    print('Successfully saved' + '\n')
                    if log is True:
                        logger.info(output_path)
                        logger.info('Successfully saved' + '\n')

                if display_image is True:
                    try:
                        cv2.imshow(video_path, outputImage)
                        cv2.waitKey(wait_key)
                    except Exception as e:
                        if log is True:
                            logger.error(e)
                        print(e)

                num_frame += 1

            print("Done")
            if log is True:
                logger.info("Done")

        except Exception as e:
            if log is True:
                logger.error(e)
            print(e)
            raise e