码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Qt 之 QVideoFrame转换为QImage


    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

    文章目录

    • 前言
    • 方法一 最简单
    • 方法二 依赖opencv
    • 方法三,qt5.15版本


    前言


    在qt框架下,实现相机预览的几种方式在qt相机预览已经描述过了,在该文章的几种方式中,往往需要用到本文的内容,即QVideoFrame与QImage的转换,本文描述下笔者用到的几种方法

    方法一 最简单

    该方法有点不依赖其他的c++库

    static QImage imageFromVideoFrame(const QVideoFrame& buffer)
    {
        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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    方法二 依赖opencv

    当方法一的方法行不通时,比如某些特殊的图片格式,QImage不支持的情况下可借鉴
    依赖opencv库做一些图像格式转换

    #include 
    void QImage imageFromVideoFrame(const QVideoFrame &frame)
    {
        QVideoFrame cloneFrame(frame);
        cloneFrame.map(QAbstractVideoBuffer::ReadOnly);
    
       int width = cloneFrame.width();
       int height = cloneFrame.height();
    
       QImage::Format format =  QVideoFrame::imageFormatFromPixelFormat(cloneFrame.pixelFormat());
    
       cv::Mat yuvimg(height * 3 / 2, width, CV_8UC1, (unsigned char *)cloneFrame.bits());
       cv::Mat rgbimg(height, width, CV_8UC3);
       cv::cvtColor(yuvimg, rgbimg, cv::COLOR_YUV2RGB_NV21);
       QImage image( rgbimg.data, rgbimg.cols, rgbimg.rows, rgbimg.step, QImage::Format_RGB888 );
       cloneFrame.unmap();
    	return image;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    方法三,qt5.15版本

    const QVideoFrame &frame;
    QImage image = frame.image(); // This function was introduced in Qt 5.15.
    QImage::Format ifmt = image.format();
    qDebug() << ifmt;
    emit frameAvailable(image);
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    物企大变局时代,SRM供应商采购系统助力企业打造物业采购数字化标杆
    FastDFS的集群部署
    四件不能对宝宝做的事,提早知道预防
    three.js 场景中如何彻底删除模型和性能优化
    使用BENCHMARKSQL工具对KingbaseES预热数据时执行:select sys_prewarm(‘NDX_OORDER_2 ‘)报错
    高效Java《Effective Java》3rd原文学习笔记-精华版(一)
    markdown的学习和使用
    HarmonyOS应用API手势方法-RotationGesture
    Qt | windows Qt6.5.3安卓环境搭建成功版(保姆级教程)
    Go语言错误处理最佳实践
  • 原文地址:https://blog.csdn.net/u011942101/article/details/126917796
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号