43 lines
1.1 KiB
Python
Executable File
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))
|