jarondon82/ComputerVisionProject
1
1import cv22import numpy as np3import time4 5def main():6 """7 Script para probar la detección de rostros con diferentes configuraciones8 y visualizar claramente los resultados.9 """10 print("Iniciando prueba de detección facial...")11 12 # Cargar el modelo DNN preentrenado para detección de rostros13 print("Cargando modelo DNN para detección facial...")14 15 # Usar el modelo Caffe16 modelFile = "models/deploy.prototxt"17 weightsFile = "models/res10_300x300_ssd_iter_140000_fp16.caffemodel"18 19 try:20 face_net = cv2.dnn.readNetFromCaffe(modelFile, weightsFile)21 print("Modelo DNN cargado correctamente.")22 except Exception as e:23 print(f"Error al cargar el modelo DNN: {str(e)}")24 print("Intentando usar detección Haar en su lugar...")25 face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')26 if face_cascade.empty():27 print("Error: No se pudo cargar el clasificador Haar.")28 return29 use_dnn = False30 else:31 use_dnn = True32 33 # Iniciar la cámara34 cap = cv2.VideoCapture(0)35 36 if not cap.isOpened():37 print("Error: No se pudo abrir la cámara.")38 return39 40 print("Cámara iniciada correctamente. Presione 'q' para salir, 's' para guardar una captura.")41 42 # Contador de frames43 frame_count = 044 start_time = time.time()45 46 # Umbrales de confianza para probar47 confidence_thresholds = [0.5, 0.3, 0.1]48 current_threshold_index = 049 current_threshold = confidence_thresholds[current_threshold_index]50 51 def detect_face_dnn(net, frame, conf_threshold=0.5):52 # Preparar la imagen para la red (redimensionar a 300x300 y normalizar)53 h, w = frame.shape[:2]54 blob = cv2.dnn.blobFromImage(cv2.resize(frame, (300, 300)), 1.0,55 (300, 300), (104.0, 177.0, 123.0))56 57 # Pasar la imagen a través de la red58 net.setInput(blob)59 detections = net.forward()60 61 # Procesar las detecciones62 bboxes = []63 for i in range(detections.shape[2]):64 confidence = detections[0, 0, i, 2]65 66 if confidence > conf_threshold:67 # Obtener coordenadas de la caja delimitadora68 box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])69 x1, y1, x2, y2 = box.astype("int")70 71 # Asegurarse de que las coordenadas estén dentro de la imagen72 x1, y1 = max(0, x1), max(0, y1)73 x2, y2 = min(w, x2), min(h, y2)74 75 # Añadir caja y confianza76 bboxes.append([x1, y1, x2, y2, confidence])77 78 return bboxes if bboxes else None79 80 def detect_face_haar(face_cascade, frame, scale_factor=1.1):81 # Convertir a escala de grises para la detección Haar82 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)83 84 # Detectar rostros85 faces = face_cascade.detectMultiScale(86 gray,87 scaleFactor=scale_factor,88 minNeighbors=5,89 minSize=(30, 30),90 flags=cv2.CASCADE_SCALE_IMAGE91 )92 93 if len(faces) == 0:94 return None95 96 # Convertir al mismo formato que el DNN97 bboxes = []98 for (x, y, w, h) in faces:99 bboxes.append([x, y, x+w, y+h, 1.0]) # Confianza simulada de 1.0100 101 return bboxes102 103 while True:104 # Leer un frame de la cámara105 ret, frame = cap.read()106 107 if not ret:108 print("Error al capturar el frame.")109 break110 111 # Incrementar contador112 frame_count += 1113 elapsed = time.time() - start_time114 fps = frame_count / elapsed if elapsed > 0 else 0115 116 # Crear copia del frame para dibujar117 display_frame = frame.copy()118 119 # Detectar rostros según el método seleccionado120 if use_dnn:121 bboxes = detect_face_dnn(face_net, frame, current_threshold)122 method_text = f"DNN (Conf: {current_threshold})"123 else:124 bboxes = detect_face_haar(face_cascade, frame)125 method_text = "Haar Cascade"126 127 # Dibujar los rostros detectados128 if bboxes is not None:129 for box in bboxes:130 x1, y1, x2, y2 = int(box[0]), int(box[1]), int(box[2]), int(box[3])131 132 # Dibujar rectángulo verde grueso133 cv2.rectangle(display_frame, (x1, y1), (x2, y2), (0, 255, 0), 3)134 135 # Mostrar confianza136 if len(box) > 4:137 conf = box[4]138 cv2.putText(display_frame, f"Conf: {conf:.2f}", (x1, y1 - 10),139 cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)140 141 face_count = len(bboxes)142 status = f"Detectados: {face_count}"143 else:144 status = "No se detectaron rostros"145 146 # Dibujar información en pantalla147 h, w = display_frame.shape[:2]148 149 # Método de detección150 cv2.putText(display_frame, f"Método: {method_text}", (10, 30),151 cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2)152 153 # Estado de detección154 cv2.putText(display_frame, status, (10, 70),155 cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)156 157 # FPS158 cv2.putText(display_frame, f"FPS: {fps:.1f}", (10, h - 20),159 cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2)160 161 # Rectángulo de prueba en la esquina superior derecha162 cv2.rectangle(display_frame, (w-150, 50), (w-50, 150), (0, 0, 255), 3)163 cv2.putText(display_frame, "TEST", (w-130, 40),164 cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)165 166 # Mostrar resultado167 cv2.imshow("Prueba de Detección Facial", display_frame)168 169 # Manejo de teclas170 key = cv2.waitKey(1) & 0xFF171 172 # Salir si se presiona 'q'173 if key == ord('q'):174 break175 # Cambiar umbral si se presiona 't'176 elif key == ord('t'):177 current_threshold_index = (current_threshold_index + 1) % len(confidence_thresholds)178 current_threshold = confidence_thresholds[current_threshold_index]179 print(f"Umbral cambiado a: {current_threshold}")180 # Guardar imagen si se presiona 's'181 elif key == ord('s'):182 timestamp = time.strftime("%Y%m%d-%H%M%S")183 filename = f"face_detection_{timestamp}.jpg"184 cv2.imwrite(filename, display_frame)185 print(f"Imagen guardada como {filename}")186 187 # Imprime estadísticas188 print(f"Frames totales: {frame_count}")189 print(f"Tiempo total: {elapsed:.2f} segundos")190 print(f"FPS promedio: {fps:.1f}")191 192 # Liberar recursos193 cap.release()194 cv2.destroyAllWindows()195 196if __name__ == "__main__":197 main() 