0

デスクトップ アプリケーションを表示するために、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()。次のような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 を抜くまですべてが機能します。その後、上記の 3 行のエラー メッセージが表示され、その後に"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"

内蔵のラップトップ カメラも有効にしてエラーを再現しようとしたので、2 つの機能するビデオ ソースができました。次に、内蔵カメラ (source=0) を無効にして、OpenCV が他の利用可能なビデオ ソースに移行できるかどうかを確認しますが、その場合も同じエラー メッセージが表示されます。そのため、ビデオ ソースが利用できないというよりも、ビデオ ソースが切断されていることに関連する問題のようです。

どんな助けでも大歓迎です!

4

0 に答える 0