Tento problém se mi podařilo obejít opakováním indexů webové kamery, dokud čtení této kamery již nic nevrací:
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
Tato metoda vrací seznam všech indexů, které při čtení něco vracejí; Jsem si jistý, že se to dá vylepšit, ale málokdy existuje více než několik webových kamer a to běží docela rychle.
Skvělá odpověď od @Patrick, ale rád bych ji vylepšil a zatím nemohu komentovat.
Myslím, že Patricks setup předpokládá, že kamery mezi sebou nemají prázdné indexy. Ale v mém případě byla moje vestavěná kamera na indexu 0 a webová kamera USB na indexu 2. Takže „if not cap.read()[0]“ se vylomilo ze smyčky while na indexu 1 a nikdy nezachytilo ostatní . Musíme určit, kolik indexů jsme ochotni přejít a zkontrolovat, a prostě nepřidávat ty, které jsou 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
To mi úspěšně poskytlo indexy, které potřebuji. Ještě jednou díky Patrikovi za layout!
Toto je obecný problém OpenCV, jak můžete vidět níže. Zdá se, že v OpenCV funguje pouze vestavěná nebo první USB kamera (pouze pokud vestavěnou kameru nemáte):
Jak používat kameru s OpenCV
Nelze získat přístup k usb webové kameře přes OpenCV, Cygwin
Zachycení OpenCV z USB, nikoli iSight (OSX)
V současné době neexistuje způsob, jak extrahovat počet kamer, jak je uvedeno v této žádosti o funkci:
https://code.ros.org/trac/opencv/ticket/935
Je možné vytvořit seznam kamer bez použití 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)