import sys import cv2 import math import copy import torch import itertools import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1 import make_axes_locatable from scipy.optimize import linear_sum_assignment from scipy.stats import linregress from ellipse import LsqEllipse from itertools import product from functools import reduce from utils.utils_field import _draw_field from utils.utils_heatmap import generate_gaussian_array_vectorized_l class LineKeypointsWCDB(object): def __init__(self, image, homography, size_out=(960,540)): self.lines_list = ["Big rect. left bottom", "Big rect. left main", "Big rect. left top", "Big rect. right bottom", "Big rect. right main", "Big rect. right top", "Goal left crossbar", "Goal left post left ", "Goal left post right", "Goal right crossbar", "Goal right post left", "Goal right post right", "Middle line", "Side line bottom", "Side line left", "Side line right", "Side line top", "Small rect. left bottom", "Small rect. left main", "Small rect. left top", "Small rect. right bottom", "Small rect. right main", "Small rect. right top"] self.line_extremities = [[[0., 54.16], [16.5, 54.16]], [[16.5, 13.84], [16.5, 54.16]], [[0., 13.84], [16.5, 13.84]], [[88.5, 54.16], [105., 54.16]], [[88.5, 13.84], [88.5, 54.16]], [[88.5, 13.84], [105., 13.84]], [[], []], [[], []], [[], []], [[], []], [[], []], [[], []], [[52.5, 0.], [52.5, 68.]], [[0., 68.], [105., 68.]], [[0., 0.], [0., 68.]], [[105., 0.], [105., 68.]], [[0., 0.], [105., 0.]], [[0., 43.16], [5.5, 43.16]], [[5.5, 24.84], [5.5, 43.16]], [[0., 24.84], [5.5, 24.84]], [[99.5, 43.16], [105., 43.16]], [[99.5, 24.84], [99.5, 43.16]], [[99.5, 24.84], [105., 24.84]],] self.homography = homography self.image = image self.w, self.h = size_out self.size = (self.w, self.h) self.h_extra = self.h * 0.5 self.w_extra = self.w * 0.5 self.lines = {} self.num_channels = len(self.lines_list) self.mask_array = np.ones(self.num_channels + 1).astype(int) def get_tensor_w_mask(self): self.get_lines() for line in [7, 8, 9, 10, 11, 12]: self.mask_array[line-1] = 0 heatmap_tensor = generate_gaussian_array_vectorized_l(self.num_channels, self.lines, self.size, down_ratio=2, sigma=2) return heatmap_tensor, self.mask_array def get_lines(self): for count, line in enumerate(self.line_extremities): if len(line[0]) > 0: p1_img = np.linalg.inv(self.homography) @ np.array([line[0][0], line[0][1], 1.]) p1_img /= p1_img[-1] p2_img = np.linalg.inv(self.homography) @ np.array([line[1][0], line[1][1], 1.]) p2_img /= p2_img[-1] p1_img[0] *= self.w / self.image.size[0] p1_img[1] *= self.h / self.image.size[1] p2_img[0] *= self.w / self.image.size[0] p2_img[1] *= self.h / self.image.size[1] flag, pt1, pt2 = cv2.clipLine((0, 0, self.w, self.h), (int(p1_img[0]), int(p1_img[1])), (int(p2_img[0]), int(p2_img[1]))) if flag: self.lines[count+1] = {'x_1': pt1[0], 'y_1': pt1[1], 'x_2': pt2[0], 'y_2': pt2[1]}