关于我的问题的一些背景信息。我的目标是优化来自网络摄像头的图像的绘制,图像以 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();
}
到目前为止我已经尝试过:
所以我的问题是,我可以将 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/