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 раз в секунду.