我正在使用 OpenCV (cv2) 来读取视频源,以便将其显示为桌面应用程序。视频输入是来自美乐威图像采集卡设备的外部输入,该设备通过 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 是默认视频源,在这种情况下是帧采集器)。
在启动时,threading-native 方法start()
被称为super().start()
. 这调用run()
. 看起来像这样的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。然后我得到上面显示的三行错误消息,然后"not connected"
一切都停止了。
当我重新连接图像采集卡时,我每隔几秒就会重复收到此消息(注意新的错误 ID!):
[ 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
... 其次是 print "not connected"
。
我也尝试通过启用内置笔记本电脑摄像头来重现错误,因此我有两个功能视频源。然后我禁用内置摄像头 (source=0) 以查看 OpenCV 是否能够切换到其他可用的视频源,但在这种情况下我会收到相同的错误消息。因此,这似乎是一个与视频源断开连接而不是没有可用视频源有关的问题。
任何帮助将非常感激!