Ich konnte dieses Problem umgehen, indem ich die Webcam-Indizes durchlaufen habe, bis ich gelesen habe, dass die Kamera nichts mehr zurückgibt:
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
Diese Methode gibt eine Liste aller Indizes zurück, die beim Lesen etwas zurückgeben; Ich bin mir sicher, dass es verbessert werden kann, aber es gibt kaum mehr als ein paar Webcams und das läuft ziemlich schnell.
Tolle Antwort von @Patrick, aber ich würde sie gerne verbessern und kann noch nichts dazu sagen.
Ich denke, Patricks Setup geht davon aus, dass die Kameras keine leeren Indizes dazwischen haben. Aber in meinem Fall befand sich meine eingebaute Kamera auf Index 0 und die USB-Webcam auf Index 2. Also brach "if not cap.read()[0]" aus der while-Schleife bei Index 1 aus, ohne die anderen zu erfassen . Wir müssen angeben, wie viele Indizes wir durchgehen und prüfen möchten, und nur diejenigen nicht hinzufügen, die null sind.
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
Dies gab mir erfolgreich die Indizes, die ich brauche. Nochmals vielen Dank an Patrick für das Layout!
Dies ist ein allgemeines Problem von OpenCV, wie Sie unten sehen können. Es scheint, dass nur die eingebaute oder die erste USB-Kamera (nur wenn Sie keine eingebaute Kamera haben) in OpenCV funktioniert:
So verwenden Sie eine Kamera mit OpenCV
Zugriff auf USB-Webcam über OpenCV, Cygwin nicht möglich
OpenCV-Erfassung von USB, nicht von iSight (OSX)
Derzeit gibt es keine Möglichkeit, die Anzahl der Kameras zu extrahieren, wie in dieser Funktionsanfrage aufgeführt:
https://code.ros.org/trac/opencv/ticket/935
Es ist möglich, eine Liste von Kameras zu erstellen, ohne cap.read() zu verwenden.
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)