OpenCV замедляет захват веб-камеры

Я снимаю кадры с веб-камеры с помощью OpenCV в приложении C ++ как на моей машине с Windows, так и на RaspberryPi (ARM, Debian Wheezy). Проблема в использовании процессора. Мне нужно обрабатывать кадры, как каждые 2 секунды, так что в режиме реального времени нет просмотра в реальном времени. Но как этого добиться? Какой из них вы бы предложили?

  1. Возьмите каждый кадр, но обработайте только некоторые: Это немного помогает. Я получаю самые последние кадры, но эта опция не оказывает существенного влияния на загрузку процессора (менее 25%)
  2. Захватить / обработать каждый кадр, но спать: Хорошее влияние на загрузку процессора, но фреймы, которые я получаю, старые (5-10 секунд)
  3. Создать / уничтожить VideoCapture в каждом цикле: После нескольких циклов приложение вылетает — даже если VideoCapture очищен правильно.
  4. Любая другая идея?

заранее спасибо

#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;
}

8

Решение

  1. Создание / уничтожение VideoCapture в каждом цикле: еще не проверено

Это может быть немного проблематично в Windows (и, возможно, в других операционных системах). Первый кадр, захваченный после создания VideoCapture, обычно черный или серый. Второй кадр должен быть в порядке 🙂

Другие идеи:
— модифицированная идея № 2 — после сна захватить 2 кадра. Первый кадр может быть старым, но второй должен быть новым. Это не проверено, и, как правило, я не уверен в этом, но это легко проверить.
— В конце концов, после сна вы можете захватывать кадры в цикле while (без сна), ожидая, пока вы не захватите один и тот же кадр дважды (но это может быть трудно сделать, особенно на RasberryPi).

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]