如何实时对来自不同线程的图像进行可视化处理?

时间:2018-09-21 10:20:35

标签: qt opengl video video-capture qtopengl

我有4个相机对象。每个相机对象都独立刷新帧。我想在我的videowall类上可视化这些框架。基本上,我的拼接墙只是带有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个摄像机。如果我添加第4个相机,则三个(或两个)之一冻结。我知道该显示被调用,因为当我resizeWidget时,我得到了正确的Image更新。

制作videoWall的正确方法是什么?我应该用自己的窗口制作一个openglWidget,然后直接在此openglWidget上绘制图像吗? 我可以使用哪些工具来分析行为(似乎标准的msvs分析器还不够)。

1 个答案:

答案 0 :(得分:0)

我的设计:

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

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

诀窍是使用唯一的窗口,但每个摄像机使用不同的glViewport


其他解决方案是在整个窗口中使用纹理,并更新每个摄像机使用的矩形。