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
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
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
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
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
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
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
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
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