| import cv2 |
| import os |
| import argparse |
| import numpy as np |
| from pathlib import Path |
|
|
| def capture_frames(video_path, output_dir, num_frames=3): |
| """ |
| Captures the first num_frames frames from a video file and resizes them to 128x128 pixels. |
| |
| Args: |
| video_path (str): Path to the video file |
| output_dir (str): Directory to save the captured frames |
| num_frames (int): Number of frames to capture from the start |
| |
| Returns: |
| list: Paths to the saved frames |
| """ |
| |
| if not os.path.isfile(video_path): |
| raise FileNotFoundError(f"Video file not found: {video_path}") |
|
|
| |
| os.makedirs(output_dir, exist_ok=True) |
|
|
| |
| video_name = Path(video_path).stem |
|
|
| |
| cap = cv2.VideoCapture(video_path) |
|
|
| if not cap.isOpened(): |
| raise Exception(f"Error opening video file: {video_path}") |
|
|
| |
| width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) |
| height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) |
| fps = cap.get(cv2.CAP_PROP_FPS) |
| total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) |
|
|
| print(f"Video Info:") |
| print(f" Resolution: {width}x{height}") |
| print(f" FPS: {fps:.2f}") |
| print(f" Total Frames: {total_frames}") |
|
|
| |
| if total_frames < num_frames: |
| print(f"Warning: Video has only {total_frames} frames, adjusting to capture {total_frames} frames.") |
| num_frames = total_frames |
|
|
| saved_frames = [] |
| for i in range(num_frames): |
| ret, frame = cap.read() |
| if not ret: |
| print(f"Error reading frame {i}") |
| break |
|
|
| resized_frame = cv2.resize(frame, (10, 10), interpolation=cv2.INTER_AREA) |
|
|
| |
| frame_path = os.path.join(output_dir, f"{video_name}_frame_{i:03d}.png") |
| cv2.imwrite(frame_path, resized_frame) |
| saved_frames.append(frame_path) |
| print(f"Saved frame {i+1}/{num_frames}: {frame_path}") |
|
|
| cap.release() |
| return saved_frames |
|
|
| def main(): |
| parser = argparse.ArgumentParser(description="Capture and resize frames from a video to 128x128 pixels") |
| parser.add_argument("--video", required=True, help="Path to the video file") |
| parser.add_argument("--output", default="frames", help="Directory to save the frames") |
| parser.add_argument("--frames", type=int, default=3, help="Number of frames to capture from the start") |
| args = parser.parse_args() |
|
|
| try: |
| saved_frames = capture_frames(args.video, args.output, args.frames) |
| print(f"Successfully captured {len(saved_frames)} frames from the video") |
| except Exception as e: |
| print(f"Error: {e}") |
|
|
| if __name__ == "__main__": |
| main() |
|
|