feature: Add GNU/Linux and MacOS support

This commit is contained in:
2026-01-22 19:48:42 +01:00
parent 33930b0e79
commit 694ccc0edb

View File

@@ -14,6 +14,8 @@ import time
import math import math
import numpy as np import numpy as np
import json import json
import platform
import sys
# =========================== # ===========================
# CONFIGURACIÓN # CONFIGURACIÓN
@@ -45,6 +47,15 @@ BG_COLOR = "#282c34"
TEXT_COLOR = "#abb2bf" TEXT_COLOR = "#abb2bf"
ACCENT_COLOR = "#61afef" ACCENT_COLOR = "#61afef"
# Cross-platform video backend
V_BACKEND = cv2.CAP_ANY
if platform.system() == "Windows":
V_BACKEND = cv2.CAP_DSHOW
elif platform.system() == "Darwin": # macOS
V_BACKEND = cv2.CAP_AVFOUNDATION
elif platform.system() == "Linux":
V_BACKEND = cv2.CAP_V4L2
# =========================== # ===========================
# CLASES DE UTILIDAD # CLASES DE UTILIDAD
# =========================== # ===========================
@@ -550,12 +561,12 @@ class App:
self.btn_graph = tk.Button(self.controls_frame, text="Generar Gráfico", command=generate_graph, bg="#98c379", fg="black", font=("Helvetica", 10)) self.btn_graph = tk.Button(self.controls_frame, text="Generar Gráfico", command=generate_graph, bg="#98c379", fg="black", font=("Helvetica", 10))
self.btn_graph.pack(side="left", padx=5) self.btn_graph.pack(side="left", padx=5)
self.log_text = scrolledtext.ScrolledText(window, height=8, bg="#21252b", fg="white", font=("Consolas", 9)) self.log_text = scrolledtext.ScrolledText(window, height=8, bg="#21252b", fg="white", font=("Courier", 9) if platform.system() != "Windows" else ("Consolas", 9))
self.log_text.pack(fill="x", padx=10, pady=5) self.log_text.pack(fill="x", padx=10, pady=5)
# Logic # Logic
# Usamos CAP_DSHOW en Windows para compatibilidad "Universal" (Mejor acceso a ajustes) # Usamos el backend apropiado según el sistema operativo
self.cap = cv2.VideoCapture(0, cv2.CAP_DSHOW) self.cap = cv2.VideoCapture(0, V_BACKEND)
# Configurar 1080p por defecto # Configurar 1080p por defecto
self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920) self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080) self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)
@@ -830,8 +841,8 @@ class App:
if self.cap.isOpened(): if self.cap.isOpened():
self.cap.release() self.cap.release()
# Reabrir con DirectShow para mantener compatibilidad universal # Reabrir con el backend apropiado
self.cap = cv2.VideoCapture(0, cv2.CAP_DSHOW) self.cap = cv2.VideoCapture(0, V_BACKEND)
self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, width) self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)
self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height) self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
@@ -1012,7 +1023,7 @@ class App:
try: try:
if self.cap.isOpened(): if self.cap.isOpened():
self.cap.release() self.cap.release()
self.cap = cv2.VideoCapture(0, cv2.CAP_DSHOW) self.cap = cv2.VideoCapture(0, V_BACKEND)
self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920) self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080) self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)
except: except: