Spaces:
Running
Running
| import cv2 | |
| import random | |
| import math | |
| import numpy as np | |
| from PIL import Image, ImageDraw, ImageFont | |
| __all__ = ["draw_system", "draw_det"] | |
| def draw_det(dt_boxes, img): | |
| for box in dt_boxes: | |
| box = np.array(box).astype(np.int32).reshape(-1, 2) | |
| cv2.polylines(img, [box], True, color=(255, 255, 0), thickness=2) | |
| return img | |
| def draw_system( | |
| image, | |
| boxes, | |
| txts=None, | |
| scores=None, | |
| drop_score=0.5, | |
| font_path="./doc/fonts/simfang.ttf", ): | |
| h, w = image.height, image.width | |
| img_left = image.copy() | |
| img_right = np.ones((h, w, 3), dtype=np.uint8) * 255 | |
| random.seed(0) | |
| draw_left = ImageDraw.Draw(img_left) | |
| if txts is None or len(txts) != len(boxes): | |
| txts = [None] * len(boxes) | |
| for idx, (box, txt) in enumerate(zip(boxes, txts)): | |
| if scores is not None and scores[idx] < drop_score: | |
| continue | |
| color = (random.randint(0, 255), random.randint(0, 255), | |
| random.randint(0, 255)) | |
| draw_left.polygon(box, fill=color) | |
| img_right_text = draw_box_txt_fine((w, h), box, txt, font_path) | |
| pts = np.array(box, np.int32).reshape((-1, 1, 2)) | |
| cv2.polylines(img_right_text, [pts], True, color, 1) | |
| img_right = cv2.bitwise_and(img_right, img_right_text) | |
| img_left = Image.blend(image, img_left, 0.5) | |
| img_show = Image.new("RGB", (w * 2, h), (255, 255, 255)) | |
| img_show.paste(img_left, (0, 0, w, h)) | |
| img_show.paste(Image.fromarray(img_right), (w, 0, w * 2, h)) | |
| return np.array(img_show) | |
| def draw_box_txt_fine(img_size, box, txt, font_path="./doc/fonts/simfang.ttf"): | |
| box_height = int( | |
| math.sqrt((box[0][0] - box[3][0])**2 + (box[0][1] - box[3][1])**2)) | |
| box_width = int( | |
| math.sqrt((box[0][0] - box[1][0])**2 + (box[0][1] - box[1][1])**2)) | |
| if box_height > 2 * box_width and box_height > 30: | |
| img_text = Image.new("RGB", (box_height, box_width), (255, 255, 255)) | |
| draw_text = ImageDraw.Draw(img_text) | |
| if txt: | |
| font = create_font(txt, (box_height, box_width), font_path) | |
| draw_text.text([0, 0], txt, fill=(0, 0, 0), font=font) | |
| img_text = img_text.transpose(Image.ROTATE_270) | |
| else: | |
| img_text = Image.new("RGB", (box_width, box_height), (255, 255, 255)) | |
| draw_text = ImageDraw.Draw(img_text) | |
| if txt: | |
| font = create_font(txt, (box_width, box_height), font_path) | |
| draw_text.text([0, 0], txt, fill=(0, 0, 0), font=font) | |
| pts1 = np.float32( | |
| [[0, 0], [box_width, 0], [box_width, box_height], [0, box_height]]) | |
| pts2 = np.array(box, dtype=np.float32) | |
| M = cv2.getPerspectiveTransform(pts1, pts2) | |
| img_text = np.array(img_text, dtype=np.uint8) | |
| img_right_text = cv2.warpPerspective( | |
| img_text, | |
| M, | |
| img_size, | |
| flags=cv2.INTER_NEAREST, | |
| borderMode=cv2.BORDER_CONSTANT, | |
| borderValue=(255, 255, 255), ) | |
| return img_right_text | |
| def create_font(txt, sz, font_path="./doc/fonts/simfang.ttf"): | |
| font_size = int(sz[1] * 0.99) | |
| font = ImageFont.truetype(font_path, font_size, encoding="utf-8") | |
| length = font.getlength(txt) | |
| if length > sz[0]: | |
| font_size = int(font_size * sz[0] / length) | |
| font = ImageFont.truetype(font_path, font_size, encoding="utf-8") | |
| return font | |
| def str_count(s): | |
| """ | |
| Count the number of Chinese characters, | |
| a single English character and a single number | |
| equal to half the length of Chinese characters. | |
| args: | |
| s(string): the input of string | |
| return(int): | |
| the number of Chinese characters | |
| """ | |
| import string | |
| count_zh = count_pu = 0 | |
| s_len = len(s) | |
| en_dg_count = 0 | |
| for c in s: | |
| if c in string.ascii_letters or c.isdigit() or c.isspace(): | |
| en_dg_count += 1 | |
| elif c.isalpha(): | |
| count_zh += 1 | |
| else: | |
| count_pu += 1 | |
| return s_len - math.ceil(en_dg_count / 2) | |