Android下QVideoFrame转QImage不成功记录

1.由于QVideoFrame::image() const : unsupported pixel format Format_ABGR32 ,在转换时需要做个特殊处理如下,增加了android手机下的特殊格式处理:

if(frame.pixelFormat() == QVideoFrame::Format_ABGR32)  此部分代码

QImage imageFromVideoFrame(QVideoFrame &frame)
{
    qDebug() << "resolution:(" << frame.width() << ", " << frame.height() << ")";
    QImage image;
    if(frame.map(QAbstractVideoBuffer::ReadOnly)){
        QImage::Format fmt = QVideoFrame::imageFormatFromPixelFormat(frame.pixelFormat());
        if(fmt != QImage::Format_Invalid){
            qDebug() << "not invalid format.";
            image = QImage(frame.bits(), frame.width(), frame.height(), /*v.bytesPerLine(),*/fmt);
        }
        else if(frame.pixelFormat() == QVideoFrame::Format_ABGR32){
            const auto max = frame.width() * frame.height() * 4;
            std::vector< uchar > buf;
            buf.reserve( max );
            uchar * bits = frame.bits();

            static const size_t i1 = ( Q_BYTE_ORDER == Q_LITTLE_ENDIAN ? 2 : 0 );
            static const size_t i2 = ( Q_BYTE_ORDER == Q_LITTLE_ENDIAN ? 1 : 3 );
            static const size_t i3 = ( Q_BYTE_ORDER == Q_LITTLE_ENDIAN ? 0 : 2 );
            static const size_t i4 = ( Q_BYTE_ORDER == Q_LITTLE_ENDIAN ? 3 : 1 );

            for( auto i = 0; i < max; )
            {
                buf.push_back( bits[ i1 ] );
                buf.push_back( bits[ i2 ] );
                buf.push_back( bits[ i3 ] );
                buf.push_back( bits[ i4 ] );

                bits += 4;
                i += 4;
            }

            image = QImage( &buf[ 0 ], frame.width(), frame.height(), frame.bytesPerLine(),
                           QImage::Format_ARGB32 ).copy();

        }
        else
        {
            int nbytes = frame.mappedBytes();
            qDebug() << "invalid format. nbytes=" << nbytes;
            image = QImage::fromData(frame.bits(), nbytes);

            //image = frame.image();
        }
        frame.unmap();
    }
    return image.mirrored(true, true);
}

2.在Android下QVideoFrame转QImage转换的结果如下:

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
qvideoframemat是指将云从科技的开源库qvideoframe中的视频帧换成OpenCV中的Mat格式。在进行图像处理和计算机视觉任务时,我们经常需要使用OpenCV库来操作和处理图像,而qvideoframe是一个集成了视频帧处理功能的库。因此,将qvideoframe的视频帧换成Mat格式可以为我们提供更加方便的图像处理和计算机视觉操作。 换过程涉及到两个库的API调用。首先,我们需要使用qvideoframe库中提供的函数获取视频帧数据。然后,通过调用OpenCV中的API将这些数据换成Mat格式。具体步骤如下: 1. 首先,引入qvideoframe和opencv库的相关头文件。 ```cpp #include<qvideoframe.h> #include<opencv2/opencv.hpp> ``` 2. 通过qvideoframe库提供的方法获取视频帧数据,将其存储在一个qvideoframe对象中。 ```cpp qvideoframe::QVideoFrame frame; // 从视频流中获取帧数据 frame = ... // 获取视频帧数据的操作 ``` 3. 调用qvideoframe库中的API将视频帧数据换成OpenCV的Mat格式。 ```cpp cv::Mat img; if (frame.isValid()) { // 将qvideoframe换为Mat格式 QImage image = frame.image(); img = cv::Mat(image.height(), image.width(), CV_8UC4, image.bits(), image.bytesPerLine()).clone(); } ``` 4. 现在我们已经成功地将qvideoframe换成了Mat格式的图像,可以使用OpenCV库中的各种函数对图像进行处理。 通过以上步骤,我们可以将qvideoframe库中的视频帧换成了Mat格式。这样,我们就可以方便地利用OpenCV库的强大功能进行图像处理、特征提取、目标检测等计算机视觉任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值