leonett commited on
Commit
4c40bba
verified
1 Parent(s): ee2a1ac

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +34 -28
app.py CHANGED
@@ -12,42 +12,50 @@ def procesar_video(video_path):
12
  temp_dir = f"temp_{datetime.now().strftime('%Y%m%d%H%M%S')}"
13
  os.makedirs(temp_dir, exist_ok=True)
14
 
15
- # Leer el video
16
  cap = cv2.VideoCapture(video_path)
17
- total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
 
18
 
19
- # Seleccionar 4 fotogramas aleatorios
20
- frame_indices = sorted(random.sample(range(total_frames), 4))
21
- selected_frames = []
22
-
23
- for idx in frame_indices:
24
- cap.set(cv2.CAP_PROP_POS_FRAMES, idx)
25
  ret, frame = cap.read()
26
- if ret:
27
- frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
28
- img = Image.fromarray(frame_rgb)
29
- img_path = os.path.join(temp_dir, f"frame_{idx}.jpg")
30
- img.save(img_path)
31
- selected_frames.append(img_path)
 
 
 
 
32
 
33
  cap.release()
34
 
 
 
 
 
 
 
35
  # Crear collage
36
  images = [Image.open(img) for img in selected_frames]
37
  collage = Image.new('RGB', (images[0].width * 2, images[0].height * 2))
38
 
39
- collage.paste(images[0], (0, 0))
40
- collage.paste(images[1], (images[0].width, 0))
41
- collage.paste(images[2], (0, images[0].height))
42
- collage.paste(images[3], (images[0].width, images[0].height))
 
 
43
 
44
  collage_path = os.path.join(temp_dir, "collage.jpg")
45
  collage.save(collage_path)
46
 
47
- # Crear archivo ZIP
48
  zip_path = os.path.join(temp_dir, "frames.zip")
49
  with zipfile.ZipFile(zip_path, 'w') as zipf:
50
- for img in selected_frames:
51
  zipf.write(img, os.path.basename(img))
52
 
53
  return collage_path, zip_path, temp_dir
@@ -63,7 +71,7 @@ def limpiar_cache(temp_dir):
63
 
64
  with gr.Blocks(title="Extracci贸n de Fotogramas Forenses") as demo:
65
  gr.Markdown("# Herramienta de Extracci贸n de Fotogramas Forenses")
66
- gr.Markdown("**Carga un video para extraer 4 fotogramas aleatorios y generar un collage.**")
67
  gr.Markdown("Desarrollado por Jos茅 R. Leonett para el Grupo de Peritos Forenses Digitales de Guatemala - [www.forensedigital.gt](https://www.forensedigital.gt)")
68
 
69
  with gr.Row():
@@ -72,8 +80,9 @@ with gr.Blocks(title="Extracci贸n de Fotogramas Forenses") as demo:
72
  procesar_btn = gr.Button("Procesar Fotogramas", interactive=False)
73
 
74
  with gr.Column():
75
- gallery_output = gr.Image(label="Collage de Fotogramas")
76
  download_btn = gr.Button("DESCARGAR FOTOGRAMAS", interactive=False)
 
77
 
78
  temp_dir_state = gr.State()
79
 
@@ -85,9 +94,6 @@ with gr.Blocks(title="Extracci贸n de Fotogramas Forenses") as demo:
85
  collage_path, zip_path, temp_dir = procesar_video(video)
86
  return collage_path, zip_path, temp_dir, gr.Button(interactive=True)
87
 
