jarondon82 commited on
Commit
9077361
·
1 Parent(s): c2a7084

Implementar visualización en tiempo real de la detección de rostros dentro del componente JavaScript

Browse files
Files changed (1) hide show
  1. streamlit_app.py +46 -1
streamlit_app.py CHANGED
@@ -14,6 +14,7 @@ from sklearn.metrics.pairwise import cosine_similarity # type: ignore
14
  import pandas as pd
15
  import av
16
  from streamlit_webrtc import webrtc_streamer, VideoProcessorBase, RTCConfiguration, WebRtcMode
 
17
 
18
  # Importar las utilidades para la base de datos de rostros
19
  try:
@@ -2432,11 +2433,14 @@ def main():
2432
  <div style="margin-bottom: 20px;">
2433
  <video id="webcam" autoplay playsinline width="640" height="480" style="border-radius: 5px;"></video>
2434
  <canvas id="canvas" width="640" height="480" style="display: none;"></canvas>
 
2435
  </div>
2436
  <script>
2437
  const video = document.getElementById('webcam');
2438
  const canvas = document.getElementById('canvas');
 
2439
  const ctx = canvas.getContext('2d');
 
2440
  let captureInterval;
2441
 
2442
  // Configuración dinámica del FPS (desde Streamlit)
@@ -2473,6 +2477,9 @@ def main():
2473
  // Dibujar el video en el canvas
2474
  ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
2475
 
 
 
 
2476
  // Convertir a base64
2477
  const imageData = canvas.toDataURL('image/jpeg', 0.8);
2478
 
@@ -2484,6 +2491,34 @@ def main():
2484
  }
2485
  }
2486
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2487
  // Arrancar todo
2488
  async function initCapture() {
2489
  await setupCamera();
@@ -2537,12 +2572,22 @@ def main():
2537
  # Calcular FPS real (actualizar cada segundo)
2538
  current_time = time.time()
2539
  elapsed = current_time - st.session_state.start_time
2540
-
2541
  if current_time - st.session_state.last_fps_update >= 1.0:
2542
  fps = st.session_state.frames_processed / elapsed
2543
  fps_metric.metric("FPS", f"{fps:.1f}")
2544
  st.session_state.last_fps_update = current_time
2545
 
 
 
 
 
 
 
 
 
 
 
 
2546
  # Dibujar resultados
2547
  result_img = image.copy()
2548
  for i, bbox in enumerate(bboxes):
 
14
  import pandas as pd
15
  import av
16
  from streamlit_webrtc import webrtc_streamer, VideoProcessorBase, RTCConfiguration, WebRtcMode
17
+ import json
18
 
19
  # Importar las utilidades para la base de datos de rostros
20
  try:
 
2433
  <div style="margin-bottom: 20px;">
2434
  <video id="webcam" autoplay playsinline width="640" height="480" style="border-radius: 5px;"></video>
2435
  <canvas id="canvas" width="640" height="480" style="display: none;"></canvas>
2436
+ <canvas id="display" width="640" height="480" style="border-radius: 5px; display: block; margin: 0 auto;"></canvas>
2437
  </div>
2438
  <script>
2439
  const video = document.getElementById('webcam');
2440
  const canvas = document.getElementById('canvas');
2441
+ const display = document.getElementById('display');
2442
  const ctx = canvas.getContext('2d');
2443
+ const displayCtx = display.getContext('2d');
2444
  let captureInterval;
2445
 
2446
  // Configuración dinámica del FPS (desde Streamlit)
 
2477
  // Dibujar el video en el canvas
2478
  ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
2479
 
2480
+ // Mostrar el video en el canvas de visualización
2481
+ displayCtx.drawImage(video, 0, 0, display.width, display.height);
2482
+
2483
  // Convertir a base64
2484
  const imageData = canvas.toDataURL('image/jpeg', 0.8);
2485
 
 
2491
  }
2492
  }
2493
 
2494
+ // Recibir datos de detección de rostros y dibujarlos
2495
+ window.addEventListener('message', function(event) {
2496
+ const message = event.data;
2497
+
2498
+ // Verificar si es un mensaje con cajas de rostros
2499
+ if (message && message.type === 'faceBoxes') {
2500
+ const boxes = message.boxes;
2501
+
2502
+ // Limpiar el canvas y dibujar el frame actual
2503
+ displayCtx.drawImage(video, 0, 0, display.width, display.height);
2504
+
2505
+ // Dibujar cada caja
2506
+ boxes.forEach(box => {
2507
+ const [x1, y1, x2, y2, confidence] = box;
2508
+
2509
+ // Dibujar rectángulo
2510
+ displayCtx.strokeStyle = '#00FF00';
2511
+ displayCtx.lineWidth = 2;
2512
+ displayCtx.strokeRect(x1, y1, x2-x1, y2-y1);
2513
+
2514
+ // Dibujar etiqueta
2515
+ displayCtx.fillStyle = '#00FF00';
2516
+ displayCtx.font = '16px Arial';
2517
+ displayCtx.fillText(`Rostro: ${confidence.toFixed(2)}`, x1, y1-5);
2518
+ });
2519
+ }
2520
+ });
2521
+
2522
  // Arrancar todo
2523
  async function initCapture() {
2524
  await setupCamera();
 
2572
  # Calcular FPS real (actualizar cada segundo)
2573
  current_time = time.time()
2574
  elapsed = current_time - st.session_state.start_time
 
2575
  if current_time - st.session_state.last_fps_update >= 1.0:
2576
  fps = st.session_state.frames_processed / elapsed
2577
  fps_metric.metric("FPS", f"{fps:.1f}")
2578
  st.session_state.last_fps_update = current_time
2579
 
2580
+ # Enviar las cajas detectadas al componente JavaScript para dibujarlas en tiempo real
2581
+ face_boxes_js = f"""
2582
+ <script>
2583
+ window.parent.postMessage({{
2584
+ type: 'faceBoxes',
2585
+ boxes: {json.dumps(bboxes.tolist() if isinstance(bboxes, np.ndarray) else bboxes)}
2586
+ }}, '*');
2587
+ </script>
2588
+ """
2589
+ st.components.v1.html(face_boxes_js, height=0, width=0)
2590
+
2591
  # Dibujar resultados
2592
  result_img = image.copy()
2593
  for i, bbox in enumerate(bboxes):