Я снимаю кадры с веб-камеры с помощью OpenCV в приложении C ++ как на моей машине с Windows, так и на RaspberryPi (ARM, Debian Wheezy). Проблема в использовании процессора. Мне нужно обрабатывать кадры, как каждые 2 секунды, так что в режиме реального времени нет просмотра в реальном времени. Но как этого добиться? Какой из них вы бы предложили?
заранее спасибо
#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;
}
- Создание / уничтожение VideoCapture в каждом цикле: еще не проверено
Это может быть немного проблематично в Windows (и, возможно, в других операционных системах). Первый кадр, захваченный после создания VideoCapture, обычно черный или серый. Второй кадр должен быть в порядке 🙂
Другие идеи:
— модифицированная идея № 2 — после сна захватить 2 кадра. Первый кадр может быть старым, но второй должен быть новым. Это не проверено, и, как правило, я не уверен в этом, но это легко проверить.
— В конце концов, после сна вы можете захватывать кадры в цикле while (без сна), ожидая, пока вы не захватите один и тот же кадр дважды (но это может быть трудно сделать, особенно на RasberryPi).
Других решений пока нет …