88
- def actualizar_descarga(temp_dir):
89
- return gr.Button(interactive=bool(temp_dir))
90
-
91
  video_input.change(
92
  fn=habilitar_procesar,
93
  inputs=video_input,
@@ -98,14 +104,14 @@ with gr.Blocks(title="Extracci贸n de Fotogramas Forenses") as demo:
98
  procesar_btn.click(
99
  fn=procesar_y_mostrar,
100
  inputs=video_input,
101
- outputs=[gallery_output, download_btn, temp_dir_state, download_btn],
102
  )
103
 
104
  download_btn.click(
105
  fn=lambda temp_dir: os.path.join(temp_dir, "frames.zip"),
106
  inputs=temp_dir_state,
107
- outputs=gr.File(label="Frames descargados"),
108
  )
109
 
110
  if __name__ == "__main__":
111
- demo.launch()
 
12
  temp_dir = f"temp_{datetime.now().strftime('%Y%m%d%H%M%S')}"
13
  os.makedirs(temp_dir, exist_ok=True)
14
 
15
+ # Leer el video y extraer TODOS los frames
16
  cap = cv2.VideoCapture(video_path)
17
+ frame_count = 0
18
+ frame_paths = []
19
 
20
+ while True:
 
 
 
 
 
21
  ret, frame = cap.read()
22
+ if not ret:
23
+ break
24
+
25
+ # Guardar cada frame
26
+ frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
27
+ img = Image.fromarray(frame_rgb)
28
+ img_path = os.path.join(temp_dir, f"frame_{frame_count:04d}.jpg")
29
+ img.save(img_path)
30
+ frame_paths.append(img_path)
31
+ frame_count += 1
32
 
33
  cap.release()
34
 
35
+ if frame_count == 0:
36
+ raise ValueError("No se pudieron extraer frames del video")
37
+
38
+ # Seleccionar 4 frames aleatorios para el collage
39
+ selected_frames = random.sample(frame_paths, min(4, len(frame_paths)))
40
+
41
  # Crear collage
42
  images = [Image.open(img) for img in selected_frames]
43
  collage = Image.new('RGB', (images[0].width * 2, images[0].height * 2))
44
 
45
+ for i, img in enumerate(images):
46
+ row = i // 2
47
+ col = i % 2
48
+ x = col * images[0].width
49
+ y = row * images[0].height
50
+ collage.paste(img, (x, y))
51
 
52
  collage_path = os.path.join(temp_dir, "collage.jpg")
53
  collage.save(collage_path)
54
 
55
+ # Crear archivo ZIP con TODOS los frames
56
  zip_path = os.path.join(temp_dir, "frames.zip")
57
  with zipfile.ZipFile(zip_path, 'w') as zipf:
58
+ for img in frame_paths:
59
  zipf.write(img, os.path.basename(img))
60
 
61
  return collage_path, zip_path, temp_dir
 
71
 
72
  with gr.Blocks(title="Extracci贸n de Fotogramas Forenses") as demo:
73
  gr.Markdown("# Herramienta de Extracci贸n de Fotogramas Forenses")
74
+ gr.Markdown("**Carga un video para extraer TODOS los fotogramas y generar un collage de muestra.**")
75
  gr.Markdown("Desarrollado por Jos茅 R. Leonett para el Grupo de Peritos Forenses Digitales de Guatemala - [www.forensedigital.gt](https://www.forensedigital.gt)")
76
 
77
  with gr.Row():
 
80
  procesar_btn = gr.Button("Procesar Fotogramas", interactive=False)
81
 
82
  with gr.Column():
83
+ gallery_output = gr.Image(label="Collage de Muestra")
84
  download_btn = gr.Button("DESCARGAR FOTOGRAMAS", interactive=False)
85
+ download_file = gr.File(label="Archivo ZIP generado", visible=False)
86
 
87
  temp_dir_state = gr.State()
88
 
 
94
  collage_path, zip_path, temp_dir = procesar_video(video)
95
  return collage_path, zip_path, temp_dir, gr.Button(interactive=True)
96
 
 
 
 
97
  video_input.change(
98
  fn=habilitar_procesar,
99
  inputs=video_input,
 
104
  procesar_btn.click(
105
  fn=procesar_y_mostrar,
106
  inputs=video_input,
107
+ outputs=[gallery_output, download_file, temp_dir_state, download_btn],
108
  )
109
 
110
  download_btn.click(
111
  fn=lambda temp_dir: os.path.join(temp_dir, "frames.zip"),
112
  inputs=temp_dir_state,
113
+ outputs=download_file,
114
  )
115
 
116
  if __name__ == "__main__":
117
+ demo.launch()