Spaces:
Sleeping
Sleeping
| import cv2 | |
| from .enums import Event | |
| class Drawer: | |
| def __init__(self): | |
| self.height = self.width = None | |
| self.action = None | |
| self.show_delay = 0 | |
| def set_action(self, action): | |
| """ | |
| Set action to draw | |
| Parameters | |
| ---------- | |
| action : Event | |
| Action to draw | |
| """ | |
| self.action = action | |
| self.show_delay = 0 | |
| def draw_two_hands(self, frame, bboxes): | |
| self.height, self.width, _ = frame.shape | |
| center_x1, center_y1 = bboxes[0][0] + (bboxes[0][2] - bboxes[0][0]) // 2, bboxes[0][1] + (bboxes[0][3] - bboxes[0][1]) // 2 | |
| center_x2, center_y2 = bboxes[1][0] + (bboxes[1][2] - bboxes[1][0]) // 2, bboxes[1][1] + (bboxes[1][3] - bboxes[1][1]) // 2 | |
| # frame = cv2.circle(frame, (int(center_x1), int(center_y1)), 50, (255, 0, 0), 9) | |
| # frame = cv2.circle(frame, (int(center_x2), int(center_y2)), 50, (255, 0, 0), 9) | |
| diff = int(center_x1 - center_x2) | |
| frame = cv2.rectangle(frame, | |
| (int(center_x1), int(center_y1 - diff * 0.3)), | |
| (int(center_x2), int(center_y2 + diff * 0.3)), | |
| (255, 0, 0), 5) | |
| def draw(self, frame): | |
| """ | |
| Draw action on frame | |
| Parameters | |
| ---------- | |
| frame : np.ndarray | |
| Frame to draw on | |
| x : int | |
| X coordinate of hand center | |
| y : int | |
| Y coordinate of hand center | |
| Returns | |
| ------- | |
| frame : np.ndarray | |
| Frame with action | |
| """ | |
| if self.height is None: | |
| self.height, self.width, _ = frame.shape | |
| if self.action is not None: | |
| if self.action in [Event.SWIPE_LEFT, Event.SWIPE_LEFT2, Event.SWIPE_LEFT3]: | |
| frame = cv2.arrowedLine( | |
| frame, | |
| (int(self.width * 0.6), self.height // 2), | |
| (int(self.width * 0.4), self.height // 2), | |
| (0, 255, 0), | |
| 9, | |
| ) | |
| elif self.action in [Event.SWIPE_RIGHT, Event.SWIPE_RIGHT2, Event.SWIPE_RIGHT3]: | |
| frame = cv2.arrowedLine( | |
| frame, | |
| (int(self.width * 0.4), self.height // 2), | |
| (int(self.width * 0.6), self.height // 2), | |
| (0, 255, 0), | |
| 9, | |
| ) | |
| elif self.action in [Event.SWIPE_UP, Event.SWIPE_UP2, Event.SWIPE_UP3]: | |
| frame = cv2.arrowedLine( | |
| frame, | |
| (self.width // 2, int(self.height * 0.6)), | |
| (self.width // 2, int(self.height * 0.4)), | |
| (0, 255, 0), | |
| 9, | |
| ) | |
| elif self.action in [Event.SWIPE_DOWN, Event.SWIPE_DOWN2, Event.SWIPE_DOWN3]: | |
| frame = cv2.arrowedLine( | |
| frame, | |
| (self.width // 2, int(self.height * 0.4)), | |
| (self.width // 2, int(self.height * 0.6)), | |
| (0, 255, 0), | |
| 9, | |
| ) | |
| elif self.action == Event.FAST_SWIPE_DOWN: | |
| frame = cv2.arrowedLine( | |
| frame, | |
| (self.width // 2, int(self.height * 0.4)), | |
| (self.width // 2, int(self.height * 0.6)), | |
| (0, 255, 0), | |
| 9, | |
| ) | |
| elif self.action == Event.FAST_SWIPE_UP: | |
| frame = cv2.arrowedLine( | |
| frame, | |
| (self.width // 2, int(self.height * 0.6)), | |
| (self.width // 2, int(self.height * 0.4)), | |
| (0, 255, 0), | |
| 9, | |
| ) | |
| elif self.action == Event.ZOOM_OUT: | |
| center_x, center_y = self.width // 2, self.height // 2 | |
| square_size = 200 | |
| top_left = (center_x - square_size // 2, center_y - square_size // 2) | |
| top_right = (center_x + square_size // 2, center_y - square_size // 2) | |
| bottom_left = (center_x - square_size // 2, center_y + square_size // 2) | |
| bottom_right = (center_x + square_size // 2, center_y + square_size // 2) | |
| cv2.rectangle(frame, top_left, bottom_right, (0, 255, 0), 2) | |
| frame = cv2.arrowedLine(frame, top_left, (center_x - 20, center_y - 20), (0, 255, 0), 3) | |
| frame = cv2.arrowedLine(frame, top_right, (center_x + 20, center_y - 20), (0, 255, 0), 3) | |
| frame = cv2.arrowedLine(frame, bottom_left, (center_x - 20, center_y + 20), (0, 255, 0), 3) | |
| frame = cv2.arrowedLine(frame, bottom_right, (center_x + 20, center_y + 20), (0, 255, 0), 3) | |
| elif self.action == Event.ZOOM_IN: | |
| center_x, center_y = self.width // 2, self.height // 2 | |
| square_size = 200 | |
| arrow_length = 50 | |
| top_left = (center_x - square_size // 2, center_y - square_size // 2) | |
| top_right = (center_x + square_size // 2, center_y - square_size // 2) | |
| bottom_left = (center_x - square_size // 2, center_y + square_size // 2) | |
| bottom_right = (center_x + square_size // 2, center_y + square_size // 2) | |
| cv2.rectangle(frame, top_left, bottom_right, (0, 255, 0), 2) | |
| top_left_end = (top_left[0] - arrow_length, top_left[1] - arrow_length) | |
| top_right_end = (top_right[0] + arrow_length, top_right[1] - arrow_length) | |
| bottom_left_end = (bottom_left[0] - arrow_length, bottom_left[1] + arrow_length) | |
| bottom_right_end = (bottom_right[0] + arrow_length, bottom_right[1] + arrow_length) | |
| frame = cv2.arrowedLine(frame, top_left, top_left_end, (0, 255, 0), 3) | |
| frame = cv2.arrowedLine(frame, top_right, top_right_end, (0, 255, 0), 3) | |
| frame = cv2.arrowedLine(frame, bottom_left, bottom_left_end, (0, 255, 0), 3) | |
| frame = cv2.arrowedLine(frame, bottom_right, bottom_right_end, (0, 255, 0), 3) | |
| elif self.action in [Event.DRAG, Event.DRAG2, Event.DRAG3]: | |
| frame = cv2.circle(frame, (self.width // 2, self.height // 2), 50, (0, 255, 0), 9) | |
| elif self.action == Event.DOUBLE_TAP: | |
| frame = cv2.putText(frame, 'DOUBLE CLICK', (self.width // 2, self.height // 2), cv2.FONT_HERSHEY_SIMPLEX , | |
| 1, (255, 0, 0) , 5, cv2.LINE_AA) | |
| elif self.action == Event.TAP: | |
| frame = cv2.putText(frame, 'CLICK', (self.width // 2, self.height // 2), cv2.FONT_HERSHEY_SIMPLEX , | |
| 1, (255, 0, 0) , 5, cv2.LINE_AA) | |
| elif self.action in [Event.DROP, Event.DROP2, Event.DROP3]: | |
| frame = cv2.circle(frame, (self.width // 2, self.height // 2), 50, (0, 0, 255), -1) | |
| elif self.action == Event.COUNTERCLOCK: | |
| frame = cv2.putText(frame, 'COUNTERCLOCK', (self.width // 2, self.height // 2), cv2.FONT_HERSHEY_SIMPLEX , | |
| 1, (0, 255, 0) , 5, cv2.LINE_AA) | |
| elif self.action == Event.CLOCKWISE: | |
| frame = cv2.putText(frame, 'CLOCKWISE', (self.width // 2, self.height // 2), cv2.FONT_HERSHEY_SIMPLEX , | |
| 1, (0, 255, 0) , 5, cv2.LINE_AA) | |
| # elif self.action == Event.DRAG2: | |
| # frame = cv2.circle(frame, (self.width // 2, self.height // 2), 50, (255, 0, 0), 9) | |
| # elif self.action == Event.DROP2: | |
| # frame = cv2.circle(frame, (self.width // 2, self.height // 2), 50, (0, 0, 255), -1) | |
| self.show_delay += 1 | |
| if self.show_delay > 10: | |
| self.show_delay = 0 | |
| self.action = None | |
| self.x = self.y = None | |
| return frame | |