Spaces:
Runtime error
Runtime error
| import cv2 | |
| import os | |
| import sys | |
| from tqdm import tqdm | |
| from utils import resize_image_frame | |
| def capture_slides_bg_modeling( | |
| video_path, | |
| output_dir_path, | |
| type_bgsub, | |
| history, | |
| threshold, | |
| MIN_PERCENT_THRESH, | |
| MAX_PERCENT_THRESH, | |
| ): | |
| print(f"Using {type_bgsub} for Background Modeling...") | |
| print("---" * 10) | |
| if type_bgsub == "GMG": | |
| bg_sub = cv2.bgsegm.createBackgroundSubtractorGMG( | |
| initializationFrames=history, decisionThreshold=threshold | |
| ) | |
| elif type_bgsub == "KNN": | |
| bg_sub = cv2.createBackgroundSubtractorKNN( | |
| history=history, dist2Threshold=threshold, detectShadows=False | |
| ) | |
| else: | |
| raise ValueError("Please choose GMG or KNN as background subtraction method") | |
| capture_frame = False | |
| screenshots_count = 0 | |
| # Capture video frames. | |
| cap = cv2.VideoCapture(video_path) | |
| if not cap.isOpened(): | |
| print("Unable to open video file: ", video_path) | |
| sys.exit() | |
| num_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) | |
| prog_bar = tqdm(total=num_frames) | |
| # Loop over subsequent frames. | |
| while cap.isOpened(): | |
| ret, frame = cap.read() | |
| if not ret: | |
| break | |
| # Create a copy of the original frame. | |
| orig_frame = frame.copy() | |
| # Resize the frame keeping aspect ratio. | |
| frame = resize_image_frame(frame, resize_width=640) | |
| # Apply each frame through the background subtractor. | |
| fg_mask = bg_sub.apply(frame) | |
| # Compute the percentage of the Foreground mask." | |
| p_non_zero = (cv2.countNonZero(fg_mask) / (1.0 * fg_mask.size)) * 100 | |
| # %age of non-zero pixels < MAX_PERCENT_THRESH, implies motion has stopped. | |
| # Therefore, capture the frame. | |
| if p_non_zero < MAX_PERCENT_THRESH and not capture_frame: | |
| capture_frame = True | |
| screenshots_count += 1 | |
| png_filename = f"{screenshots_count:03}.jpg" | |
| out_file_path = os.path.join(output_dir_path, png_filename) | |
| cv2.imwrite(out_file_path, orig_frame, [cv2.IMWRITE_JPEG_QUALITY, 75]) | |
| prog_bar.set_postfix_str(f"Total Screenshots: {screenshots_count}") | |
| # p_non_zero >= MIN_PERCENT_THRESH, indicates motion/animations. | |
| # Hence wait till the motion across subsequent frames has settled down. | |
| elif capture_frame and p_non_zero >= MIN_PERCENT_THRESH: | |
| capture_frame = False | |
| prog_bar.update(1) | |
| # Release progress bar and video capture object. | |
| prog_bar.close() | |
| cap.release() | |