web-dev-qa-db-ja.com

ウェブカメラを使用してビデオをキャプチャしようとすると、gstreamerの重大なエラーpython opencv

opencvとpythonを使用して簡単なコードでWebカメラでビデオを撮ろうとしています

import numpy as np
import cv2

cap = cv2.VideoCapture(0)
print('cap.isOpened')
if cap.isOpened():
    print ('cap is opened')
    while(True):
        re,img=cap.read()
        cv2.imshow("video output", img)
        k = cv2.waitKey(10)&0xFF
        if k==27:
            break
cap.release()
cv2.destroyAllWindows()

.mp4ファイルなどの既存のビデオを再生しようとしても問題ありません。しかし、ウェブカメラを使用しようとするとエラーが発生しました

GStreamer-CRITICAL **:gst_element_get_state:assertion 'GST_IS_ELEMENT(element)' failed failed cap.isOpened

詳細については、ubuntu 16.04でodroid xu4を使用しています。webcamは、logitech c170を使用しています(webcamtestで適切に動作し、guvcviewを使用しています)。これは、チーズやカモラマでは機能しないと考えています。

これについて助けが必要です。

10
Shinogami Rei

次の回避策は、適切に機能する可能性があります。

cap = cv2.VideoCapture(0, cv2.CAP_V4L)

バックエンドを選択する機能はOpenCV 3で追加されました。VideoCapture()docs を参照してください。

回避策は、16.04ボックスでGStreamerをサポートするOpenCV 3.4.4ビルドのバックエンドをV4L(デフォルトのGStreamerから)に切り替えます。ここでexport OPENCV_VIDEOIO_DEBUG=TRUEの後に回避策を含む質問のコードの出力:

[ WARN:0] VIDEOIO(cvCreateCameraCapture_V4L(index)): trying ...

[ WARN:0] VIDEOIO(cvCreateCameraCapture_V4L(index)): result=0x20b1470 ...

cap.isOpened
cap is opened

回避策がうまくいかない場合は、print(cv2.getBuildInformation())を使用して、OpenCVビルドがV4Lをサポートしているかどうかを確認できます。ここに私のビルドに関連するセクション:

Video I/O:
  DC1394:                      YES (ver 2.2.4)
  FFMPEG:                      YES
    avcodec:                   YES (ver 56.60.100)
    avformat:                  YES (ver 56.40.101)
    avutil:                    YES (ver 54.31.100)
    swscale:                   YES (ver 3.1.101)
    avresample:                NO
  GStreamer:                  
    base:                      YES (ver 1.8.3)
    video:                     YES (ver 1.8.3)
    app:                       YES (ver 1.8.3)
    riff:                      YES (ver 1.8.3)
    pbutils:                   YES (ver 1.8.3)
  libv4l/libv4l2:              NO
  v4l/v4l2:                    linux/videodev2.h
1
Ulrich Stern