qtimer 和 opencv 运行缓慢

Posted

技术标签:

【中文标题】qtimer 和 opencv 运行缓慢【英文标题】:qtimer and opencv running slow 【发布时间】:2015-06-10 18:45:33 【问题描述】:

我正在编写一个代码,它使用 QTimer 触发对 opencv videoCapture 的调用以读取视频帧。我通常会阅读大量视频,所以想知道有没有其他方法可以加快这个过程。

这里是我使用 QTimer 的代码的快照:

timer = new  QTimer();
timer->setTimerType(Qt::PreciseTimer);
connect(timer, SIGNAL(timeout()), this, SLOT(read_shape_params()));

//in a loop stop timer and setup the next video stream then start

void next()

  timer->stop();

   stream = new video_stream_reader();
   stream->setColorGray(grayImage);
   stream->set_begin_end(begin_at,end_at);
   stream->open(video_base_path+video_path);

   timer->start(0);


void shape_param_finder::read_shape_params()
   Mat frame;
   frame = stream->read_frame();


Mat video_stream_reader::read_frame()
   Mat frame;
   bool bSuccess = capture->read(frame);
   return frame;


【问题讨论】:

我不太明白你要达到什么目的,是不是计时器运行得太慢了? 是的,完全正确。 QTimer 真的很慢 这可能是因为您正在创建一个新的计时器对象。只需在循环之前创建一个 @RiyadhMohammed 您如何评价 QTimer 的速度? @UmNyobe 假设视频长度为 5 分钟。我的软件处理所有帧的时间超过 5 分钟。 【参考方案1】:

它与 QTimer 关系不大。但是

timer->start(0);

是个问题。 你的视频,你输入的摄像头有一个frame per second,表示产生帧的一段时期。例如,25fps 意味着您将在每个时间段获得一个新帧,在这种情况下为40ms

简答: 如果没有正确的硬件同步,请将计时器超时设置为1000 / expected fps

长答案:

带有timeout = 0 的计时器将尽可能快地安排read_shape_params。这意味着性能瓶颈最终是capture->read(frame);,假设代码的其他部分(显示等)运行良好。

关于capture->read(frame)的有3个案例:

    解决该时间段需要更多时间:您无能为力。会很慢。 时间完全相同。这是甜蜜点。这也不太可能。

    那个时间段的分辨率需要更少的时间:应该不错吧?错误的。您多次阅读相同的图像。这意味着充其量你会浪费 CPU 资源。在最坏的情况下,从您的角度来看,事情开始表现得像案例 1。那个怎么样?假设呈现一个帧需要 30 毫秒(阅读并显示,我假设你是线性执行的)。

    Read 1 : 30 ms, frame 1
    Read 2 : 30 ms, frame 1 // wasted read, the other party has not updated the frame yet
    Read 3 : 30 ms, frame 2 // your second frame has 60 ms latency, not 40 ms
    Read 4 : 30 ms, frame 3 // frame 3 has 120 ms latency, sweet spot.
    Read 5 : 30 ms, frame 3 // wasted read
    Read 6 : 30 ms, frame 4 // frame 3 has 120 ms latency, sweet spot.
    

如果除此之外你一直在排队等待显示,并且显示速度很慢,那么你感知的 fps 会更低。

您需要对 video_stream_reader::read_frame 是肯定的。 您还需要对负责显示 图片。我怀疑那里存在瓶颈。

【讨论】:

以上是关于qtimer 和 opencv 运行缓慢的主要内容,如果未能解决你的问题,请参考以下文章

使用 MingW 运行 OpenCV 项目时出现入口点错误

如何安装opencv

带有 Gstreamer 流的 OpenCV 具有延迟、缓慢和伪影

使用 opencv 2.4.3 在 Visual c++ 中读/写图像时出错

Opencv 3.0 加载人脸级联时出错

vs2012怎么配置opencv