C++ qtimer和opencv运行缓慢
我正在编写一个代码,使用QTimer触发对opencv videoCapture的调用以读取视频帧。我通常会看大量的视频,所以我想知道有没有其他方法可以加速这个过程 下面是我使用QTimer的代码的快照: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
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.