OpenCV:差的帧率有什么限制?

时间:2013-03-08 16:32:22

标签: c++ opencv

在带有PS3-Eye摄像头的Ubuntu 12.10上使用OpenCV 2.4.3.2 我无法捕获超过每秒约60帧(FPS)。相机本身可提供高达125 FPS的功率。我想知道什么限制了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不是问题因为我可以使用guvcview获得完整的120 FPS。

我将上面的代码修改为使用grab()retrieve() ,如下所示:

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

但帧率再次上限为~60 FPS

所以我怎么知道限制帧率的是什么?

2 个答案:

答案 0 :(得分:1)

切换到台式机(从笔记本电脑)后,我能够捕获完整的帧率。似乎OpenCVs捕获实现不如guvcview中那样有效。

答案 1 :(得分:0)

我在使用OpenCV和Delphi X6的win7 x64中遇到65 FPS限制的问题。建立的问题在cvWaitKey或/和Windows消息队列中,这限制了65 Hz的重绘。 解决方案 - 减少频繁调用cvWaitKey,每秒减少65次。