Как мне захватить несколько потоков камер с помощью OpenCV?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как мне захватить несколько потоков камер с помощью OpenCV?

Сообщение Anonymous »


Я хочу использовать несколько средств просмотра CCTV. Отображение видео 20 различных источников RTSP в одном окне. Без использования PyQt5. Используя cv2.hconcat или np.hstack, программа принудительно завершает работу. Итак, я пытаюсь использовать многопроцессорность и pygame.

Ниже приведен код, который я пробовал.

[Camera.py]

импортировать cv2 импортировать многопроцессорность как mp импортировать imutils импортировать pygame импортировать numpy как np класс CameraWidget(): """Независимый канал камеры Использует потоки для захвата кадров IP-камеры в фоновом режиме. @param width — Ширина видеокадра. @param height — Высота видеокадра. @paramstream_link — ссылка на IP/RTSP/веб-камеру @paramspect_ratio — сохранять ли соотношение сторон кадра или принудительно использовать его во кадре. """ def __init__(self, width, height,stream_link=0,spect_ratio=False,parent=None, deque_size=1): super(CameraWidget, self).__init__(родительский) # Инициализируем дек, используемый для хранения кадров, считанных из потока self.deque = mp.Queue(deque_size) # Требуется небольшое смещение, поскольку макеты PyQt имеют встроенные отступы. # Поэтому добавьте смещение, чтобы противостоять заполнению self.offset = 16 self.screen_width = ширина - self.offset self.screen_height = высота - self.offset self.maintain_aspect_ratio = аспектное соотношение self.camera_stream_link =stream_link # Флаг, чтобы проверить, действительна/работает ли камера self.online = Ложь self.capture = Нет self.load_network_stream() # Начинаем захват фонового кадра self.get_frame_thread = mp.Process(target=self.get_frame, args=()) self.get_frame_thread.daemon = Истина self.get_frame_thread.start() print('Запущена камера: {}'.format(self.camera_stream_link)) защита load_network_stream (сам): """Проверяет ссылку на поток и открывает новый поток, если он действителен""" защита load_network_stream_thread(): если self.verify_network_stream(self.camera_stream_link): self.capture = cv2.VideoCapture(self.camera_stream_link) self.online = Истина self.load_stream_thread = mp.Process(target=load_network_stream_thread, args=()) self.load_stream_thread.daemon = Истина self.load_stream_thread.start() defverify_network_stream(сам, ссылка): """Пытается получить кадр по указанной ссылке""" cap = cv2.VideoCapture (ссылка) если не cap.isOpened(): вернуть ложь крышка.релиз() вернуть истину защита get_frame (сам): """Считывает кадр, изменяет размер и преобразует изображение в растровое изображение""" пока правда: пытаться: если self.capture.isOpened() и self.online: # Читаем следующий кадр из потока и вставляем в очередь статус, кадр = self.capture.read() если статус: self.deque.append(кадр) еще: self.capture.release() self.online = Ложь еще: #Попытка переподключения print('попытка переподключения', self.camera_stream_link) self.load_network_stream() # self.spin(2) # self.spin(.001) кроме AttributeError: проходить защита set_frame(self): """Устанавливает растровое изображение в видеокадр""" если не self.online: # self.spin(1) возвращаться если self.deque и self.online: # Захватить последний кадр кадр = self.deque[-1] # Сохраняем соотношение сторон кадра если self.maintain_aspect_ratio: self.frame = imutils.resize(frame, width=self.screen_width) # Принудительное изменение размера еще: self.frame = cv2.resize(frame, dsize=(384, 216), интерполяция=cv2.INTER_AREA) # Добавить временную метку к камерам cv2.rectangle(self.frame, (self.screen_width - 190, 0), (self.screen_width, 50), цвет = (0, 0, 0), толщина=-1) кадр = cv2.resize(frame, dsize=(384, 216), интерполяция=cv2.INTER_AREA) рамка = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) рамка = np.rot90(кадр) рамка = pygame.surfarray.make_surface(frame) защита get_video_frame(self): вернуть self.video_frame [main.py]

импортировать систему из камеры импортировать CameraWidget импортировать pygame из импорта pygame.locals * защита exit_application(): """Обработчик событий выхода из программы""" sys.exit(1) если __name__ == '__main__': urls = ['rtsp://имя пользователя:пароль@192.168.1.43:554/cam/realmonitor?channel=1&subtype=0', 'rtsp://имя пользователя:пароль@192.168.1.45/axis-media/media.amp', 'rtsp://имя пользователя:пароль@192.168.1.47:554/cam/realmonitor?channel=1&subtype=0', 'rtsp://имя пользователя:пароль@192.168.1.47:554/cam/realmonitor?channel=1&subtype=0', 'rtsp://имя пользователя:пароль@192.168.1.47:554/cam/realmonitor?channel=1&subtype=0', 'rtsp://имя пользователя:пароль@192.168.1.47:554/cam/realmonitor?channel=1&subtype=0', 'rtsp://имя пользователя:пароль@192.168.1.47:554/cam/realmonitor?channel=1&subtype=0', 'rtsp://имя пользователя:пароль@192.168.1.47:554/cam/realmonitor?channel=1&subtype=0'] камеры=[] для меня в len(urls): CameraWidget(1920 // 3, 1080 // 3, URL) pygame.init() экран = pygame.display.set_mode([1920, 1080]) пытаться: пока правда: screen.blit(кадр, (0, 0)) pygame.display.update() для события в pygame.event.get(): если event.type == KEYDOWN: sys.exit(0) кроме (KeyboardInterrupt,SystemExit): pygame.quit() .

Это код, о котором я говорил.

Я хочу использовать этот код с использованием pygame.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»