2015-12-14 25 views
5

Ho sviluppato un progetto di analisi delle immagini in tempo reale utilizzando C++ e OpenCV che richiedono l'estrazione di frame da una webcam. Sto incontrando problemi nel tentativo di estrarre questi frame con qualsiasi tipo di velocità - attualmente posso gestire solo circa 18 fps. Ecco il semplice codice che sto usando per estrarre fotogrammi da webcam:Estrazione veloce dei frame dalla webcam: C++ e OpenCV rispetto a Matlab

#include "opencv2/highgui/highgui.hpp" 
#include <iostream> 
#include <ctime> 

using namespace std; 
using namespace cv; 

int main (int argc, char* argv[]) 
{ 

    VideoCapture cap(0); 
    if(!cap.isOpened()) return -1; 
    namedWindow("video", CV_WINDOW_AUTOSIZE); 

    clock_t start = clock(); 

    for (int i = 0; i < 101; ++i) 
    { 
     Mat frame; 
     cap >> frame; 
     imshow("video", frame); 
     waitKey(1); 
    } 

    clock_t finish = clock(); 

    double time_elapsed = (finish - start)/1000.0; 
    double fps = 100/time_elapsed; 

    cout << "\n\nTIME: " << time_elapsed << "\n\nFPS: " << fps << "\n\n"; 

    return 0; 
} 

Ho provato altri codici, ma nessuno mi permetta di estrarre i fotogrammi più veloce di 18 fps. Spero di raggiungere velocità simili a quello che posso ottenere in Matlab di 40 - 50 fps (utilizzando il seguente codice):

vid = videoinput('winvideo', 1, 'MJPG_640x480'); 
triggerconfig(vid, 'manual');  
start(vid); 

tic; 

for k = 1:100; 
    clc; 
    disp(k); 
    I = peekdata(vid, 1); 
    imshow(I); 
    drawnow; 
end 

toc; 

close(); 
stop(vid); 
delete(vid); 

Ho guardato utilizzando file mex per accelerare il mio progetto C++ e anche abilitando il supporto per GPU/CUDA ma ho riscontrato alcuni problemi hardware, quindi vedevo se c'è un approccio più semplice o qualcosa che mi manca nel mio codice corrente.

Grazie in anticipo!

EDIT Ho appena eseguito un'analisi delle prestazioni sul codice e c'è un paio di punti appiccicose e cioè:

VideoCapture cap(0);   10.5% 
cap >> frame;     36.8% 
imshow("video", frame);   31.6% 
+0

hai potuto testare il codice a http://answers.opencv.org/question/72386/how-to-get-fps-in-opencv-live -capture/fammi sapere se ci sarà qualche differenza. – sturkmen

+0

Grazie per la risposta. Provare entrambi gli esempi nel tuo collegamento mi ha permesso solo di raggiungere una media di 15fps. – MSTTm

+0

se si esegue la modalità di debug, provare la modalità di rilascio. – sturkmen

risposta

3

WAITKEY (1) sta rallentando giù. Puoi provare a farlo su ciascuno, ad esempio, decima iterazione. Vedi http://answers.opencv.org/question/52774/waitkey1-timing-issues-causing-frame-rate-slow-down-fix/

Il tuo modo di calcolare l'FPS è piuttosto scadente. Prova
double time_elapsed = (finish - start)/CLOCKS_PER_SEC; Non è garantito che CLOCKS_PER_SEC == 1000

+0

'waitKey (1)' dovrebbe rallentare solo 1 ms, potrebbe essere che la webcam sia lenta nella produzione dei frame. Questo non è raro con le webcam economiche – mirosval

+0

In realtà, invia tutti i messaggi ricevuti da una finestra, quindi richiede * almeno 1 ms. –

+0

Giusto, ma con 18 FPS hai 55ms per elaborare ogni fotogramma. A 30 FPS avresti comunque 33ms, quindi se il suo 1 o 5ms per 'waitKey (1)' non importa, penso. Finisci comunque per aspettare la webcam. – mirosval