2013-06-10 20 views
7

Sto catturando fotogrammi da una webcam utilizzando OpenCV in un'applicazione C++ sia sulla mia macchina Windows sia su un RaspberryPi (ARM, Debian Wheezy). Il problema è l'utilizzo della CPU. Ho solo bisogno di elaborare fotogrammi come ogni 2 secondi - quindi nessuna live view in tempo reale. Ma come riuscirci? Quale suggeriresti?OpenCV rallentamento acquisizione WebCam

  1. Grab ogni fotogramma, ma il processo solo alcuni: questo aiuta un po '. Ottengo i fotogrammi più recenti, ma questa opzione non ha un impatto significativo sull'utilizzo della CPU (meno del 25%)
  2. Grab/Elabora ogni frame ma inattivo: Buon impatto sull'utilizzo della CPU, ma i frame che ottengo sono vecchi (5-10 sec)
  3. Crea/Elimina videoCapture in ogni ciclo: Dopo alcuni cicli l'applicazione si arresta in modo anomalo, anche se VideoCapture viene ripulito correttamente.
  4. Qualche altra idea?

Grazie in anticipo

#include <opencv2/opencv.hpp> 
#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <iostream> 
#include <vector> 
#include <unistd.h> 
#include <stdio.h> 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    cv::VideoCapture cap(0); //0=default, -1=any camera, 1..99=your camera 

    if(!cap.isOpened()) 
    { 
     cout << "No camera detected" << endl; 
     return 0; 
    } 

    // set resolution & frame rate (FPS) 
    cap.set(CV_CAP_PROP_FRAME_WIDTH, 320); 
    cap.set(CV_CAP_PROP_FRAME_HEIGHT,240); 
    cap.set(CV_CAP_PROP_FPS, 5); 

    int i = 0; 
    cv::Mat frame; 

    for(;;) 
    { 
     if (!cap.grab()) 
      continue; 

     // Version 1: dismiss frames 
     i++; 
     if (i % 50 != 0) 
      continue; 

     if(!cap.retrieve(frame) || frame.empty()) 
      continue; 

     // ToDo: manipulate your frame (image processing) 

     if(cv::waitKey(255) ==27) 
      break; // stop on ESC key 

     // Version 2: sleep 
     //sleep(1); 
    } 

    return 0; 
} 

risposta

4
  1. Creare/Distruggere VideoCapture in ogni ciclo: non ancora testata

Può essere un po 'fastidioso su Windows (e forse anche su altri sistemi operativi) - Il primo fotogramma catturato dopo aver creato VideoCapture è solitamente nero o grigio. Il secondo fotogramma dovrebbe andare bene :)

Altre idee:
- Idea modificata nr 2 - dopo dormire afferrare 2 fotogrammi. Il primo fotogramma potrebbe essere vecchio, ma il secondo dovrebbe essere nuovo. Non è testato e generalmente non ne sono sicuro, ma è facile controllarlo.
- Alla fine, dopo il sonno, è possibile afferrare fotogrammi mentre si è in attesa (senza dormire) finché non si riprende lo stesso fotogramma due volte (ma potrebbe essere difficile ottenere in particolare su RasberryPi).

+1

La tua prima altra idea ha funzionato abbastanza bene. Sto afferrando almeno 3 fotogrammi prima di continuare. La CPU è circa il 20% e l'offset/ritardo è accettabile. – Matthias

Problemi correlati