[Feature] visualizer.draw_texts() adds a font_properties argument (#887)

* [Feature] visualizer.draw_texts() add a font_properties argument in order to show Chinese characters.

* [Fix] move font_properties argument to the end.

* Update docstring of font_properties parameter.

* [Fix] moving FontProperties import clause to draw_texts() and add TYPE_CHECKING

* Update mmengine/visualization/visualizer.py

---------

Co-authored-by: Zaida Zhou <58739961+zhouzaida@users.noreply.github.com>
pull/906/head
Kevin Wang 2023-02-03 17:05:13 +08:00 committed by GitHub
parent 1aa14b45a0
commit 4dad16fde2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 39 additions and 10 deletions

View File

@ -1,7 +1,10 @@
# Copyright (c) OpenMMLab. All rights reserved. # Copyright (c) OpenMMLab. All rights reserved.
import os.path as osp import os.path as osp
import warnings import warnings
from typing import Dict, List, Optional, Sequence, Tuple, Union from typing import TYPE_CHECKING, Dict, List, Optional, Sequence, Tuple, Union
if TYPE_CHECKING:
from matplotlib.font_manager import FontProperties
import cv2 import cv2
import numpy as np import numpy as np
@ -391,15 +394,18 @@ class Visualizer(ManagerMixin):
@master_only @master_only
def draw_texts( def draw_texts(
self, self,
texts: Union[str, List[str]], texts: Union[str, List[str]],
positions: Union[np.ndarray, torch.Tensor], positions: Union[np.ndarray, torch.Tensor],
font_sizes: Optional[Union[int, List[int]]] = None, font_sizes: Optional[Union[int, List[int]]] = None,
colors: Union[str, tuple, List[str], List[tuple]] = 'g', colors: Union[str, tuple, List[str], List[tuple]] = 'g',
vertical_alignments: Union[str, List[str]] = 'top', vertical_alignments: Union[str, List[str]] = 'top',
horizontal_alignments: Union[str, List[str]] = 'left', horizontal_alignments: Union[str, List[str]] = 'left',
font_families: Union[str, List[str]] = 'sans-serif', font_families: Union[str, List[str]] = 'sans-serif',
bboxes: Optional[Union[dict, List[dict]]] = None) -> 'Visualizer': bboxes: Optional[Union[dict, List[dict]]] = None,
font_properties: Optional[Union['FontProperties',
List['FontProperties']]] = None
) -> 'Visualizer':
"""Draw single or multiple text boxes. """Draw single or multiple text boxes.
Args: Args:
@ -448,7 +454,21 @@ class Visualizer(ManagerMixin):
the texts will have the same bbox. Reference to the texts will have the same bbox. Reference to
https://matplotlib.org/stable/api/_as_gen/matplotlib.patches.FancyBboxPatch.html#matplotlib.patches.FancyBboxPatch https://matplotlib.org/stable/api/_as_gen/matplotlib.patches.FancyBboxPatch.html#matplotlib.patches.FancyBboxPatch
for more details. Defaults to None. for more details. Defaults to None.
font_properties (Union[FontProperties, List[FontProperties]],
optional): The font properties of texts. FontProperties is
a `font_manager.FontProperties()` object.
If you want to draw Chinese texts, you need to prepare
a font file that can show Chinese characters properly.
For example: `simhei.ttf`,`simsun.ttc`,`simkai.ttf` and so on.
Then set font_properties=matplotlib.font_manager.FontProperties
(fname='path/to/font_file')
``font_properties`` can have the same length with texts or
just single value. If ``font_properties`` is single value,
all the texts will have the same font properties.
Defaults to None.
`New in version 0.6.0.`
""" """
from matplotlib.font_manager import FontProperties
check_type('texts', texts, (str, list)) check_type('texts', texts, (str, list))
if isinstance(texts, str): if isinstance(texts, str):
texts = [texts] texts = [texts]
@ -489,6 +509,14 @@ class Visualizer(ManagerMixin):
num_text) num_text)
font_families = value2list(font_families, str, num_text) font_families = value2list(font_families, str, num_text)
if font_properties is None:
font_properties = [None for _ in range(num_text)] # type: ignore
else:
check_type_and_length('font_properties', font_properties,
(FontProperties, list), num_text)
font_properties = value2list(font_properties, FontProperties,
num_text)
if bboxes is None: if bboxes is None:
bboxes = [None for _ in range(num_text)] # type: ignore bboxes = [None for _ in range(num_text)] # type: ignore
else: else:
@ -505,6 +533,7 @@ class Visualizer(ManagerMixin):
verticalalignment=vertical_alignments[i], verticalalignment=vertical_alignments[i],
horizontalalignment=horizontal_alignments[i], horizontalalignment=horizontal_alignments[i],
family=font_families[i], family=font_families[i],
fontproperties=font_properties[i],
color=colors[i]) color=colors[i])
return self return self