123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- # copyright (c) 2021 PaddlePaddle Authors. All Rights Reserve.
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
- # You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software
- # distributed under the License is distributed on an "AS IS" BASIS,
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- # See the License for the specific language governing permissions and
- # limitations under the License.
- import cv2
- import os
- import numpy as np
- from PIL import Image, ImageDraw, ImageFont
- def draw_ser_results(image,
- ocr_results,
- font_path="doc/fonts/simfang.ttf",
- font_size=14):
- np.random.seed(2021)
- color = (np.random.permutation(range(255)),
- np.random.permutation(range(255)),
- np.random.permutation(range(255)))
- color_map = {
- idx: (color[0][idx], color[1][idx], color[2][idx])
- for idx in range(1, 255)
- }
- if isinstance(image, np.ndarray):
- image = Image.fromarray(image)
- elif isinstance(image, str) and os.path.isfile(image):
- image = Image.open(image).convert('RGB')
- img_new = image.copy()
- draw = ImageDraw.Draw(img_new)
- font = ImageFont.truetype(font_path, font_size, encoding="utf-8")
- for ocr_info in ocr_results:
- if ocr_info["pred_id"] not in color_map:
- continue
- color = color_map[ocr_info["pred_id"]]
- text = "{}: {}".format(ocr_info["pred"], ocr_info["transcription"])
- if "bbox" in ocr_info:
- # draw with ocr engine
- bbox = ocr_info["bbox"]
- else:
- # draw with ocr groundtruth
- bbox = trans_poly_to_bbox(ocr_info["points"])
- draw_box_txt(bbox, text, draw, font, font_size, color)
- img_new = Image.blend(image, img_new, 0.7)
- return np.array(img_new)
- def draw_box_txt(bbox, text, draw, font, font_size, color):
- # draw ocr results outline
- bbox = ((bbox[0], bbox[1]), (bbox[2], bbox[3]))
- draw.rectangle(bbox, fill=color)
- # draw ocr results
- tw = font.getsize(text)[0]
- th = font.getsize(text)[1]
- start_y = max(0, bbox[0][1] - th)
- draw.rectangle(
- [(bbox[0][0] + 1, start_y), (bbox[0][0] + tw + 1, start_y + th)],
- fill=(0, 0, 255))
- draw.text((bbox[0][0] + 1, start_y), text, fill=(255, 255, 255), font=font)
- def trans_poly_to_bbox(poly):
- x1 = np.min([p[0] for p in poly])
- x2 = np.max([p[0] for p in poly])
- y1 = np.min([p[1] for p in poly])
- y2 = np.max([p[1] for p in poly])
- return [x1, y1, x2, y2]
- def draw_re_results(image,
- result,
- font_path="doc/fonts/simfang.ttf",
- font_size=18):
- np.random.seed(0)
- if isinstance(image, np.ndarray):
- image = Image.fromarray(image)
- elif isinstance(image, str) and os.path.isfile(image):
- image = Image.open(image).convert('RGB')
- img_new = image.copy()
- draw = ImageDraw.Draw(img_new)
- font = ImageFont.truetype(font_path, font_size, encoding="utf-8")
- color_head = (0, 0, 255)
- color_tail = (255, 0, 0)
- color_line = (0, 255, 0)
- for ocr_info_head, ocr_info_tail in result:
- draw_box_txt(ocr_info_head["bbox"], ocr_info_head["transcription"],
- draw, font, font_size, color_head)
- draw_box_txt(ocr_info_tail["bbox"], ocr_info_tail["transcription"],
- draw, font, font_size, color_tail)
- center_head = (
- (ocr_info_head['bbox'][0] + ocr_info_head['bbox'][2]) // 2,
- (ocr_info_head['bbox'][1] + ocr_info_head['bbox'][3]) // 2)
- center_tail = (
- (ocr_info_tail['bbox'][0] + ocr_info_tail['bbox'][2]) // 2,
- (ocr_info_tail['bbox'][1] + ocr_info_tail['bbox'][3]) // 2)
- draw.line([center_head, center_tail], fill=color_line, width=5)
- img_new = Image.blend(image, img_new, 0.5)
- return np.array(img_new)
- def draw_rectangle(img_path, boxes):
- boxes = np.array(boxes)
- img = cv2.imread(img_path)
- img_show = img.copy()
- for box in boxes.astype(int):
- x1, y1, x2, y2 = box
- cv2.rectangle(img_show, (x1, y1), (x2, y2), (255, 0, 0), 2)
- return img_show
|