예제 #1
0
    def draw_detection_region(frame: Frame, mask):
        """
        Rysuje na klatce obszar czułości kamery.

        :param Frame frame: Klatka obrazu.
        :return: Klatka obrazu z oznaczonym obszarem.
        :rtype: Frame
        """

        height, width = frame.size()
        horizontal_border = Configuration.horizontal_border()
        vertical_border = Configuration.vertical_border()
        lup = (int(horizontal_border), int(vertical_border))
        rup = (int(width-horizontal_border), int(vertical_border))
        llp = (int(horizontal_border), int(height-vertical_border))
        rlp = (int(width-horizontal_border), int(height-vertical_border))
        frame.img = cv2.line(frame.img, llp, lup, (0, 0, 255), thickness=3)
        frame.img = cv2.line(frame.img, llp, rlp, (0, 0, 255), thickness=3)
        frame.img = cv2.line(frame.img, rlp, rup, (0, 0, 255), thickness=3)
        frame.img = cv2.line(frame.img, lup, rup, (0, 0, 255), thickness=3)
        mask = cv2.line(mask, llp, lup, (0, 0, 255), thickness=3)
        mask = cv2.line(mask, llp, rlp, (0, 0, 255), thickness=3)
        mask = cv2.line(mask, rlp, rup, (0, 0, 255), thickness=3)
        mask = cv2.line(mask, lup, rup, (0, 0, 255), thickness=3)

        return frame, mask
예제 #2
0
    def draw_detection_region(frame: Frame, mask):
        """
        Rysuje na klatce obszar czułości kamery.

        :param Frame frame: Klatka obrazu.
        :return: Klatka obrazu z oznaczonym obszarem.
        :rtype: Frame
        """

        height, width = frame.size()
        horizontal_border = Configuration.horizontal_border()
        vertical_border = Configuration.vertical_border()
        lup = (int(horizontal_border), int(vertical_border))
        rup = (int(width - horizontal_border), int(vertical_border))
        llp = (int(horizontal_border), int(height - vertical_border))
        rlp = (int(width - horizontal_border), int(height - vertical_border))
        frame.img = cv2.line(frame.img, llp, lup, (0, 0, 255), thickness=3)
        frame.img = cv2.line(frame.img, llp, rlp, (0, 0, 255), thickness=3)
        frame.img = cv2.line(frame.img, rlp, rup, (0, 0, 255), thickness=3)
        frame.img = cv2.line(frame.img, lup, rup, (0, 0, 255), thickness=3)
        mask = cv2.line(mask, llp, lup, (0, 0, 255), thickness=3)
        mask = cv2.line(mask, llp, rlp, (0, 0, 255), thickness=3)
        mask = cv2.line(mask, rlp, rup, (0, 0, 255), thickness=3)
        mask = cv2.line(mask, lup, rup, (0, 0, 255), thickness=3)

        return frame, mask
예제 #3
0
    def resize(frame: Frame):
        """
        Zmienia rozmiar obrazu na (720, 480).

        :return: Klatka obrazu o zmienionym rozmiarze.
        :rtype: Frame
        """

        frame.img = cv2.resize(frame.img, (720, 480))
        frame.orginal_img = cv2.resize(frame.orginal_img, (720, 480))

        return frame
예제 #4
0
    def update(new_vehicles: list, frame: Frame, mask: np.ndarray):
        """
        Aktualizuje śledzone pojazdy.

        :param new_vehicles: Nowe pojazdy.
        :param Frame frame: Klatka obrazu.
        :param np.ndarray mask: Binarna maska obrazu
        :return: Zidentyfikowane pojazdy(?), None jeśli żadnego nie wykryto.
        :rtype: list
        """

        if len(new_vehicles) == 0:
            return None

        # Pobierz szerokość obrazu.
        _, Follower.__frame_width = frame.size()

        result = []

        Follower.__detected_left = False
        Follower.__detected_right = False

        if len(new_vehicles) > 1:
            Logger.warning("Otrzymano więcej niż jeden pojazd.")

        for new_car in new_vehicles:
            # detekcja z prawej strony
            if Follower.__is_on_right(new_car):
                Follower.__detected_right = True
                if not Follower.__right_lock:
                    Follower.__right_lock = True
                    # jeżeli nie ma nic po drugiej stronie to odłóż na stos
                    if not len(Follower.__tracked_left):
                        Follower.__tracked_right.append((new_car, frame))
                        Logger.info("Obiekt zarejestrwany po prawej stronie.")
                    # jeżeli bo drugiej stronie coś było to pobierz ze stosu
                    else:
                        old_car, oldframe = Follower.__tracked_left.pop()
                        record = ObjectRecord(new_car, old_car, frame, oldframe, mask)
                        Logger.info("Wykryto przejazd samochodu.")
                        result.append(record)
            # detekcja z lewej strony
            elif Follower.__is_on_left(new_car):
                Follower.__detected_left = True
                if not Follower.__left_lock:
                    Follower.__left_lock = True
                    # jeżeli nie ma nic po drugiej stronie to odłóż na stos
                    if not len(Follower.__tracked_right):
                        Follower.__tracked_left.append((new_car, frame))
                        Logger.info("Obiekt zarejestrwany po lewej stronie.")
                    # jeżeli bo drugiej stronie coś było to pobierz ze stosu
                    else:
                        old_car, oldframe = Follower.__tracked_right.pop()
                        record = ObjectRecord(new_car, old_car, frame, oldframe, mask)
                        Logger.info("Wykryto przejazd samochodu.")
                        result.append(record)

        Follower.__check_locks()

        return result if len(result) else None
