优化QPainter绘图和&将QVideoFrame直接转换为QPixMap

时间:2014-05-12 09:10:33

标签: qt ubuntu qpainter qimage qpixmap

有关我的问题的一些背景信息。我的目标是优化来自网络摄像头的图像绘制,图像来自QVideoFrame,并且当前加载到QImage并从那里绘制。这个解决方案工作正常,但在X11上绘制QImage非常慢。绘制一张图像需要大约20毫秒,听起来并不多,但是当你为每一帧执行此操作时,这会将相机的帧速率降低一半。

我做了一些研究和测试,在X11中绘制QPixMaps可以比绘制QImages快10倍。

这是当前绘图过程的完成方式

if(mVFcurrentFrame.map(QAbstractVideoBuffer::ReadOnly))
{
QImage image(mVFcurrentFrame.bits(), mVFcurrentFrame.width(), mVFcurrentFrame.height(), mVFcurrentFrame.bytesPerLine(), imageFormat);
painter->drawImage(0,0,image); //Takes about 20ms
mVFcurrentFrame.unmap();     
}

到目前为止我尝试了什么:

  • 将QImage转换为QPixMap,但是转换速度与绘制Qimage一样慢

  • 使用QPixMap :: loadFromData()将QVideoFrame直接加载到QPixMap,无法使其正常工作。

所以我的问题是,我可以将QVideoFrame直接转换为QPixMap并绘制而不是使用QImage吗?如何在不使用QImage的情况下将QVideoFrame转换为QPixmap转换?

我尝试使用QPixMap :: loadFromData()方法来加载视频帧,但到目前为止我一直无法使其正常工作。

如果这不可能我可以将QImage线程化为QPixMap转换或以其他方式优化绘图吗?

1 个答案:

答案 0 :(得分:0)

这也是我的问题。 相机框架在QLabel中显示得非常慢。 我的代码在这里:

QCamera *camera = new QCamera(this);
camera->setCaptureMode(QCamera::CaptureViewfinder);
QVideoProbe *videoProbe = new QVideoProbe(this);
bool ret = videoProbe->setSource(camera);
if (ret) {
    connect(videoProbe, SIGNAL(videoFrameProbed(const QVideoFrame &)),
            this, SLOT(present(const QVideoFrame &)));
}
camera->start();

...
...

bool MainWindow::present(const QVideoFrame &frame)
{

    QVideoFrame cloneFrame(frame);
    if(cloneFrame.map(QAbstractVideoBuffer::ReadOnly))
    {
        QImage img(
                cloneFrame.size(), QImage::Format_ARGB32);
                qt_convert_NV21_to_ARGB32(cloneFrame.bits(),
                (quint32 *)img.bits(),
                cloneFrame.width(),
                cloneFrame.height());

        label->setPixmap(QPixmap::fromImage(img));

        cloneFrame.unmap();
    }

    return true;
}