有关我的问题的一些背景信息。我的目标是优化来自网络摄像头的图像绘制,图像来自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转换或以其他方式优化绘图吗?
答案 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;
}