gpt4 book ai didi

c++ - Qt:获取线程成员函数的运行时间

转载 作者:太空宇宙 更新时间:2023-11-04 14:30:44 26 4
gpt4 key购买 nike

我希望使用 C++ 在单独的执行线程中以指定的最大帧速率从网络摄像头抓取帧。

为此,我使用了 OpenCV(用于网络摄像头)和 Qt(用于线程)。

我有一个线程CameraThread,它在启动相机的程序主线程中启动,然后通过 while 循环连续调用 CameraThread::getFrame():

void CameraThread::getFrame(VideoCapture& cap)
{
QElapsedTimer timer;
timer.start();

Mat frame;
cap >> frame;

// add frame to queue for processing
image_queue->add(frame);

int elapsed = timer.elapsed();

int min_time = ceil(1000.0 / frame_rate); // min_time in ms, frame_rate in fps
int time_left = min_time - elapsed;
if (time_left > 0)
msleep(time_left);

cout << "elapsed=" << elapsed << "ms ";
cout << "time_left=" << time_left << "ms" << endl;
}

但是,如果我将(例如)frame_rate 设置为 1 fps,则上述函数的典型输出为:

elapsed=300ms time_left=700ms
elapsed=8ms time_left=992ms
elapsed=7ms time_left=993ms
elapsed=7ms time_left=993ms
elapsed=8ms time_left=992ms
elapsed=7ms time_left=993ms
elapsed=7ms time_left=993ms
... etc

QElapsedTimer 在第一次调用 CameraThread::getFrame() 后搞砸了。

罪魁祸首似乎是对 msleep() 的调用。当我删除此调用时,QElapsedTimer 似乎按预期工作(~30 毫秒,对应相机的默认帧速率 30 fps)。但是,我要求 CameraThread 休眠指定的时间段以确保遵守最大帧速率。

我该如何解决这个问题?

最佳答案

如果您的方法满足以下条件,您可以在外部创建一个 QTimer 而不是 msleep:

QTimer* timer = new QTimer(this);
timer->setInterval( ceil(1000.0 / frame_rate) );
connect(timer, &QTimer::timeout, this, [this](){
getFrame(cap);
});
timer->start();

关于c++ - Qt:获取线程成员函数的运行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34512168/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com