Add S-expression based video effects pipeline with modular effect definitions, constructs, and recipe files. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
55 lines
1.2 KiB
Python
55 lines
1.2 KiB
Python
# /// script
|
|
# requires-python = ">=3.10"
|
|
# dependencies = ["numpy", "opencv-python"]
|
|
# ///
|
|
"""
|
|
@effect blur
|
|
@version 1.0.0
|
|
@author artdag
|
|
|
|
@description
|
|
Gaussian blur effect. Softens the image by averaging neighboring pixels.
|
|
Useful for dreamy effects or reducing detail on quiet parts.
|
|
|
|
@param radius float
|
|
@range 0 50
|
|
@default 5
|
|
Blur radius in pixels. Higher = more blur. Must be positive.
|
|
|
|
@example
|
|
(effect blur :radius 10)
|
|
|
|
@example
|
|
;; Blur on quiet, sharp on loud
|
|
(effect blur :radius (bind energy :range [20 0]))
|
|
"""
|
|
|
|
import numpy as np
|
|
import cv2
|
|
|
|
|
|
def process_frame(frame: np.ndarray, params: dict, state: dict) -> tuple:
|
|
"""
|
|
Apply Gaussian blur to a video frame.
|
|
|
|
Args:
|
|
frame: Input frame as numpy array (H, W, 3) RGB uint8
|
|
params: Effect parameters
|
|
- radius: blur radius in pixels (default 5)
|
|
state: Persistent state dict (unused)
|
|
|
|
Returns:
|
|
Tuple of (processed_frame, new_state)
|
|
"""
|
|
radius = params.get("radius", 5)
|
|
|
|
if radius <= 0:
|
|
return frame, state
|
|
|
|
# Kernel size must be odd
|
|
ksize = int(radius) * 2 + 1
|
|
|
|
result = cv2.GaussianBlur(frame, (ksize, ksize), 0)
|
|
|
|
return result, state
|