| | |
| | import cv2 |
| | import numpy as np |
| |
|
| | from annotator.uniformer.mmcv.image import imread, imwrite |
| | from .color import color_val |
| |
|
| |
|
| | def imshow(img, win_name='', wait_time=0): |
| | """Show an image. |
| | |
| | Args: |
| | img (str or ndarray): The image to be displayed. |
| | win_name (str): The window name. |
| | wait_time (int): Value of waitKey param. |
| | """ |
| | cv2.imshow(win_name, imread(img)) |
| | if wait_time == 0: |
| | while True: |
| | ret = cv2.waitKey(1) |
| |
|
| | closed = cv2.getWindowProperty(win_name, cv2.WND_PROP_VISIBLE) < 1 |
| | |
| | if closed or ret != -1: |
| | break |
| | else: |
| | ret = cv2.waitKey(wait_time) |
| |
|
| |
|
| | def imshow_bboxes(img, |
| | bboxes, |
| | colors='green', |
| | top_k=-1, |
| | thickness=1, |
| | show=True, |
| | win_name='', |
| | wait_time=0, |
| | out_file=None): |
| | """Draw bboxes on an image. |
| | |
| | Args: |
| | img (str or ndarray): The image to be displayed. |
| | bboxes (list or ndarray): A list of ndarray of shape (k, 4). |
| | colors (list[str or tuple or Color]): A list of colors. |
| | top_k (int): Plot the first k bboxes only if set positive. |
| | thickness (int): Thickness of lines. |
| | show (bool): Whether to show the image. |
| | win_name (str): The window name. |
| | wait_time (int): Value of waitKey param. |
| | out_file (str, optional): The filename to write the image. |
| | |
| | Returns: |
| | ndarray: The image with bboxes drawn on it. |
| | """ |
| | img = imread(img) |
| | img = np.ascontiguousarray(img) |
| |
|
| | if isinstance(bboxes, np.ndarray): |
| | bboxes = [bboxes] |
| | if not isinstance(colors, list): |
| | colors = [colors for _ in range(len(bboxes))] |
| | colors = [color_val(c) for c in colors] |
| | assert len(bboxes) == len(colors) |
| |
|
| | for i, _bboxes in enumerate(bboxes): |
| | _bboxes = _bboxes.astype(np.int32) |
| | if top_k <= 0: |
| | _top_k = _bboxes.shape[0] |
| | else: |
| | _top_k = min(top_k, _bboxes.shape[0]) |
| | for j in range(_top_k): |
| | left_top = (_bboxes[j, 0], _bboxes[j, 1]) |
| | right_bottom = (_bboxes[j, 2], _bboxes[j, 3]) |
| | cv2.rectangle( |
| | img, left_top, right_bottom, colors[i], thickness=thickness) |
| |
|
| | if show: |
| | imshow(img, win_name, wait_time) |
| | if out_file is not None: |
| | imwrite(img, out_file) |
| | return img |
| |
|
| |
|
| | def imshow_det_bboxes(img, |
| | bboxes, |
| | labels, |
| | class_names=None, |
| | score_thr=0, |
| | bbox_color='green', |
| | text_color='green', |
| | thickness=1, |
| | font_scale=0.5, |
| | show=True, |
| | win_name='', |
| | wait_time=0, |
| | out_file=None): |
| | """Draw bboxes and class labels (with scores) on an image. |
| | |
| | Args: |
| | img (str or ndarray): The image to be displayed. |
| | bboxes (ndarray): Bounding boxes (with scores), shaped (n, 4) or |
| | (n, 5). |
| | labels (ndarray): Labels of bboxes. |
| | class_names (list[str]): Names of each classes. |
| | score_thr (float): Minimum score of bboxes to be shown. |
| | bbox_color (str or tuple or :obj:`Color`): Color of bbox lines. |
| | text_color (str or tuple or :obj:`Color`): Color of texts. |
| | thickness (int): Thickness of lines. |
| | font_scale (float): Font scales of texts. |
| | show (bool): Whether to show the image. |
| | win_name (str): The window name. |
| | wait_time (int): Value of waitKey param. |
| | out_file (str or None): The filename to write the image. |
| | |
| | Returns: |
| | ndarray: The image with bboxes drawn on it. |
| | """ |
| | assert bboxes.ndim == 2 |
| | assert labels.ndim == 1 |
| | assert bboxes.shape[0] == labels.shape[0] |
| | assert bboxes.shape[1] == 4 or bboxes.shape[1] == 5 |
| | img = imread(img) |
| | img = np.ascontiguousarray(img) |
| |
|
| | if score_thr > 0: |
| | assert bboxes.shape[1] == 5 |
| | scores = bboxes[:, -1] |
| | inds = scores > score_thr |
| | bboxes = bboxes[inds, :] |
| | labels = labels[inds] |
| |
|
| | bbox_color = color_val(bbox_color) |
| | text_color = color_val(text_color) |
| |
|
| | for bbox, label in zip(bboxes, labels): |
| | bbox_int = bbox.astype(np.int32) |
| | left_top = (bbox_int[0], bbox_int[1]) |
| | right_bottom = (bbox_int[2], bbox_int[3]) |
| | cv2.rectangle( |
| | img, left_top, right_bottom, bbox_color, thickness=thickness) |
| | label_text = class_names[ |
| | label] if class_names is not None else f'cls {label}' |
| | if len(bbox) > 4: |
| | label_text += f'|{bbox[-1]:.02f}' |
| | cv2.putText(img, label_text, (bbox_int[0], bbox_int[1] - 2), |
| | cv2.FONT_HERSHEY_COMPLEX, font_scale, text_color) |
| |
|
| | if show: |
| | imshow(img, win_name, wait_time) |
| | if out_file is not None: |
| | imwrite(img, out_file) |
| | return img |
| |
|