convert QVideoFrame to QImage

匿名 (未验证) 提交于 2019-12-03 02:26:02

问题:

I want to get every frames from a QMediaPlayer and convert it to QImage (or cv::Mat)

so I used videoFrameProbed signal from QVideoProbe:

connect(&video_probe_, &QVideoProbe::videoFrameProbed,           [this](const QVideoFrame& currentFrame){    //QImage img = ?? } 

But I didn't find any way for getting QImage from QVideoFrame!

How can I convert QVideoFrame to QImage ?!

回答1:

You can use QImage's constructor:

 QImage img( currentFrame.bits(),              currentFrame.width(),              currentFrame.height(),              currentFrame.bytesPerLine(),              imageFormat); 

Where you can get imageFormat from pixelFormat of the QVideoFrame:

 QImage::Format imageFormat = QVideoFrame::imageFormatFromPixelFormat(currentFrame.pixelFormat()); 


回答2:

For QCamera output, that method doesn't always work. In particular, QVideoFrame::imageFormatFromPixelFormat() returns QImage::Format_Invalid when given QVideoFrame::Format_Jpeg, which is what's coming out of my QCamera. But this works:

QImage Camera::imageFromVideoFrame(const QVideoFrame& buffer) const {     QImage img;     QVideoFrame frame(buffer);  // make a copy we can call map (non-const) on     frame.map(QAbstractVideoBuffer::ReadOnly);     QImage::Format imageFormat = QVideoFrame::imageFormatFromPixelFormat(                 frame.pixelFormat());     // BUT the frame.pixelFormat() is QVideoFrame::Format_Jpeg, and this is     // mapped to QImage::Format_Invalid by     // QVideoFrame::imageFormatFromPixelFormat     if (imageFormat != QImage::Format_Invalid) {         img = QImage(frame.bits(),                      frame.width(),                      frame.height(),                      // frame.bytesPerLine(),                      imageFormat);     } else {         // e.g. JPEG         int nbytes = frame.mappedBytes();         img = QImage::fromData(frame.bits(), nbytes);     }     frame.unmap();     return img; } 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!