Ошибка при отключении источника видео в 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 переключиться на другой доступный источник видео, но в этом случае я получаю те же сообщения об ошибках. Похоже, что проблема связана с отключением источника видеосигнала, а не с отсутствием доступного источника видеосигнала.
Любая помощь приветствуется!