текущим решением выглядит следующим образом:Отображение потока изображений с Qt
//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 кадров в секунду. Проблема в том, что производительность очень мала с размером. При размере вокруг fullHD картина занимает 1-2 мс. Но если я изменю его размер до 4k, он становится ужасно лаги (16 мс). Есть ли способ реализовать ту же функциональность, но с меньшим потреблением ресурсов?
Теоретически, если я изменяю родительский класс на QOpenGLWidget, QPainter запускается с аппаратным ускорением. Но, делая это, он работает еще медленнее.
В OpenGL вы можете использовать двойную буферизацию, чтобы избежать этого. Возможно, вы можете иметь 2 PaintLabel и не показывать новое изображение до его загрузки. – JMA
Двойная буферизация на самом деле не изменяет тот факт, что рендеринг очень медленный. Я бы оценил его 3-5 кадров в секунду, в то время как камера производит 25. –