#
#   python_llm_foto_emociones.py
#
#   Captura una foto con la Webcam y analiza la emoción del rostro usando un Modelo de Lenguaje para Visión
#
#   Rogelio Ferreira Escutia - junio 2026
#

# Bibliotecas a importar
import cv2
import time
import os
import ollama

# Nombre del archivo temporal
TEMP_IMAGE_PATH = "temp_capture.jpg"

# Modelo a utilizar
MODEL_NAME = "gemma3:4b"

# Accesa a la cámara para ajustar la iluminación y tomar una foto
def capture_image():
    print("[System] Inicializando Webcam...")
    # 0 es usado noralmente el USB por default para la cámara
    cap = cv2.VideoCapture(0)
    if not cap.isOpened():
        print("[Error] No se puede accesar a la cámara!")
        return False
    print("[System] Capturando Fotografía...")
    # Lee algunos frames para que que la Webcam ajuste la luz
    #   balance y exposición antes de tomar la foto
    for _ in range(10):
        cap.read()
        time.sleep(0.1)
    ret, frame = cap.read()
    cap.release()
    if ret:
        cv2.imwrite(TEMP_IMAGE_PATH, frame)
        print("[System] Foto capturada y almacenada!")
        return True
    else:
        print("[Error] Falla al tratar de leer un Frame de la Webcam!")
        return False

# Envía la imagen capturada a un Modelo de Procesamiento de Visión por Computadora
def analyze_emotion():    
    # Se configura que el Modelos solo conteste con el nombre de la emociónname
    prompt = (
        "Analyze the facial expression of the person in this image. "
        "Which of the following basic emotions are they exhibiting? "
        "1) Joy, 2) Sadness, 3) Anger, 4) Surprise, 5) Fear, 6) Dislike. "
        "Reply ONLY with the exact name of the emotion from the list and nothing else."
    )
    print(f"[Ollama] Enviando imagen a {MODEL_NAME} para su análisis...")
    print("[System] Por favor esperar, procesando...")
    try:
        # La librería de Ollama para Python acepta la ruta del archivo directo en el arreglo 'images'
        response = ollama.chat(
            model=MODEL_NAME,
            messages=[{
                'role': 'user',
                'content': prompt,
                'images': [TEMP_IMAGE_PATH]
            }]
        )
        emotion = response['message']['content'].strip()
        print("\n" + "="*30)
        print(f" Emoción Detectada: {emotion}")
        print("="*30 + "\n")
    except Exception as e:
        print(f"[Error] Error de comunicación con Ollama: {e}")

def main():
    print("Detector de Emociones")
    if capture_image():
        analyze_emotion()
    # Borra la imagen temporal
    if os.path.exists(TEMP_IMAGE_PATH):
        os.remove(TEMP_IMAGE_PATH)
        print("[System] Imagen temporal borrada.")

if __name__ == "__main__":
    main()