デスクトップ アプリケーションを表示するために、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 が他の利用可能なビデオ ソースに移行できるかどうかを確認しますが、その場合も同じエラー メッセージが表示されます。そのため、ビデオ ソースが利用できないというよりも、ビデオ ソースが切断されていることに関連する問題のようです。
どんな助けでも大歓迎です!