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 运行缓慢的主要内容,如果未能解决你的问题,请参考以下文章
带有 Gstreamer 流的 OpenCV 具有延迟、缓慢和伪影