2011-09-06 14 views
21

Desidero ottenere il numero di telecamere disponibili.Come contare le telecamere in OpenCV 2.3?

ho provato a contare le telecamere in questo modo:

for(int device = 0; device<10; device++) 
{ 
    VideoCapture cap(device); 
    if (!cap.isOpened()) 
     return device;   
} 

Se ho una macchina fotografica collegata, non è mai riuscito ad aprire. Così ho provato ad ascoltare in anteprima diversi dispositivi, ma ottengo sempre l'immagine della mia macchina fotografica.

Se si collega una seconda telecamera, dispositivo 0 è telecamera 1 e dispositivo 1-10 sono telecamera 2.

Credo che c'è un problema con i dispositivi DirectShow.

Come risolvere questo problema? O c'è una funzione come in OpenCV1 cvcamGetCamerasCount()?

Sto usando Windows 7 e fotocamere USB.

risposta

10

OpenCV non ha ancora API per enumerare le telecamere o ottenere il numero di dispositivi disponibili. Vedi this ticket sul bug tracker OpenCV per i dettagli.

Il comportamento di VideoCapture non è definito per i numeri di dispositivo superiori al numero di dispositivi collegati e dipende dall'API utilizzata per comunicare con la fotocamera. Vedi OpenCV 2.3 (C++,QtGui), Problem Initializing some specific USB Devices and Setups per l'elenco di API utilizzate in OpenCV.

5

faccio questo in Python:

def count_cameras(): 
    for i in range(10): 
     temp_camera = cv.CreateCameraCapture(i-1) 
     temp_frame = cv.QueryFrame(temp_camera) 
     del(temp_camera) 
     if temp_frame==None: 
      del(temp_frame) 
      return i-1 #MacbookPro counts embedded webcam twice 

Purtroppo Opencv apre l'oggetto Camera in ogni caso, anche se non c'è nulla, ma se si tenta di estrarre il suo contenuto, non ci sarà niente da attribuire a. Puoi usarlo per controllare il numero di telecamere. Funziona su tutte le piattaforme che ho testato, quindi va bene.

Il motivo per il ritorno i-1 è che MacBookPro conta due volte la propria fotocamera incorporata.

+1

È perché se mettete 'id = -1' ci vorrà la prima macchina fotografica a disposizione .. – Lipis

10

Anche se si tratta di un vecchio post qui una soluzione per OpenCV 2/C++

/** 
* Get the number of camera available 
*/ 
int countCameras() 
{ 
    cv::VideoCapture temp_camera; 
    int maxTested = 10; 
    for (int i = 0; i < maxTested; i++){ 
    cv::VideoCapture temp_camera(i); 
    bool res = (!temp_camera.isOpened()); 
    temp_camera.release(); 
    if (res) 
    { 
     return i; 
    } 
    } 
    return maxTested; 
} 

Testato sotto Windows 7 x64 con:

  • OpenCV 3 [di generazione personalizzata]
  • OpenCV 2.4. 9
  • OpenCV 2.4.8

con 0 fino a 3 telecamere USB

+0

schiantarsi su OpenCV 2.4.8 durante l'apertura della fotocamera se non esiste. – Prasaathviki

+0

2.4.9 non si blocca per me (Windows 8.1). Tuttavia trova anche una telecamera che è bloccata da un processo diverso che si bloccherà se proverai a ricevere una nuova immagine e cercherò di usarla senza un controllo '.isEmpty' (perché l'immagine catturata da una telecamera bloccata è vuota). In qualche modo OpenCV ha bloccato la mia macchina fotografica e non lo ha sbloccato anche dopo il riavvio del PC, quindi ho dovuto disattivarlo nel sistema operativo e riattivarlo più tardi ... – Micka

+0

hai il tuo codice da qualche parte in Git, ho anche Windows 8.1 e vorrei verificare se si tratta di un problema di piattaforma Windows o di un bug OpenCV – BlouBlou

6

Questo è un post molto vecchio ma ho trovato che con Python 2.7 su Ubuntu 14.04 e OpenCv 3 nessuna delle soluzioni qui ha funzionato per me. Invece mi è venuta in mente qualcosa di simile in Python:

import cv2 

def clearCapture(capture): 
    capture.release() 
    cv2.destroyAllWindows() 

def countCameras(): 
    n = 0 
    for i in range(10): 
     try: 
      cap = cv2.VideoCapture(i) 
      ret, frame = cap.read() 
      cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 
      clearCapture(cap) 
      n += 1 
     except: 
      clearCapture(cap) 
      break 
    return n 

print countCameras() 

Forse qualcuno lo troverà utile.

0

Ho anche affrontato un problema simile. Ho risolto il problema utilizzando la libreria videoInput.h invece di Opencv per enumerare le telecamere e passare l'indice all'oggetto Videocapture. Ha risolto il mio problema.

0

Python 3.6:

import cv2 

# Get the number of cameras available 
def count_cameras(): 
    max_tested = 100 
    for i in range(max_tested): 
     temp_camera = cv2.VideoCapture(i) 
     if temp_camera.isOpened(): 
      temp_camera.release() 
      continue 
     return i 

print(count_cameras()) 
Problemi correlati