generated from roboflow/template-python
-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #50 from roboflow/feature/drop_requirement_for_cla…
…ss_id_in_detections feature/drop_requirement_for_class_id_in_detections
- Loading branch information
Showing
7 changed files
with
144 additions
and
124 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
## BoxAnnotator | ||
|
||
:::supervision.detection.annotate.BoxAnnotator |
File renamed without changes.
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
from typing import List, Optional, Union | ||
|
||
import cv2 | ||
import numpy as np | ||
|
||
from supervision.detection.core import Detections | ||
from supervision.draw.color import Color, ColorPalette | ||
|
||
|
||
class BoxAnnotator: | ||
""" | ||
A class for drawing bounding boxes on an image using detections provided. | ||
Attributes: | ||
color (Union[Color, ColorPalette]): The color to draw the bounding box, can be a single color or a color palette | ||
thickness (int): The thickness of the bounding box lines, default is 2 | ||
text_color (Color): The color of the text on the bounding box, default is white | ||
text_scale (float): The scale of the text on the bounding box, default is 0.5 | ||
text_thickness (int): The thickness of the text on the bounding box, default is 1 | ||
text_padding (int): The padding around the text on the bounding box, default is 5 | ||
""" | ||
|
||
def __init__( | ||
self, | ||
color: Union[Color, ColorPalette] = ColorPalette.default(), | ||
thickness: int = 2, | ||
text_color: Color = Color.black(), | ||
text_scale: float = 0.5, | ||
text_thickness: int = 1, | ||
text_padding: int = 10, | ||
): | ||
self.color: Union[Color, ColorPalette] = color | ||
self.thickness: int = thickness | ||
self.text_color: Color = text_color | ||
self.text_scale: float = text_scale | ||
self.text_thickness: int = text_thickness | ||
self.text_padding: int = text_padding | ||
|
||
def annotate( | ||
self, | ||
scene: np.ndarray, | ||
detections: Detections, | ||
labels: Optional[List[str]] = None, | ||
skip_label: bool = False, | ||
) -> np.ndarray: | ||
""" | ||
Draws bounding boxes on the frame using the detections provided. | ||
Parameters: | ||
scene (np.ndarray): The image on which the bounding boxes will be drawn | ||
detections (Detections): The detections for which the bounding boxes will be drawn | ||
labels (Optional[List[str]]): An optional list of labels corresponding to each detection. If labels is provided, the confidence score of the detection will be replaced with the label. | ||
skip_label (bool): Is set to True, skips bounding box label annotation. | ||
Returns: | ||
np.ndarray: The image with the bounding boxes drawn on it | ||
""" | ||
font = cv2.FONT_HERSHEY_SIMPLEX | ||
for i, (xyxy, confidence, class_id, tracker_id) in enumerate(detections): | ||
x1, y1, x2, y2 = xyxy.astype(int) | ||
idx = class_id if class_id is not None else i | ||
color = ( | ||
self.color.by_idx(idx) | ||
if isinstance(self.color, ColorPalette) | ||
else self.color | ||
) | ||
cv2.rectangle( | ||
img=scene, | ||
pt1=(x1, y1), | ||
pt2=(x2, y2), | ||
color=color.as_bgr(), | ||
thickness=self.thickness, | ||
) | ||
if skip_label: | ||
continue | ||
|
||
text = ( | ||
f"{class_id}" | ||
if (labels is None or len(detections) != len(labels)) | ||
else labels[i] | ||
) | ||
|
||
text_width, text_height = cv2.getTextSize( | ||
text=text, | ||
fontFace=font, | ||
fontScale=self.text_scale, | ||
thickness=self.text_thickness, | ||
)[0] | ||
|
||
text_x = x1 + self.text_padding | ||
text_y = y1 - self.text_padding | ||
|
||
text_background_x1 = x1 | ||
text_background_y1 = y1 - 2 * self.text_padding - text_height | ||
|
||
text_background_x2 = x1 + 2 * self.text_padding + text_width | ||
text_background_y2 = y1 | ||
|
||
cv2.rectangle( | ||
img=scene, | ||
pt1=(text_background_x1, text_background_y1), | ||
pt2=(text_background_x2, text_background_y2), | ||
color=color.as_bgr(), | ||
thickness=cv2.FILLED, | ||
) | ||
cv2.putText( | ||
img=scene, | ||
text=text, | ||
org=(text_x, text_y), | ||
fontFace=font, | ||
fontScale=self.text_scale, | ||
color=self.text_color.as_rgb(), | ||
thickness=self.text_thickness, | ||
lineType=cv2.LINE_AA, | ||
) | ||
return scene |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters