""Espectrograma desde webcam
""Joaquín Paredes www.jopapa.me y IA Copilot
import cv2
import numpy as np
import matplotlib.pyplot as plt

def wavelength_to_rgb(wavelength):
    """Convierte longitudes de onda (nm) a colores RGB aproximados."""
    if 380 <= wavelength < 440:
        R = -(wavelength - 440) / (440 - 380)
        G = 0.0
        B = 1.0
    elif 440 <= wavelength < 490:
        R = 0.0
        G = (wavelength - 440) / (490 - 440)
        B = 1.0
    elif 490 <= wavelength < 510:
        R = 0.0
        G = 1.0
        B = -(wavelength - 510) / (510 - 490)
    elif 510 <= wavelength < 580:
        R = (wavelength - 510) / (580 - 510)
        G = 1.0
        B = 0.0
    elif 580 <= wavelength < 645:
        R = 1.0
        G = -(wavelength - 645) / (645 - 580)
        B = 0.0
    elif 645 <= wavelength <= 750:
        R = 1.0
        G = 0.0
        B = 0.0
    else:
        R = G = B = 0.0

    R = int(R * 255)
    G = int(G * 255)
    B = int(B * 255)

    return R, G, B

def process_frame(frame):
    """Promedia el espectro en una imagen y calcula intensidades."""
    avg_color = np.mean(frame, axis=0)  # Promedio a lo largo de las filas
    intensity = np.mean(avg_color, axis=1)  # Intensidad promedio por columna
    return avg_color.astype('uint8'), intensity


# Configura captura de video
cap = cv2.VideoCapture(0)

if not cap.isOpened():
    print("Error al abrir la webcam.")
    exit() 

print("Presiona 'q' para salir.")
plt.figure(figsize=(15, 5))
while True:
    ret, frame = cap.read()
    if not ret:
        print("Error al capturar el video.")
        break

    # Procesa cada cuadro de video
    avg_color, intensity = process_frame(frame)

    # Visualización del espectro
    wavelengths = np.linspace(330, 800, avg_color.shape[0])
    colors = [wavelength_to_rgb(w) for w in wavelengths]
    
    plt.grid()
    plt.imshow([colors], extent=[390, 720, 0, 1], aspect='auto') 
    plt.plot(wavelengths, intensity, color='black', linewidth=2)
    plt.title("Intensidad de cada longitud de onda")
    plt.xlabel("Longitud de onda (nm)")
    plt.ylabel("Intensidad")
    plt.tight_layout()
    plt.pause(0.1)  # Actualiza la gráfica sin detenerse
    plt.clf()

    # Muestra el video en vivo
    cv2.imshow("Video en Vivo", frame)
    # Salir con la tecla 'q'
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()
