def __find_biggest_contour(contours): """ Wybiera z konturów ten o największej powierzchni. :param contours: Hierarchia konturów. :return: Największy znaleziony kontur. """ if len(contours) > 1: max_area, contour_index = ContourDetector.area(contours[0]), 0 for index in range(len(contours)): area = ContourDetector.area(contours[index]) if area > max_area: max_area, contour_index = area, index cnt = contours[contour_index] return cnt elif len(contours) == 1: # TODO nie wiem czy ma być index return contours[0] else: return None
def calculate_area(mask: np.ndarray): """ Oblicza pole powierzchni bocznej obiektu. Rozmiar obiektu jest obliczny na podstawie ilosci pixeli obiektu. razy przelicznik pixele na metry. :param np.ndarray mask: Binarna maska obrazu. :return: Pole powierzchni bocznej karoserii pojazdu. :rtype: float """ # Znajdź kontury samochodu. contours = ContourDetector.find(mask) # Wyszkuaj kontur o największym polu. cnt = SizeMeasurment.__find_biggest_contour(contours) # Oblicz pole konturu. area = ContourDetector.area(cnt) ratio = Classyfication.get_ratio() area = round(area*ratio*ratio, 2) return area
def draw_car_contour(img, car, bin_mask): """ Rysuje kontur samochodu na obrazie. :param img: Obraz samochodu. :param car: Obiekt reprezentujący pojazd. :param bin_mask: Binarna maska obrazu. :return: Obraz z oznaczonym konturem samochodu. """ # Wyznacz rejon pojazdu na obrazie. x, y, w, h = car.get_coordinates() mask = bin_mask[y:y+h, x:x+w] image = img[y:y+h, x:x+w, :] # Znajdź kontury samochodu. contours = ContourDetector.find(mask) # Wyszkuaj kontur o największym polu. cnt = SizeMeasurment.__find_biggest_contour(contours) image = ContourDetector.draw(image, cnt, (255, 0, 0), thickness=2) img[y:y+h, x:x+w, :] = image return img