如何实时可视化来自不同线程的图像?

How to vizualize Images from different threads in real time?

我有 4 个相机对象。每个相机对象独立刷新帧。我想在我的拼接墙上显示这些帧 class。基本上,我的视频墙只是一个带有绘制小部件方法的网格布局子项。

每个相机对象都有 imageHolder 小部件。 ImageHolder 小部件是 qOpenglWidget 的子项

void OpenGLImageHolder::display(const QImage* img)
{
    m_image = img;
    this->update();
}

void OpenGLImageHolder::paintEvent(QPaintEvent*)
{

    QPainter painter(this);
    painter.drawImage(this->rect(), *m_image);
}

每个 Image Holder 都有一个 QTimer,并且 QTimer::timeOut() 连接到 OpenGLImageHolder::display()。

不幸的是,使用此设置,我只能同时可视化 3 个摄像头。如果我添加第 4 个摄像头,则三个(或两个)中的一个会冻结。我知道调用了 display,因为当我调整 Widget 大小时,我得到了正确的图像更新。

怎样做拼接墙才是正确的?我要不要自己做一个openglWidgetwindow,然后直接在这个openglWidget上画图? 我可以使用哪些工具来分析行为(似乎标准的 msvs 分析器还不够)。

我的设计:

每个相机都使用一个准备图像的线程。图像是在需要时或由计时器创建的。准备就绪后,线程向主线程发出信号。

主线程处理信号。将图像作为纹理加载到 GPU,并通过简单的四边形绘制它。

诀窍是使用唯一的 window,但每个相机使用不同的 glViewport


其他解决方案是对整个 window 使用纹理并更新每个相机使用的矩形。