예제 #5
0
    def draw_vehicles(frame: Frame, mask, vehicles: list):
        """
        Oznacza na obrazie pojazdy wraz ze środkami ciężkości.

        :param Frame frame: Klatka obrazu.
        :param list vehicles: Lista pojazdów.
        :return: Obraz z oznaczonymi pojazdami.
        :rtype: numpy.array
        """

        for veh in vehicles:
            x, y, w, h = veh.get_coordinates()
            cx = veh.centerx
            cy = veh.centery
            frame.img = cv2.rectangle(frame.img, (x, y), (x+w, y+h), (0, 255, 0), thickness=4)
            frame.img = cv2.line(frame.img, (cx, cy-10), (cx, cy+10), (0, 255, 0), thickness=4)
            frame.img = cv2.line(frame.img, (cx-10, cy), (cx+10, cy), (0, 255, 0), thickness=4)
            mask = cv2.rectangle(mask, (x, y), (x+w, y+h), (0, 255, 0), thickness=4)
            mask = cv2.line(mask, (cx, cy-10), (cx, cy+10), (0, 255, 0), thickness=4)
            mask = cv2.line(mask, (cx-10, cy), (cx+10, cy), (0, 255, 0), thickness=4)
        return frame, mask
예제 #6
0
    def draw_vehicles(frame: Frame, mask, vehicles: list):
        """
        Oznacza na obrazie pojazdy wraz ze środkami ciężkości.

        :param Frame frame: Klatka obrazu.
        :param list vehicles: Lista pojazdów.
        :return: Obraz z oznaczonymi pojazdami.
        :rtype: numpy.array
        """

        for veh in vehicles:
            x, y, w, h = veh.get_coordinates()
            cx = veh.centerx
            cy = veh.centery
            frame.img = cv2.rectangle(frame.img, (x, y), (x + w, y + h), (0, 255, 0), thickness=4)
            frame.img = cv2.line(frame.img, (cx, cy - 10), (cx, cy + 10), (0, 255, 0), thickness=4)
            frame.img = cv2.line(frame.img, (cx - 10, cy), (cx + 10, cy), (0, 255, 0), thickness=4)
            mask = cv2.rectangle(mask, (x, y), (x + w, y + h), (0, 255, 0), thickness=4)
            mask = cv2.line(mask, (cx, cy - 10), (cx, cy + 10), (0, 255, 0), thickness=4)
            mask = cv2.line(mask, (cx - 10, cy), (cx + 10, cy), (0, 255, 0), thickness=4)
        return frame, mask
예제 #7
0
    def __select(vehicles: list, frame: Frame):
        """
        Dokonuje selekcji znalezionych obiektów. Odrzuca obiekty znajdujące się przy krawędzi obrazu.

        :param list vehicles: Wektor potencjalnych samochodów.
        :param Frame frame: Klatka obrazu
        :return: Wyseleksjonowane pojazdy.
        :rtype:  list
        """

        height, width = frame.size()
        result = []
        for vehic in vehicles:
            horizontal_border = Configuration.horizontal_border()
            vertical_border = Configuration.vertical_border()
            if (vehic.centerx > horizontal_border) and (vehic.centerx < width-horizontal_border)\
                    and (vehic.centery > vertical_border) and (vehic.centery < height-vertical_border):
                result.append(vehic)
        return result
예제 #8
0
    def __select(vehicles: list, frame: Frame):
        """
        Dokonuje selekcji znalezionych obiektów. Odrzuca obiekty znajdujące się przy krawędzi obrazu.

        :param list vehicles: Wektor potencjalnych samochodów.
        :param Frame frame: Klatka obrazu
        :return: Wyseleksjonowane pojazdy.
        :rtype:  list
        """

        height, width = frame.size()
        result = []
        for vehic in vehicles:
            horizontal_border = Configuration.horizontal_border()
            vertical_border = Configuration.vertical_border()
            if (
                (vehic.centerx > horizontal_border)
                and (vehic.centerx < width - horizontal_border)
                and (vehic.centery > vertical_border)
                and (vehic.centery < height - vertical_border)
            ):
                result.append(vehic)
        return result
