カメラを読み取っても何も返されなくなるまで、ウェブカメラのインデックスを反復処理することで、この問題を回避することができました:
index = 0
arr = []
while True:
cap = cv2.VideoCapture(index)
if not cap.read()[0]:
break
else:
arr.append(index)
cap.release()
index += 1
return arr
このメソッドは、読み取り時に何かを返すすべてのインデックスのリストを返します。改善できると確信していますが、ウェブカメラの数はほとんどなく、これはかなり高速に実行されます。
@Patrick による素晴らしい回答ですが、改善したいのでまだコメントできません。
パトリックのセットアップでは、カメラ間に空のインデックスがないことを前提としていると思います。しかし、私の場合、内蔵カメラはインデックス 0 で、USB Web カメラはインデックス 2 でした。そのため、"if not cap.read()[0]" はインデックス 1 で while ループから抜け出し、他のものをキャッチすることはありませんでした。 .調べてチェックするインデックスの数を指定する必要があり、null のものは追加しないでください。
def returnCameraIndexes():
# checks the first 10 indexes.
index = 0
arr = []
i = 10
while i > 0:
cap = cv2.VideoCapture(index)
if cap.read()[0]:
arr.append(index)
cap.release()
index += 1
i -= 1
return arr
これにより、必要なインデックスが正常に取得されました。繰り返しになりますが、レイアウトを作成してくれた Patrick に感謝します。
以下に示すように、これは OpenCV の一般的な問題です。ビルトイン、または最初の USB カメラ (ビルトイン カムがない場合のみ) のみが OpenCV で動作するようです:
OpenCV でカメラを使用する方法
OpenCV、Cygwin 経由で USB ウェブカメラにアクセスできません
iSight (OSX) ではなく USB からの OpenCV キャプチャ
現在、この機能リクエストに記載されているように、カメラの数を抽出する方法はありません:
https://code.ros.org/trac/opencv/ticket/935
cap.read() を使用せずにカメラのリストを作成することは可能です。
import cv2
index = 0
arr = []
while True:
cap = cv2.VideoCapture(index)
try:
if cap.getBackendName()=="MSMF":
arr.append(index)
except:
break
cap.release()
index += 1
print(arr)