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