narrator-david-attenburo/capture.py

87 lines
2.9 KiB
Python

import cv2
import time
from PIL import Image, ImageGrab
import numpy as np
import os
import glob
from datetime import datetime
# Folder
folder = "frames"
MAX_IMAGES = 10
# Create the frames folder if it doesn't exist
frames_dir = os.path.join(os.getcwd(), folder)
os.makedirs(frames_dir, exist_ok=True)
def cleanup_old_images():
"""Keep only the 10 most recent frame images"""
frame_files = glob.glob(os.path.join(frames_dir, "frame_*.jpg"))
frame_files.sort(key=os.path.getctime, reverse=True) # Sort by creation time, newest first
# Remove older files if we have more than MAX_IMAGES
for old_file in frame_files[MAX_IMAGES:]:
try:
os.remove(old_file)
print(f"Removed old frame: {os.path.basename(old_file)}")
except OSError as e:
print(f"Error removing old frame {old_file}: {e}")
def get_latest_frame_path():
"""Get the path of the most recent frame file"""
frame_files = glob.glob(os.path.join(frames_dir, "frame_*.jpg"))
if frame_files:
return max(frame_files, key=os.path.getctime)
return None
print("📸 Starting screenshot capture... Capture is watching your screen!")
while True:
try:
# Take a screenshot
screenshot = ImageGrab.grab()
# Resize the image
max_size = 250
ratio = max_size / max(screenshot.size)
new_size = tuple([int(x*ratio) for x in screenshot.size])
resized_img = screenshot.resize(new_size, Image.LANCZOS)
# Convert the PIL image to an OpenCV image for saving
frame = cv2.cvtColor(np.array(resized_img), cv2.COLOR_RGB2BGR)
# Generate timestamped filename
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
frame_filename = f"frame_{timestamp}.jpg"
tmp_path = os.path.join(frames_dir, f"frame_{timestamp}.tmp.jpg")
final_path = os.path.join(frames_dir, frame_filename)
try:
cv2.imwrite(tmp_path, frame)
os.rename(tmp_path, final_path)
# Also create/update a symlink to the latest frame for backward compatibility
latest_link = os.path.join(frames_dir, "frame.jpg")
if os.path.exists(latest_link) or os.path.islink(latest_link):
os.remove(latest_link)
os.symlink(frame_filename, latest_link)
# Clean up old images
cleanup_old_images()
except cv2.error as e:
print(f"OpenCV error: Failed to write image: {e}")
except OSError as e:
print(f"OS error: Failed to rename image: {e}")
except Exception as e:
print(f"An unexpected error occurred during file operation: {e}")
except Exception as e:
print(f"Failed to capture screenshot: {e}")
# Wait for 2 seconds
time.sleep(2)
# Cleanup
cv2.destroyAllWindows()