OpenCV: Каково ограничение для плохой частоты кадров?

Используя OpenCV 2.4.3.2 в Ubuntu 12.10 с камерой PS3-Eye, я не могу захватывать более ~60 кадров в секунду (FPS). Сама камера обеспечивает скорость до 125 кадров в секунду. Я хотел бы знать, что ограничивает частоту кадров в OpenCV. Итак, вот что я сделал до сих пор:

#include <sys/time.h>
#include <time.h>
#include <iostream> // for standard I/O

using cv;
using std;

long time_diff( const timespec &t1, const timespec &t2 ) {
  return (long)(t2.tv_sec-t1.tv_sec)*1000000000 + (t2.tv_nsec-t1.tv_nsec);
}

int main(int argc, char *argv[]) {
  VideoCapture cap(0); // open the default camera
  cap.set(CV_CAP_PROP_EXPOSURE, 0);
  cap.set(CV_CAP_PROP_FPS, 125);
  cap.set(CV_CAP_PROP_FRAME_WIDTH, 320);
  cap.set(CV_CAP_PROP_FRAME_HEIGHT, 240);
  if(!cap.isOpened())  // check if we succeeded
    return -1;
  Mat frame;
  timespec t_start, t_end;
  for(int i=1;;++i) {
    cap >> frame;
    clock_gettime(CLOCK_REALTIME, &t_end);
    if( i%20==0 )
      std::cout << "FPS ~= " << time_diff(t_start, t_end) << std::endl;
    clock_gettime(CLOCK_REALTIME, &t_start);
  }
}

Это выводит частоту кадров каждые 20 кадров в стандартный вывод. Обратите внимание, что мне пришлось пропатчить источник, чтобы правильно установить частоту кадров для камеры PS3-Eye.

Сначала я установил частоту кадров 30 (cap.set(CV_CAP_PROP_FPS, 30);) чтобы убедиться, что мои измерения верны. Затем с использованием более высокой частоты кадров сообщаемая частота кадров ограничивается ~60 FPS.

USB не проблема, потому что я могу получить полный 120 FPS с guvcview,

Я изменил код выше, чтобы использовать grab() а также retrieve() как это:

clock_gettime(ClOCK_REALTIME, &t_start);
cap->grab();
clock_gettime(ClOCK_REALTIME, &t_end);
cap->retrieve(frame);

но частота кадров снова ограничена ~60 FPS.

Так как я могу сказать, что ограничивает частоту кадров?

2 ответа

Решение

После переключения на настольный компьютер (с ноутбука) я смог захватить полную частоту кадров. Кажется, реализация захвата OpenCV не так эффективна, как в guvcview.

У меня та же проблема с лимитом 65 FPS в win7 x64 с OpenCV и Delphi X6. Обнаружена проблема в cvWaitKey и / или в очереди сообщений Windows, которая ограничивает перерисовки в 65 Гц. Решение - вызывать cvWaitKey реже, менее 65 раз в секунду.

Другие вопросы по тегам