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

标签 qt ubuntu qpainter qimage qpixmap

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

我做了一些研究和测试,在 X11 中绘制 QPixMap 可以比绘制 QImage 快 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 转换或以其他方式优化绘图吗?

    最佳答案

    这也是我的问题。
    相机帧在 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;
    }
    

    关于qt - 优化 QPainter 绘图 & 将 QVideoFrame 直接转换为 QPixMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23605074/

    相关文章:

    c++ - Qt 尚未移植到此操作系统

    找不到 Maven 3.0.4 安装到 Ubuntu mvn

    docker - 尝试构建 Docker 镜像时找不到 Conda

    c++ - 如何为 drawText 旋转文本?

    c++ - 如何将 QAction 添加到 QToolBar 中的特定位置

    c++ - 使用 Qt 在后台线程中定期执行某些 lambda func 的正确方法是什么?

    python - 使用python按周汇总数据

    c++ - Qt:制作不同颜色的堆叠条形图

    qt4 - 如何使 QImage 或 QPixmap 半透明 - 或者为什么 setAlphaChannel 过时?

    c++ - 如何只设置QTabWidget背景色样式表