在OpenCV for python中断开视频源连接时出错

2024-09-26 17:47:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用OpenCV(cv2)读取视频提要,以便在桌面应用程序中显示它。视频馈送是来自Magewell frame grabber设备的外部输入,该设备通过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)中运行(Camerathreading.Thread的一个子类,因此具有线程的本机方法)

在这个类的__init__方法中,我设置了self._cam = cv2.VideoCapture(0)。(0是默认视频源,在本例中为帧抓取器)

启动时,线程本机方法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是否能够切换到其他可用的视频源,但在这种情况下,我会收到相同的错误消息。因此,这似乎是一个与视频源断开连接而不是没有可用视频源有关的问题

任何帮助都将不胜感激


Tags: srcmodules消息视频错误globalframeopencv

热门问题