import cv2 def calcula_escala_font(texto, font, thickness_base, ancho_frame, margin): # Medimos a escala 1.0 (w_texto, _), _ = cv2.getTextSize(texto, font, 1.0, thickness_base) # Ajustamos la escala para que el texto + 2*margin entre en el frame escala = (ancho_frame - 1*margin) / w_texto return escala # Parámetros video_path = "./video.mp4" cap = cv2.VideoCapture(video_path) fps = cap.get(cv2.CAP_PROP_FPS) w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fourcc = cv2.VideoWriter_fourcc(*"mp4v") out = cv2.VideoWriter("video_con_margen.mp4", fourcc, fps, (w, h)) texto = "Hola Hola" font = cv2.FONT_HERSHEY_SIMPLEX thickness_base = 2 # 1) Espacio al borde del vídeo margin_video = 100 # 2) Padding interno del rectángulo al texto pad_text = 20 # Calcula escala y grosor fontScale = calcula_escala_font(texto, font, thickness_base, w, margin_video) thickness = max(1, int(thickness_base * fontScale)) # Recalculamos tamaño del texto y coordenadas (text_w, text_h), baseline = cv2.getTextSize(texto, font, fontScale, thickness) # Centrado (toma en cuenta sólo el ancho disponible: w - 2*margin_video) x = margin_video + ((w - 2*margin_video) - text_w) // 2 y = (h + text_h) // 2 while True: ret, frame = cap.read() if not ret: break t = cap.get(cv2.CAP_PROP_POS_MSEC) / 1000.0 if 0.0 <= t <= 5.0: # Fondo negro (usa pad_text para el interior) tl = (x - pad_text, y - text_h - baseline - pad_text) br = (x + text_w + pad_text, y + baseline + pad_text) cv2.rectangle(frame, tl, br, (0,0,0), cv2.FILLED) # Texto centrado dentro del rectángulo cv2.putText(frame, texto, (x, y), font, fontScale, (255,255,255), thickness, cv2.LINE_AA) out.write(frame) cap.release() out.release() print("✓ Vídeo generado como video_con_margen.mp4")