from .base import CensoringMethod from PIL import Image, ImageDraw, ImageFont import numpy as np import cv2 class TextCensor(CensoringMethod): def __init__(self, text, font="arial.ttf", scale_factor=0.5, text_color="white", background_color=None, draw_background=True): self.text = text self.font_path = font self.scale_factor = scale_factor self.text_color = text_color self.background_color = background_color self.draw_background = draw_background def apply(self, frame, bbox): x1, y1, x2, y2 = bbox[:4] center_x = (x1 + x2) // 2 center_y = (y1 + y2) // 2 font_size = int(max(x2-x1, y2-y1) * self.scale_factor) try: font = ImageFont.truetype(self.font_path, font_size) except OSError as e: raise ValueError(f"Could not open file at {self.font_path}") rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) pil_frame = Image.fromarray(rgb_frame) draw = ImageDraw.Draw(pil_frame) if self.draw_background and self.background_color: draw.rectangle([x1, y1, x2, y2], fill=self.background_color) self.draw_overlay(draw, center_x, center_y, font) out_image = cv2.cvtColor(np.array(pil_frame), cv2.COLOR_RGB2BGR) return out_image def draw_overlay(self, draw, x, y, font): draw.text( xy=(x, y), text=self.text, anchor="mm", font=font, fill=self.text_color )