Использование OpenCV 2.4.3.2 на Ubuntu 12.10 с камерой PS3-Eye Я не могу захватить более ~ 60 кадров в секунду (FPS). Сама камера обеспечивает до 125 FPS. Я хотел бы знать, что ограничивает частоту кадров в OpenCV. Итак, вот что я сделал до сих пор: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.
So Как я могу определить, что ограничивает частоту кадров?
60 FPS подозрительно выглядит как проблема vsync ... – vines