【发布时间】:2018-09-21 10:20:35
【问题描述】:
我有 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 分析器还不够)。
【问题讨论】:
-
我曾经给SO: Qt C++ Displaying images outside the GUI thread (Boost thread) 写过一个答案,有点相似,但我不确定它是否适用于您的问题。你可以看看它(例如,如果你没有想法)。 ;-)
-
通过指向
OpenGLImageHolder::display的指针传递的QImage的所有权是什么?每当我看到这样的代码没有任何伴随的new/delete时,它就会引发各种警钟。另外,您是否在代码的其他地方使用OpenGL?如果不是,那么从QOpenGLWidget继承似乎有点过分——同样的工作可以用QWidget轻松完成。
标签: qt opengl video video-capture qtopengl