예제 #9
0
    def update(new_vehicles: list, frame: Frame, mask: np.ndarray):
        """
        Aktualizuje śledzone pojazdy.

        :param new_vehicles: Nowe pojazdy.
        :param Frame frame: Klatka obrazu.
        :param np.ndarray mask: Binarna maska obrazu
        :return: Zidentyfikowane pojazdy(?), None jeśli żadnego nie wykryto.
        :rtype: list
        """

        if len(new_vehicles) == 0:
            return None

        # Pobierz szerokość obrazu.
        _, Follower.__frame_width = frame.size()

        result = []

        Follower.__detected_left = False
        Follower.__detected_right = False

        if len(new_vehicles) > 1:
            Logger.warning("Otrzymano więcej niż jeden pojazd.")

        for new_car in new_vehicles:
            # detekcja z prawej strony
            if Follower.__is_on_right(new_car):
                Follower.__detected_right = True
                if not Follower.__right_lock:
                    Follower.__right_lock = True
                    # jeżeli nie ma nic po drugiej stronie to odłóż na stos
                    if not len(Follower.__tracked_left):
                        Follower.__tracked_right.append((new_car, frame))
                        Logger.info("Obiekt zarejestrwany po prawej stronie.")
                    # jeżeli bo drugiej stronie coś było to pobierz ze stosu
                    else:
                        old_car, oldframe = Follower.__tracked_left.pop()
                        record = ObjectRecord(new_car, old_car, frame,
                                              oldframe, mask)
                        Logger.info("Wykryto przejazd samochodu.")
                        result.append(record)
            # detekcja z lewej strony
            elif Follower.__is_on_left(new_car):
                Follower.__detected_left = True
                if not Follower.__left_lock:
                    Follower.__left_lock = True
                    # jeżeli nie ma nic po drugiej stronie to odłóż na stos
                    if not len(Follower.__tracked_right):
                        Follower.__tracked_left.append((new_car, frame))
                        Logger.info("Obiekt zarejestrwany po lewej stronie.")
                    # jeżeli bo drugiej stronie coś było to pobierz ze stosu
                    else:
                        old_car, oldframe = Follower.__tracked_right.pop()
                        record = ObjectRecord(new_car, old_car, frame,
                                              oldframe, mask)
                        Logger.info("Wykryto przejazd samochodu.")
                        result.append(record)

        Follower.__check_locks()

        return result if len(result) else None
예제 #10
0
    def algorithm(self):
        if self.__exit_flag:
            return False

        if self.__play_file_flag:

            if self.__input_video is None:
                path = self.__get_file_path(self.__played_file)
                Algorithm.set_file(path)
                self.__input_video = VideoReader(path)
                self.__current_frame_index = 1

            frame = Frame(self.__input_video)
            self.window.files_treeview.set_cursor(self.__played_file)

            if not self.__input_video.is_good():
                # Zresetuj dane przechowywane przez algorytm przed otwarciem nowego pliku
                Algorithm.reset()
                if (self.__played_file + 1) < self.__files_list_length():
                    # Pobierz następny plik do przetwarzania
                    self.__current_frame_index = 1
                    self.__played_file += 1
                    path = self.__get_file_path(self.__played_file)
                    self.window.files_treeview.set_cursor(self.__played_file)
                    self.__input_video = VideoReader(path)
                    Algorithm.set_file(path)
                else:
                    # Zakończ odtwarzanie jeśli nie ma żadnych plików
                    self.__play_file_flag = False
                    self.__played_file = 0
                    self.__open_files_button_enable(True)
                    self.__play_button_enable(True)
                    self.__pause_button_enable(False)
                    self.__stop_button_enable(False)
                    self.__replay_button_enable(False)
                    self.__input_video = None
                    self.__enable_main_menu(True)
                    self.__write_msg("Koniec")
            else:
                # Konwersja rozmiaru
                frame = Algorithm.resize(frame)

                # Krok algorytmu
                frame, mask, records = Algorithm.perform(
                    frame, self.database, self.img_saver, self.__run_alg_flag)

                # Nagrywanie wyniku
                if self.__record_video_flag:
                    # Stwórz wynikowy plik wideo
                    if self.__output_video is None:
                        self.__output_video = VideoWriter()
                    # Zapisz klatkę obrazu
                    self.__output_video.write(frame.img)

                # Dodanie wyniku do listview
                self.__add_result_to_list(
                    records, self.__get_file_path(self.__played_file))

                # Zapisz klatkę obrazu do tymczasowego pliku
                if not self.__display_mask_flag:
                    self.__save_image(frame.img)
                    self.__current_image = frame.img
                else:
                    self.__save_image(mask)
                    self.__current_image = mask

                # Zamień plik na pixbuf
                pixbuf = self.__conver_image_to_pixbuf()
                self.window.main_image.set_from_pixbuf(pixbuf)
                self.__write_current_number()
                self.__current_frame_index += 1
        return True