web-dev-qa-db-ja.com

cv2.VideoCapture.open()は常にFALSEを返します

ビーグルボーンのLogitech c310ウェブカメラにアクセスしようとしています。デバイスIDに対して常にfalseを返しますが、その理由はわかりません。

次のコードを使用します。

>>> import cv2, numpy as np
>>> cam = cv2.VideoCapture(0)
>>> cam.open(0)
False

以下のように、カメラはdev /およびroot@arm:~#lsusbにもvideo0として表示されます。

root@arm:~# lsusb
Bus 001 Device 002: ID 046d:081b Logitech, Inc. Webcam C310
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

v4l2-ctlでカメラにアクセスすることもできます。私はOpenCVが初めてなので、これは馬鹿げているように聞こえるかもしれませんが、事前に謝罪します。

15
user26641
HIGHGUI ERROR: V4L: index 1 is not correct!
False
OpenCV Error: Bad flag (parameter or structure field) (Unrecognized or unsupported array  type) in cvGetMat, file /home/kaushik/Desktop/OpenCV-2.4.1/modules/core/src/array.cpp, line 2482
Traceback (most recent call last):
File "x2.py", line 8, in <module>
cv2.imshow('frame', frame)
cv2.error: /home/kaushik/Desktop/OpenCV-2.4.1/modules/core/src/array.cpp:2482: error: (-206) Unrecognized or unsupported array type in function cvGetMat

この種のエラーが発生している場合は、おそらくインデックス付けに何らかの問題があります。

cv2.VideoCapture(0)の代わりに追加:

cv2.VideoCapture(-1)

これにより、最初のカメラが機能します。そして、何かがうまくいかない場合は、ここにスタックトレースを投稿するだけで、あなたを助けることができるかどうかわかります:)

13
kaushik94

cv2がpypi wheelからインストールされた場合、ビデオ関連機能はサポートされません(FFmpegでコンパイルされません):

pip install opencv-python

https://pypi.python.org/pypi/opencv-python

13
user1203652

同様の問題に出会いました。ユーザーの許可に関連している可能性があります。次の手順を使用して問題を診断してください。

  1. 次のコマンドを実行して、カメラのアクセス許可を確認します

    ls -la /dev/video*

    次のような出力が得られる場合があります(複数のカメラがある場合は、video1が得られます)。ご覧のとおり、rootユーザーとvideoグループのユーザーのみがカメラへのアクセス許可を持っています。

    crw-rw----. 1 root video 188, 0 Apr 3 21:16 /dev/video0

  2. したがって、修正は簡単です。次のコマンドを使用して、ユーザーアカウントをvideoグループに追加します。

    Sudo usermod -a -G video <you login name>

それが役に立てば幸い!

1
Mingjiang Shi

私にとっての解決策は、コンピューターを再起動することでした。 bcは決定的な解決策ではないようですが、私はそれが好きではありません。しかし、それはjupyterノートブックの問題だったのかもしれません。現在、私はspyder bcで作業しています。jupyterの方が問題を起こしやすいと読みました。

0
Palki

Cv2.VideoCapture()に渡される引数に依存します。

通常、PCのプライマリWebカメラを機能させるには0です。同様に、システムにインストールされている2番目のカメラにアクセスする場合は、引数を2として渡します。

ただし、カメラが1台しかなく、「0」のインデックス付けが役に立たない場合は、代わりにインデックスを-1として渡してみてください。

0

最初にビデオをキャプチャしようとしている場合、cam.open()は正しい方法ではありません。 open()メソッドは、カメラオブジェクト(この場合は「cam」)を初期化します。

次に、cvはcamオブジェクトを初期化できないため、cam.open()はfalseを返します。 VideoCapture()メソッドは既にカメラオブジェクトを初期化します。これを確認するには、次を追加します

cam.isOpened()

直後の

cam.VideoCapture(0)

それは「True」を返します。

第三に、カメラフィードを無効にする場合、これが従来の方法です。

import cv2

cam = cv2.VideoCapture(0)
print cam.isOpened()

while(True):
        ret, frame = cam.read()
        cv2.imshow('frame', frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

cam.release()
cv2.destroyAllWindows()
0
kaushik94

あなたが多くの方法でそれを解決しなかった場合、あなたはしようとすることができます
「opencv3.2.0-dev」を見つけてインストールします、私はそれを使用して解決します
問題を2回。
pip install opencv-pythonだけでは十分ではありません。
少なくとも時々)

0
s yh

ドキュメントに何か役立つ情報が見つかりました。

cap.read()はブール値(True/False)を返します。フレームが正しく読み取られると、Trueになります。キャップがキャプチャを初期化していない場合があります。その場合、コードはエラーを示します。メソッドcap.isOpened()で初期化されているかどうかを確認できます。 Trueの場合、OK。それ以外の場合cap.open()を使用して開きます。

ソース: http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_video_display/py_video_display.html#display-video

0
Ashish Gupta