0

我有 4 个相机对象。每个相机对象独立刷新帧。我想在我的视频墙类上可视化这些帧。基本上,我的拼接墙只是一个带有 draw Widget 方法的 gridlayout 子项。

每个相机对象都有 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 个摄像头。如果我添加第四台摄像机,三个(或两个)之一会冻结。我知道调用了显示,因为当我调整大小小部件时,我得到了正确的图像更新。

制作视频墙的正确方法是什么?要不要自己做一个openglWidget,自己的窗口,然后直接在这个openglWidget上画图?我可以使用哪些工具来分析行为(似乎标准的 msvs 分析器还不够)。

4

1 回答 1

0

我的设计:

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

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

诀窍是使用一个独特的窗口,但glViewport每个相机都不同。


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

于 2018-09-21T12:49:10.907 回答