gpt4 book ai didi

c++ - 使用 Qt 显示图像流

转载 作者:搜寻专家 更新时间:2023-10-31 00:56:51 26 4
gpt4 key购买 nike

目前的解决方案是这样的:

//paintlabel.h
class PaintLabel : public QWidget
{
Q_OBJECT

public:
explicit PaintLabel(QWidget *parent = 0);

public slots:
void setImage(char *img_ptr, QSize img_size, int pitch);

protected:
void paintEvent(QPaintEvent *event) override;

private:
QImage image;

}

//paintlabel.cpp

PaintLabel::PaintLabel(QWidget *parent) : QWidget(parent)
{
setAttribute(Qt::WA_NoSystemBackground, true);
}

void PaintLabel::setImageLive(char *img_ptr, QSize img_size, int pitch)
{
image = QImage((uchar *)img_ptr, img_size.width(), img_size.height(), pitch, QImage::Format_RGB32).scaled(this->size());
update();
}

void PaintLabel::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter;
painter.begin(this);
if (!image.isNull()) {
const QPoint p = QPoint(0,0);
painter.drawImage(p, image);
}
painter.end();
}

我预计每秒 20-40 帧。问题是,性能随尺寸变化真的很糟糕。在全高清大小的情况下,绘画需要 1-2 毫秒。但如果我将它的大小调整为 4k,它就会变得非常滞后(16 毫秒绘画)。有没有什么方法可以实现相同的功能但资源消耗更少?

理论上,如果我将父类更改为QOpenGLWidget,QPainter 将以硬件加速运行。但是这样做,它运行得更慢。

最佳答案

首先,您的代码中的限制因素之一似乎是 scaled() 函数。尝试将其取出,您应该会看到一些加速。

其他问题仅仅是QImage性能的限制。有关更多信息,请参阅此问题。 How can QPainter performance be improved?

QPainter will use software rasterizer to draw QImage instances.

引用http://doc.qt.io/qt-5/topics-graphics.html获取更多信息。

你不能选择 QPixmap,因为你的整个缓冲区也会改变每一帧。

您可以尝试使用QOpenGLPaintDeviceQPainter 使用硬件加速。您尝试的另一种方法是 QOpenGLWidget

QOpenGLWidget - A painter can also be opened on a QOpenGLWidget. This is provided as a convenience, since technically this is no different than using QOpenGLPaintDevice.

引用上面相同的 qt 链接。

所以是的,这在技术上应该更快,但是因为您正在调整 Widget 的大小,从而调整 OpenGL Viewport 的大小,下面的缓冲区每次都会重新制作。因此,放缓幅度更大。请注意,QOpenGLWidget 会自行处理一些函数,例如 glViewport()。当您尝试优化性能时,这没有用。

这里有一些建议

  1. 我认为主要问题是 QImage 的处理。我建议您设置自己的 OpenGL 场景,只需使用一个四边形来渲染纹理,并尝试在每一帧写入纹理。缩放将在 GPU 上处理,因此它肯定会更快。

  2. 或者,您可以使用 glDrawPixels() 将图像从主机内存 (RAM) 渲染到帧缓冲区。尽管这不会为您处理缩放。引用https://www.opengl.org/sdk/docs/man2/xhtml/glDrawPixels.xml了解更多信息。

我目前正在使用 QGLWidget 和自定义 OpenGL 纹理和绘制调用来实现快速更新(>60 FPS)。我观察到这比 QImage/Qpixmap 方法快大约 8 到 10 倍。请注意,我的纹理尺寸从未超过 700x700。此外,我的图像始终存储在 GPU 内存中,并通过映射的 CUDA 内核进行更新。

您肯定会看到加速,但我不能保证它会满足您的 FPS 要求。

关于c++ - 使用 Qt 显示图像流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38585504/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com