File size: 2,199 Bytes
6f2dcbc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# backend/core/video_processor.py
import cv2
import asyncio
from datetime import datetime
from core.face_detection import FaceDetector
from core.face_recognition import FaceRecognizer
from core.attendance_manager import AttendanceManager

class VideoProcessor:
    def __init__(self, detector, recognizer, attendance_manager):
        self.detector = detector
        self.recognizer = recognizer
        self.attendance_manager = attendance_manager
        self.frame_buffer = []
        self.processing_interval = 0.5  # Process every 0.5 seconds
        
    async def process_video(self, video_source=0):
        """Process video stream from camera or file"""
        cap = cv2.VideoCapture(video_source)
        
        if not cap.isOpened():
            raise ValueError("Could not open video source")
            
        last_process_time = datetime.now()
        
        while True:
            ret, frame = cap.read()
            if not ret:
                break
                
            # Process at intervals for efficiency
            current_time = datetime.now()
            if (current_time - last_process_time).total_seconds() >= self.processing_interval:
                # Detect faces
                faces = self.detector.detect_faces(frame)
                
                for face_data in faces:
                    # Recognize face
                    name = self.recognizer.recognize_face(face_data['face_img'])
                    if name:
                        # Mark attendance
                        employee_id = self._get_employee_id(name)
                        if employee_id:
                            self.attendance_manager.mark_attendance(employee_id)
                            # Draw bounding box with name
                            x1, y1, x2, y2 = face_data['bbox']
                            cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
                            cv2.putText(frame, name, (x1, y1-10), 
                                      cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0,255,0), 2)
                
                last_process_time = current_time
                
            yield frame
            
        cap.release()