From 6b2af863d24dba83b16f526abc7d1cf05e72dacd Mon Sep 17 00:00:00 2001 From: Akshit Agarwal Date: Fri, 27 Mar 2026 12:16:48 +0530 Subject: [PATCH 1/3] Added face detection and enrollment working with OpenCV fallback --- templates/246123bfddaa83d8.enc | 10 ++++++++++ test_camera.py | 19 +++++++++++++++++++ test_face_detection.py | 28 ++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 templates/246123bfddaa83d8.enc create mode 100644 test_camera.py create mode 100644 test_face_detection.py diff --git a/templates/246123bfddaa83d8.enc b/templates/246123bfddaa83d8.enc new file mode 100644 index 0000000..143457b --- /dev/null +++ b/templates/246123bfddaa83d8.enc @@ -0,0 +1,10 @@ +{ + "encrypted_template": "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", + "metadata": { + "created_at": 1774593122.4140468, + "feature_dimension": 512, + "version": "1.0", + "algorithm": "face_recognition" + }, + "checksum": "dc580c65e4f3e142dc97e06bbc356b3674d78160fca85c3810d0b75048e07d89" +} \ No newline at end of file diff --git a/test_camera.py b/test_camera.py new file mode 100644 index 0000000..53262f5 --- /dev/null +++ b/test_camera.py @@ -0,0 +1,19 @@ +import cv2 + +cap = cv2.VideoCapture(0) + +while True: + ret, frame = cap.read() + + if not ret: + print("Camera not working ❌") + break + + cv2.imshow("Camera Test", frame) + + # Press ESC to exit + if cv2.waitKey(1) & 0xFF == ord('q'): + break + +cap.release() +cv2.destroyAllWindows() \ No newline at end of file diff --git a/test_face_detection.py b/test_face_detection.py new file mode 100644 index 0000000..21e901d --- /dev/null +++ b/test_face_detection.py @@ -0,0 +1,28 @@ +import cv2 +import sys, os +sys.path.append(os.path.abspath("LockLess/src")) + +from src.biometric.face_detection import FaceDetector +detector = FaceDetector(backend="opencv") + +cap = cv2.VideoCapture(0) + +while True: + ret, frame = cap.read() + if not ret: + break + + faces = detector.detect_faces(frame) + + print("Faces detected:", len(faces)) # 👈 IMPORTANT + + for (x, y, w, h) in faces: + cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2) + + cv2.imshow("Face Detection", frame) + + if cv2.waitKey(1) & 0xFF == ord('q'): + break + +cap.release() +cv2.destroyAllWindows() \ No newline at end of file From bed0249b390c3b9ac96ef38b542360d2a9717e76 Mon Sep 17 00:00:00 2001 From: Akshit Agarwal Date: Fri, 27 Mar 2026 12:21:17 +0530 Subject: [PATCH 2/3] Added gitignore and removed sensitive files --- .gitignore | 60 ++-------------------------------- templates/246123bfddaa83d8.enc | 10 ------ 2 files changed, 3 insertions(+), 67 deletions(-) delete mode 100644 templates/246123bfddaa83d8.enc diff --git a/.gitignore b/.gitignore index 47d1dc5..df2412e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,58 +1,4 @@ -# Python -__pycache__/ -*.py[cod] -*$py.class -*.so -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# Virtual environments +templates/ .venv/ -venv/ -ENV/ -env/ -.env - -# IDE -.vscode/ -.idea/ -*.swp -*.swo -*~ - -# OS -.DS_Store -Thumbs.db - -# Logs -*.log -logs/ - -# Temporary files -tmp/ -temp/ -tmp_templates/ - -# Model files (if large) -models/*.pkl -models/*.h5 -models/*.model - -# Configuration files with sensitive data -config/local.yaml -config/production.yaml +__pycache__/ +*.pyc \ No newline at end of file diff --git a/templates/246123bfddaa83d8.enc b/templates/246123bfddaa83d8.enc deleted file mode 100644 index 143457b..0000000 --- a/templates/246123bfddaa83d8.enc +++ /dev/null @@ -1,10 +0,0 @@ -{ - "encrypted_template": "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", - "metadata": { - "created_at": 1774593122.4140468, - "feature_dimension": 512, - "version": "1.0", - "algorithm": "face_recognition" - }, - "checksum": "dc580c65e4f3e142dc97e06bbc356b3674d78160fca85c3810d0b75048e07d89" -} \ No newline at end of file From 1bc6dd3b6d21d870fcfaaef08bebccd1f5a3f3db Mon Sep 17 00:00:00 2001 From: Akshit Agarwal Date: Sun, 29 Mar 2026 17:55:51 +0530 Subject: [PATCH 3/3] Added camera window display and optimized face detection with resizing --- 50ms | 0 src/biometric/face_detection.py | 45 ++++++++++++++++++++++----------- test_camera.py | 28 +++++++++++++++++--- 3 files changed, 54 insertions(+), 19 deletions(-) create mode 100644 50ms diff --git a/50ms b/50ms new file mode 100644 index 0000000..e69de29 diff --git a/src/biometric/face_detection.py b/src/biometric/face_detection.py index cdbe31f..0081b57 100644 --- a/src/biometric/face_detection.py +++ b/src/biometric/face_detection.py @@ -14,8 +14,8 @@ except Exception: # pragma: no cover - runtime dependency guard ort = None # type: ignore[assignment] -from core.logging import get_logger, PerformanceTimer -from core.exceptions import FaceDetectionError, ModelLoadError +from src.core.logging import get_logger, PerformanceTimer +from src.core.exceptions import FaceDetectionError, ModelLoadError logger = get_logger(__name__) @@ -416,22 +416,37 @@ def _resolve_haarcascade_path(self) -> str: return "haarcascade_frontalface_default.xml" -# Example usage and testing if __name__ == "__main__": - # Test face detection - detector = FaceDetector(backend="opencv") # Use OpenCV for testing + detector = FaceDetector(backend="opencv") - print("Testing face detection...") + cap = cv2.VideoCapture(0) - # Create a test image (in practice, this would come from camera) - test_image = np.zeros((480, 640, 3), dtype=np.uint8) + if not cap.isOpened(): + print("Error: Cannot access camera") + exit() - # Test detection - faces = detector.detect_faces(test_image) - print(f"Detected {len(faces)} faces") + print("Press 'q' to exit") - if faces: - largest_face = detector.detect_largest_face(test_image) - print(f"Largest face: {largest_face}") + while True: + ret, frame = cap.read() + if not ret: + break - print("Face detection test completed!") + # Detect faces + faces = detector.detect_faces(frame) + + print("Faces detected:", len(faces)) + + # Draw boxes + for (x, y, w, h) in faces: + cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2) + + # SHOW WINDOW 🔥 + cv2.imshow("Face Detection", frame) + + # Exit on 'q' + if cv2.waitKey(1) & 0xFF == ord('q'): + break + + cap.release() + cv2.destroyAllWindows() \ No newline at end of file diff --git a/test_camera.py b/test_camera.py index 53262f5..d075082 100644 --- a/test_camera.py +++ b/test_camera.py @@ -1,18 +1,38 @@ +from src.biometric.face_detection import FaceDetector import cv2 +detector = FaceDetector(backend="opencv") + cap = cv2.VideoCapture(0) +if not cap.isOpened(): + print("❌ Cannot access camera") + exit() + while True: ret, frame = cap.read() - if not ret: - print("Camera not working ❌") break - cv2.imshow("Camera Test", frame) + # Resize frame for faster processing + small_frame = cv2.resize(frame, (0, 0), fx=0.5, fy=0.5) + + # Detect faces on smaller frame + faces = detector.detect_faces(small_frame) + + # Scale faces back to original size + scaled_faces = [] + for (x, y, w, h) in faces: + scaled_faces.append((x * 2, y * 2, w * 2, h * 2)) + + # Draw on original frame + frame = detector.visualize_detections(frame, scaled_faces) + + # SHOW WINDOW (correct indentation) + cv2.imshow("Face Detection", frame) # Press ESC to exit - if cv2.waitKey(1) & 0xFF == ord('q'): + if cv2.waitKey(1) & 0xFF == 27: break cap.release()