Dotfiles/desktopenvs/hyprlua/scripts/python/presence_detect.py

43 lines
1.1 KiB
Python
Executable File

#!/usr/bin/env python3
"""
Webcam face presence detector using OpenCV haar cascades.
Exit codes: 0 = face detected, 1 = no face, 2 = camera error
Usage: presence_detect.py [camera_id]
"""
import sys
import cv2
FRAMES_TO_CHECK = 6
FACES_NEEDED = 2 # require face in at least N frames to count as present
SCALE_FACTOR = 1.1
MIN_NEIGHBORS = 4
def detect(camera_id: int) -> int:
cap = cv2.VideoCapture(camera_id)
if not cap.isOpened():
return 2
cascade = cv2.CascadeClassifier(
cv2.data.haarcascades + "haarcascade_frontalface_default.xml"
)
detected = 0
try:
for _ in range(FRAMES_TO_CHECK):
ok, frame = cap.read()
if not ok:
continue
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = cascade.detectMultiScale(gray, SCALE_FACTOR, MIN_NEIGHBORS)
if len(faces) > 0:
detected += 1
finally:
cap.release()
return 0 if detected >= FACES_NEEDED else 1
if __name__ == "__main__":
camera_id = int(sys.argv[1]) if len(sys.argv) > 1 else 0
sys.exit(detect(camera_id))