2013-03-08 2 views
0

Использование 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 Как я могу определить, что ограничивает частоту кадров?

+0

60 FPS подозрительно выглядит как проблема vsync ... – vines

ответ

1

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

0

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

Смежные вопросы