예제 #1
0
    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
예제 #2
0
    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
예제 #3
0
    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