2013-04-18 16 views
19

Sto provando a catturare lo streaming video dal mio Logitech C920 in OpenCV. Con Labview posso accedere a un flusso MJPG a 30 fps 1080p. In opencv sono limitato a 5fps o 640x480.Cattura 1080p a 30fps da logitech c920 con openCV 2.4.3

Ecco il codice rilevante per le impostazioni della fotocamera:

this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, 1920); 
this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, 1080); 
this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G')); 

Questi tutti di ritorno 1, ma io ottenere un flusso di 5 fps 1080p che corrisponde al flusso YUY2.
Se posso aggiungere la seguente riga:

this->camRef.set(CV_CAP_PROP_FPS, 30); 

Questo restituisce 0. ottengo un flusso di 30 fps a 640x480. Per me sembra che l'impostazione MJPG non sia accettata, ma non so cosa fare o come risolverlo.

MODIFICA: il seguente arresta il programma.

this->camRef.read(this->image); 
std::cout<< this->camRef.get(CV_CAP_PROP_FOURCC)       << std::endl; 
std::cout<< this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, config.width)   << std::endl; 
std::cout<< this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, config.height)  << std::endl; 
std::cout<< this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G')) << std::endl; 
std::cout<< this->camRef.get(CV_CAP_PROP_FOURCC)       << std::endl; 

Poi nel mio codice run ho il seguente:

void camera::run() 
{ 
    while(true) 
    { 
     if(this->camRef.read(this->image) == 0) 
     { 
      if(this->capture) 
      { 
       cv::imwrite(fileName,this->image); 
       this->count++; 
      } 
     } 
     msleep(15); 
    } 
} 

EDIT2: Soluzione è quella di impostare il codec FOURCC prima di impostare l'altezza e la larghezza della macchina fotografica.

+0

se si desidera impostare fps (deve essere supportato dalla fotocamera), è necessario farlo dopo impostazione codec, ma prima di larghezza/impostazioni altezza – MartinM

+1

Sembra che il tuo EDIT2 ti abbia dato 1080p a 30 fps. Dovrebbe essere trasformato in una risposta e accettato quindi per far sembrare il problema risolto. –

risposta

1

Cercare di ottenere primo fotogramma, dalla cattura, prima di qualsiasi cosa:

VideoCapture cap(0); 
if(!cap.isOpened()) 
return -1; 

Mat frame; 
cap >> frame; 
double fps; 
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 1080.0); 
cap.set(CV_CAP_PROP_FRAME_WIDTH, 1920.0); 
//add the loop here 

e verificare se funzionerà senza impostare MJPG. Se funzionerà, prova con MJPG.

Per me è un po 'strano che sia necessario ottenere il primo frame prima di impostare qualsiasi cosa, ma è l'unico modo in cui funziona per me (Windows 7 a 32 bit).



// edit:
Yo potrebbe tentare di utilizzare API diversa - vedere la seconda parte della mia risposta qui: https://stackoverflow.com/a/14188280/1598485 OpenCV sta cercando di utilizzare al meglio API di default, ma forse nella vostra caso alcune altre API funzioneranno meglio.

+0

Grazie per la risposta. Ho provato quello che hai detto e ora il mio codice si blocca prima di visualizzare un'immagine. cap.read restituisce 1 e poi si blocca quando tenta di leggere di nuovo dalla telecamera. –

+0

In quale linea? Si prega di mostrare il codice con questa linea contrassegnata. – cyriel

+0

Ho aggiornato la domanda originale per mostrare il codice richiesto. –

6

Poiché l'autore del post ha già trovato la soluzione ma non l'ha aggiunta come risposta, inserirò la soluzione qui.

è necessario impostare il codec prima di impostare la risoluzione voluta:

this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G')); 
this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, 1920); 
this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, 1080); 
+0

Grazie! Ha funzionato come dichiarato!D'altra parte, vorrei dire che sebbene questo consentirà la risoluzione fullHD @ 30, la qualità dell'immagine potrebbe essere molto scarsa (il tasso di compressione deve essere elevato per soddisfare la limitazione della larghezza di banda di USB 2.0) – cbuchart

Problemi correlati