0

在带有 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.

我修改了上面的代码以使用grab()retrieve()如下所示:

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

但帧速率再次被限制在 ~60 FPS

那么我怎么知道是什么限制了帧率呢?

4

2 回答 2

1

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

于 2013-04-01T08:41:27.757 回答
0

我在使用 OpenCV 和 Delphi X6 的 win7 x64 中遇到 65 FPS 限制的相同问题。已确定的问题出在 cvWaitKey 或/和 Windows 消息队列中,这将重绘限制在 65 Hz。 解决方案 - 减少调用 cvWaitKey 的频率,每秒减少 65 次。

于 2014-09-24T06:52:16.267 回答