如何实时可视化来自不同线程的图像?
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 使用纹理并更新每个相机使用的矩形。
我有 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 使用纹理并更新每个相机使用的矩形。