Spaces:
Runtime error
Runtime error
| import cv2 | |
| import os | |
| import sys | |
| from tqdm import tqdm | |
| def capture_slides_frame_diff( | |
| video_path, output_dir_path, MIN_PERCENT_THRESH=0.06, ELAPSED_FRAME_THRESH=85 | |
| ): | |
| prev_frame = None | |
| curr_frame = None | |
| screenshots_count = 0 | |
| capture_frame = False | |
| frame_elapsed = 0 | |
| # Initialize kernel. | |
| kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 7)) | |
| # Capture video frames | |
| cap = cv2.VideoCapture(video_path) | |
| if not cap.isOpened(): | |
| print("Unable to open video file: ", video_path) | |
| sys.exit() | |
| success, first_frame = cap.read() | |
| num_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) | |
| prog_bar = tqdm(total=num_frames) | |
| print("Using frame differencing for Background Subtraction...") | |
| print("---" * 10) | |
| # The 1st frame should always be present in the output directory. | |
| # Hence capture and save the 1st frame. | |
| if success: | |
| # Convert frame to grayscale. | |
| first_frame_gray = cv2.cvtColor(first_frame, cv2.COLOR_BGR2GRAY) | |
| prev_frame = first_frame_gray | |
| screenshots_count += 1 | |
| filename = f"{screenshots_count:03}.jpg" | |
| out_file_path = os.path.join(output_dir_path, filename) | |
| # Save frame. | |
| cv2.imwrite(out_file_path, first_frame, [cv2.IMWRITE_JPEG_QUALITY, 75]) | |
| prog_bar.update(1) | |
| # Loop over subsequent frames. | |
| while cap.isOpened(): | |
| ret, frame = cap.read() | |
| if not ret: | |
| break | |
| frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) | |
| curr_frame = frame_gray | |
| if (prev_frame is not None) and (curr_frame is not None): | |
| frame_diff = cv2.absdiff(curr_frame, prev_frame) | |
| _, frame_diff = cv2.threshold(frame_diff, 80, 255, cv2.THRESH_BINARY) | |
| # Perform dilation to capture motion. | |
| frame_diff = cv2.dilate(frame_diff, kernel) | |
| # Compute the percentage of non-zero pixels in the frame. | |
| p_non_zero = (cv2.countNonZero(frame_diff) / (1.0 * frame_gray.size)) * 100 | |
| if p_non_zero >= MIN_PERCENT_THRESH and not capture_frame: | |
| capture_frame = True | |
| elif capture_frame: | |
| frame_elapsed += 1 | |
| if frame_elapsed >= ELAPSED_FRAME_THRESH: | |
| capture_frame = False | |
| frame_elapsed = 0 | |
| screenshots_count += 1 | |
| filename = f"{screenshots_count:03}.jpg" | |
| out_file_path = os.path.join(output_dir_path, filename) | |
| cv2.imwrite(out_file_path, frame, [cv2.IMWRITE_JPEG_QUALITY, 75]) | |
| prog_bar.set_postfix_str(f"Total Screenshots: {screenshots_count}") | |
| prev_frame = curr_frame | |
| prog_bar.update(1) | |
| # Release progress bar and video capture object. | |
| prog_bar.close() | |
| cap.release() | |