C++ qtimer和opencv运行缓慢

C++ qtimer和opencv运行缓慢,c++,qt,opencv,computer-vision,video-processing,C++,Qt,Opencv,Computer Vision,Video Processing,我正在编写一个代码,使用QTimer触发对opencv videoCapture的调用以读取视频帧。我通常会看大量的视频,所以我想知道有没有其他方法可以加速这个过程 下面是我使用QTimer的代码的快照: timer = new QTimer(); timer->setTimerType(Qt::PreciseTimer); connect(timer, SIGNAL(timeout()), this, SLOT(read_shape_params())); //in a loop s

我正在编写一个代码,使用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没有什么关系。但是

定时器->启动(0)

这是一个问题。 在您的视频中,您输入的相机每秒有一个
,这意味着产生帧的时间。例如,25fps意味着您将在每个时间段获得一个新帧,在这种情况下,
40ms

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

长答案:

超时时间为0的计时器将尽可能快地安排读取形状参数。这意味着性能瓶颈最终是
capture->read(frame),假设代码的其他部分(显示器等)工作正常

关于
capture->read(frame)
有3种情况:

  • 解决这个问题需要更多的时间:你什么都不能做。这将是缓慢的
  • 正好是同一时间。这是一个甜蜜的地方。这也不太可能
  • 它花费的时间更少,决议的时间段:应该是好的,对吗?错。您多次阅读同一图像。这意味着你最多只能浪费cpu资源。在最坏的情况下,从你的角度来看,事情开始像案例1那样发展。怎么样?假设显示一个帧需要30毫秒(阅读并显示,我假设你是线性的)

  • 若在此基础上,你们继续排队等待展示物品,而展示速度很慢,你们感知到的fps会更低

    • 您需要对
      video\u stream\u reader::read\u frame
      请确保。
    • 您还需要对显示 形象。我怀疑这是一个瓶颈。

    我真的不明白您想要实现什么,计时器是否运行得太慢?是的,确实如此。QTimer确实很慢,可能是因为您正在创建一个新的计时器对象。只需在loop@RiyadhMohammed你是如何评估QTimer的速度的?@UmNyobe让我们假设视频长度为5分钟。我的软件处理所有帧所需的时间超过5分钟。
    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.