Download process_video_to_14frames.py from svjack/AniDoc: direct link, hf CLI and curl.
- Browser
- Download file 2.22 kB
-
https://huggingface.co/spaces/svjack/AniDoc/resolve/7e940787ddec15e5f8bfe343af0926150a72438e/process_video_to_14frames.py
- Command line
-
hf download hf://spaces/svjack/AniDoc@7e940787ddec15e5f8bfe343af0926150a72438e/process_video_to_14frames.py
-
curl -L -o process_video_to_14frames.py https://huggingface.co/spaces/svjack/AniDoc/resolve/7e940787ddec15e5f8bfe343af0926150a72438e/process_video_to_14frames.py
2.22 kB
| import os | |
| import cv2 | |
| import numpy as np | |
| import shutil | |
| import argparse | |
| import sys | |
| def process_video(input_path: str, output_folder: str) -> str: | |
| """Process a single video file to 14 frames""" | |
| os.makedirs(output_folder, exist_ok=True) | |
| video = cv2.VideoCapture(input_path) | |
| frame_count = int(video.get(cv2.CAP_PROP_FRAME_COUNT)) | |
| fps = video.get(cv2.CAP_PROP_FPS) | |
| width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH)) | |
| height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)) | |
| frame_indices = np.linspace(0, frame_count - 1, num=14, dtype=int) | |
| sampled_frames = [] | |
| current_frame = 0 | |
| frames_read = 0 | |
| while True: | |
| ret, frame = video.read() | |
| if not ret: | |
| break | |
| if current_frame in frame_indices: | |
| sampled_frames.append(frame) | |
| frames_read += 1 | |
| if frames_read == len(frame_indices): | |
| break | |
| current_frame += 1 | |
| video.release() | |
| output_video_path = os.path.join(output_folder, os.path.basename(input_path)) | |
| fourcc = cv2.VideoWriter_fourcc(*'mp4v') | |
| out_video = cv2.VideoWriter(output_video_path, fourcc, fps, (width, height)) | |
| for frame in sampled_frames: | |
| out_video.write(frame) | |
| out_video.release() | |
| # Save individual frames | |
| frame_folder = os.path.join(output_folder, os.path.splitext(os.path.basename(input_path))[0]) | |
| os.makedirs(frame_folder, exist_ok=True) | |
| for idx, frame in enumerate(sampled_frames): | |
| frame_image_path = os.path.join(frame_folder, f'frame_{idx:03d}.png') | |
| cv2.imwrite(frame_image_path, frame) | |
| return output_video_path | |
| def main(): | |
| parser = argparse.ArgumentParser(description='Process video to 14 frames') | |
| parser.add_argument('--input', type=str, required=True, help='Input video file') | |
| parser.add_argument('--output', type=str, required=True, help='Output folder path') | |
| args = parser.parse_args() | |
| try: | |
| output_path = process_video(args.input, args.output) | |
| print(f"Successfully processed video to: {output_path}") | |
| except Exception as e: | |
| print(f"Error processing video: {str(e)}", file=sys.stderr) | |
| sys.exit(1) | |
| if __name__ == '__main__': | |
| main() | |