fix: clamp heavy blur kernel sizes, allow tilde in paths
This commit is contained in:
parent
00aaadf1ea
commit
a16abf2ada
2 changed files with 9 additions and 8 deletions
|
|
@ -67,13 +67,13 @@ def run() -> None:
|
||||||
# 1. Input gathering
|
# 1. Input gathering
|
||||||
video_str = questionary.path(
|
video_str = questionary.path(
|
||||||
"Enter path to video file:",
|
"Enter path to video file:",
|
||||||
validate=lambda p: Path(p).is_file() or "File does not exist",
|
validate=lambda p: Path(p).expanduser().is_file() or "File does not exist",
|
||||||
).ask()
|
).ask()
|
||||||
|
|
||||||
if not video_str:
|
if not video_str:
|
||||||
return
|
return
|
||||||
|
|
||||||
video_path = Path(video_str)
|
video_path = Path(video_str).expanduser()
|
||||||
|
|
||||||
interval_str = questionary.text(
|
interval_str = questionary.text(
|
||||||
"Frame interval for face detection (default: 30):",
|
"Frame interval for face detection (default: 30):",
|
||||||
|
|
|
||||||
|
|
@ -40,8 +40,9 @@ def apply_blur(
|
||||||
face_region = image[y1:y2, x1:x2]
|
face_region = image[y1:y2, x1:x2]
|
||||||
|
|
||||||
if method == "gaussian":
|
if method == "gaussian":
|
||||||
ksize = int(face_region.shape[0] * strength) | 1 # Must be odd
|
# Calculate kernel size based on face size, but clamp to max 99 to save CPU
|
||||||
ksize = max(ksize, 3)
|
ksize = int(face_region.shape[0] * (strength / 10.0)) | 1
|
||||||
|
ksize = max(3, min(ksize, 99))
|
||||||
blurred = cv2.GaussianBlur(face_region, (ksize, ksize), 0)
|
blurred = cv2.GaussianBlur(face_region, (ksize, ksize), 0)
|
||||||
elif method == "pixelate":
|
elif method == "pixelate":
|
||||||
ph = max(1, int(face_region.shape[0] / (strength * 2)))
|
ph = max(1, int(face_region.shape[0] / (strength * 2)))
|
||||||
|
|
@ -55,8 +56,8 @@ def apply_blur(
|
||||||
elif method == "blackout":
|
elif method == "blackout":
|
||||||
blurred = np.zeros_like(face_region)
|
blurred = np.zeros_like(face_region)
|
||||||
elif method == "elliptical":
|
elif method == "elliptical":
|
||||||
ksize = int(face_region.shape[0] * strength) | 1
|
ksize = int(face_region.shape[0] * (strength / 10.0)) | 1
|
||||||
ksize = max(ksize, 3)
|
ksize = max(3, min(ksize, 99))
|
||||||
full_blur = cv2.GaussianBlur(face_region, (ksize, ksize), 0)
|
full_blur = cv2.GaussianBlur(face_region, (ksize, ksize), 0)
|
||||||
mask = np.zeros(face_region.shape[:2], dtype=np.uint8)
|
mask = np.zeros(face_region.shape[:2], dtype=np.uint8)
|
||||||
center = (face_region.shape[1] // 2, face_region.shape[0] // 2)
|
center = (face_region.shape[1] // 2, face_region.shape[0] // 2)
|
||||||
|
|
@ -65,8 +66,8 @@ def apply_blur(
|
||||||
mask_3ch = cv2.merge([mask, mask, mask])
|
mask_3ch = cv2.merge([mask, mask, mask])
|
||||||
blurred = np.where(mask_3ch > 0, full_blur, face_region)
|
blurred = np.where(mask_3ch > 0, full_blur, face_region)
|
||||||
elif method == "median":
|
elif method == "median":
|
||||||
ksize = int(face_region.shape[0] * strength) | 1
|
ksize = int(face_region.shape[0] * (strength / 10.0)) | 1
|
||||||
ksize = max(ksize, 3)
|
ksize = max(3, min(ksize, 99))
|
||||||
blurred = cv2.medianBlur(face_region, ksize)
|
blurred = cv2.medianBlur(face_region, ksize)
|
||||||
else:
|
else:
|
||||||
raise ValueError(f"Unknown blur method: {method}")
|
raise ValueError(f"Unknown blur method: {method}")
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue