Saya dapat mengatasi masalah ini dengan mengulangi indeks webcam hingga membaca bahwa kamera tidak lagi mengembalikan apa pun:
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
Metode ini mengembalikan daftar semua indeks yang mengembalikan sesuatu saat dibaca; Saya yakin ini dapat diperbaiki, tetapi hampir tidak pernah ada lebih dari beberapa webcam dan ini berjalan cukup cepat.
Jawaban yang bagus dari @Patrick, tapi saya ingin memperbaikinya dan belum bisa berkomentar.
Saya pikir pengaturan Patrick mengasumsikan bahwa kamera tidak memiliki indeks kosong di antaranya. Namun dalam kasus saya, kamera bawaan saya berada di indeks 0, dan webcam USB berada di indeks 2. Jadi "if not cap.read()[0]" keluar dari while loop di indeks 1, tidak pernah menangkap yang lain . Kita harus menentukan berapa banyak indeks yang ingin kita periksa dan periksa, dan jangan menambahkan indeks yang 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
Ini berhasil memberi saya indeks yang saya butuhkan. Sekali lagi, terima kasih kepada Patrick untuk tata letaknya!
Ini adalah masalah umum OpenCV, seperti yang Anda lihat di bawah. Tampaknya hanya kamera bawaan, atau kamera USB pertama (hanya jika Anda tidak memiliki kamera bawaan) yang berfungsi di OpenCV:
Cara menggunakan kamera dengan OpenCV
Tidak dapat mengakses webcam usb melalui OpenCV, Cygwin
Pengambilan OpenCV dari USB bukan iSight (OSX)
Saat ini, tidak ada cara untuk mengekstrak jumlah kamera, seperti yang tercantum dalam permintaan fitur ini:
https://code.ros.org/trac/opencv/ticket/935
Dimungkinkan untuk membuat daftar kamera tanpa menggunakan 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)