Ошибка при отключении источника видео в OpenCV для python

Я использую OpenCV (cv2) для чтения видеопотока, чтобы показать ему настольное приложение. Видеопоток - это внешний вход от устройства захвата кадров Magewell, которое подключено к компьютеру через USB и к камере через HDMI (у пользователя есть это оборудование на месте при использовании приложения). Если USB-соединение потеряно, я хочу показать пользователю предупреждение, и если соединение будет восстановлено, видеопоток должен снова запуститься.

Однако мои процессы останавливаются, когда я намеренно отключаю USB-накопитель фреймов. Я получаю следующее сообщение об ошибке:

      [ WARN:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (1113) SourceReaderCB::OnReadSample videoio(MSMF): OnReadSample() is called with error status: -1072873822
[ WARN:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (1125) SourceReaderCB::OnReadSample videoio(MSMF): async ReadSample() call is failed with error status: -1072873822
[ WARN:1] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (1159) CvCapture_MSMF::grabFrame videoio(MSMF): can't grab frame. Error: -1072873822

Мой код работает в классе Camera(threading.Thread) ( Camera является подклассом threading.Thread и, таким образом, имеет собственные методы потоковой передачи).

В моем __init__ метод этого класса, я устанавливаю self._cam = cv2.VideoCapture(0). (0 - источник видео по умолчанию, в данном случае - захват кадра).

При запуске собственный метод многопоточности start() называется как super().start(). Это вызывает. run() звонки __grab_frame который выглядит так (упрощенно):

      def __grab_frame(self):
    # Capture frame
    success, next_frame = self._cam.read() #success is bool value telling if the frame was grabbed. 

    if success:
        frame_dict = dict([relevant data to be parsed on to image_observers, incl. next_frame])
        self.__notify_image_observers(frame_dict)
    else:
        print('not connected')

Когда я запускаю этот код, все работает, пока я не вытащу USB. Затем я получаю три строки сообщений об ошибках, показанные выше, за которыми следуют - и все останавливается.

Когда я затем повторно подключаю фреймграббер, я получаю это сообщение каждые несколько секунд (обратите внимание на новый идентификатор ошибки!):

      [ WARN:1] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (1159) CvCapture_MSMF::grabFrame videoio(MSMF): can't grab frame. Error: -2147483638

... за которым следует печать "not connected".

Я попытался воспроизвести ошибку, включив встроенную камеру ноутбука, поэтому у меня есть два функциональных источника видео. Затем я отключаю встроенную камеру (источник =0), чтобы увидеть, сможет ли OpenCV переключиться на другой доступный источник видео, но в этом случае я получаю те же сообщения об ошибках. Похоже, что проблема связана с отключением источника видеосигнала, а не с отсутствием доступного источника видеосигнала.

Любая помощь приветствуется!

0 ответов

Другие вопросы по тегам