Sono stato in grado di aggirare questo problema ripetendo gli indici della webcam fino a quando la lettura della fotocamera non restituisce più nulla:
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
Questo metodo restituisce un elenco di tutti gli indici che restituiscono qualcosa quando vengono letti; Sono sicuro che può essere migliorato, ma non ci sono quasi mai più di poche webcam e funziona abbastanza velocemente.
Ottima risposta di @Patrick, ma mi piacerebbe migliorarla e non posso ancora commentare.
Penso che l'impostazione di Patrick presupponga che le telecamere non abbiano indici vuoti tra di loro. Ma nel mio caso, la mia fotocamera integrata era all'indice 0 e la webcam USB era all'indice 2. Quindi "if not cap.read()[0]" è uscito dal ciclo while all'indice 1, senza mai catturare gli altri . Dobbiamo specificare quanti indici siamo disposti a esaminare e controllare, e semplicemente non aggiungere quelli che sono nulli.
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
Questo mi ha fornito con successo gli indici di cui ho bisogno. Ancora grazie a Patrick per il layout!
Questo è un problema generale di OpenCV, come puoi vedere di seguito. Sembra che solo la cam incorporata o la prima USB cam (solo se non hai una cam incorporata) funzioni in OpenCV:
Come utilizzare una fotocamera con OpenCV
Impossibile accedere alla webcam USB tramite OpenCV, Cygwin
Acquisizione OpenCV da USB non iSight (OSX)
Al momento, non è possibile estrarre il numero di telecamere, come elencato in questa richiesta di funzionalità:
https://code.ros.org/trac/opencv/ticket/935
È possibile creare un elenco di telecamere senza utilizzare 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)