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
- 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%)
- Grab/Elabora ogni frame ma inattivo: Buon impatto sull'utilizzo della CPU, ma i frame che ottengo sono vecchi (5-10 sec)
- Crea/Elimina videoCapture in ogni ciclo: Dopo alcuni cicli l'applicazione si arresta in modo anomalo, anche se VideoCapture viene ripulito correttamente.
- 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;
}
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