File size: 3,661 Bytes
8aa5820
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import cv2
import numpy as np

def detect_face_dnn(net, frame, conf_threshold=0.5):
    """
    Detecta rostros en una imagen utilizando un modelo DNN pre-entrenado
    y devuelve los cuadros delimitadores.
    """
    frameHeight = frame.shape[0]
    frameWidth = frame.shape[1]
    
    # Crear un blob a partir de la imagen
    blob = cv2.dnn.blobFromImage(frame, 1.0, (300, 300), [104, 117, 123], False, False)
    
    # Establecer la entrada para la red neuronal
    net.setInput(blob)
    
    # Ejecutar la detección
    detections = net.forward()
    
    bboxes = []
    
    # Procesar las detecciones
    for i in range(detections.shape[2]):
        confidence = detections[0, 0, i, 2]
        
        # Filtrar por umbral de confianza
        if confidence > conf_threshold:
            x1 = int(detections[0, 0, i, 3] * frameWidth)
            y1 = int(detections[0, 0, i, 4] * frameHeight)
            x2 = int(detections[0, 0, i, 5] * frameWidth)
            y2 = int(detections[0, 0, i, 6] * frameHeight)
            
            # Asegurarse de que las coordenadas están dentro de los límites de la imagen
            x1 = max(0, min(x1, frameWidth - 1))
            y1 = max(0, min(y1, frameHeight - 1))
            x2 = max(0, min(x2, frameWidth - 1))
            y2 = max(0, min(y2, frameHeight - 1))
            
            # Agregar los cuadros delimitadores y la confianza
            bboxes.append([x1, y1, x2, y2, confidence])
    
    return np.array(bboxes)

def main():
    # Cargar el modelo de detección de rostros
    modelFile = "models/opencv_face_detector_uint8.pb"
    configFile = "models/opencv_face_detector.pbtxt"
    net = cv2.dnn.readNetFromTensorflow(modelFile, configFile)
    
    # Iniciar la cámara
    cap = cv2.VideoCapture(0)
    
    if not cap.isOpened():
        print("Error: No se pudo abrir la cámara.")
        return
    
    print("Cámara iniciada correctamente. Presione 'q' para salir.")
    
    while True:
        # Leer un frame de la cámara
        ret, frame = cap.read()
        
        if not ret:
            print("Error al capturar el frame.")
            break
        
        # Detectar rostros con umbrales de confianza diferentes
        for threshold in [0.5, 0.3, 0.1]:
            bboxes = detect_face_dnn(net, frame, threshold)
            
            # Crear copia del frame para dibujar en ella
            display_frame = frame.copy()
            
            # Dibujar los cuadros delimitadores
            for i, bbox in enumerate(bboxes):
                x1, y1, x2, y2, conf = bbox
                # Usar color verde
                color = (0, 255, 0)
                # Dibujar el rectángulo
                cv2.rectangle(display_frame, (int(x1), int(y1)), (int(x2), int(y2)), color, 2)
                # Mostrar la confianza
                label = f"Rostro: {conf:.2f}"
                cv2.putText(display_frame, label, (int(x1), int(y1) - 10), 
                           cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)
            
            # Mostrar el número de rostros detectados en la esquina
            cv2.putText(display_frame, f"Umbral: {threshold} - Rostros: {len(bboxes)}", 
                      (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
            
            # Mostrar el resultado
            window_name = f"Detección de Rostros (Umbral: {threshold})"
            cv2.imshow(window_name, display_frame)
        
        # Salir si se presiona 'q'
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    # Liberar recursos
    cap.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    main()