码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Qt中显示摄像头数据(V4L2三)


    目录

    • 一、通过V4l2来采集用qt显示
      • 1.将V4L2获取摄像头数据封装成一个类
      • 2.设置开始按钮开始采集数据
      • 3.设置停止按钮停止采集数据
      • 4.设置定时器不断采集数据
    • 二、直接用qt多媒体模块来实现采集并且显示
      • 1.在qt工程文件中添加
      • 2.获取系统所有摄像头设备
      • 3.开启摄像头并且显示预览
      • 4.初始化抓取数据的对象
      • 5.发送抓取数据的信号
      • 6.数据抓取

    一、通过V4l2来采集用qt显示

    1.将V4L2获取摄像头数据封装成一个类

    class V4L2API
    {
    public:
        explicit V4L2API(const char *dev="/dev/video0");
        ~V4L2API();
    
        int video_init();//打开设备、设置采集格式等
        int video_start();//开始采集
        int video_stop();//停止采集
        int video_getframe(char *buffer, int *size);//读数据
        int video_destroy();//释放空间、关闭设备
        bool yuv422torgb24(unsigned char *buffer, unsigned char *rgbdata, int w, int h);//将YUV数据转化为RGB数据
    
    private:
        int fd;
        char dev[64];
        unsigned char *mmps[4];//保存映射空间首地址
        unsigned int mmpsize[4];
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    2.设置开始按钮开始采集数据

    void V4L2Win::on_startbt_clicked()
    {
        if(v4l2api == nullptr)
        {
            v4l2api = new V4L2API("/dev/video0");//初始化摄像头对象
        }
        v4l2api->video_start();//开始采集
        //启动定时器,开始采集
        mtimer.start(100);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3.设置停止按钮停止采集数据

    void V4L2Win::on_stopbt_clicked()
    {
        //停止定时器
        mtimer.stop();
        if(v4l2api != nullptr)
        {
            v4l2api->video_stop();//停止采集
            v4l2api->video_destroy();
            delete v4l2api;
            v4l2api = nullptr;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    4.设置定时器不断采集数据

    connect(&mtimer,&QTimer::timeout,this,&V4L2Win::get_frame);
    void V4L2Win::get_frame()
    {
        v4l2api->video_getframe(buffer,&size); //得到的是YUYV--4:2:2
        v4l2api->yuv422torgb24((unsigned char*)buffer, (unsigned char*)rgbdata, 640, 480); //把yuv4:2:2 转RGB
    
        QImage image((uchar*)rgbdata,640,480,QImage::Format_RGB888);
        ui->label->setPixmap(QPixmap::fromImage(image));
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    二、直接用qt多媒体模块来实现采集并且显示

    1.在qt工程文件中添加

    QT += multimedia
    QT += multimediawidgets
    
    • 1
    • 2
    QCamera  --摄像头设备
    QCameraViewfinder--预览显示
    QCameraImageCapture--数据抓取
    QCameraInfo---摄像头信息
    
    • 1
    • 2
    • 3
    • 4

    2.获取系统所有摄像头设备

    Cameralist = QCameraInfo::availableCameras();
    foreach (QCameraInfo info, Cameralist)
    {
        qDebug()<<info.position()<<info.deviceName();
        ui->comboBox->addItem(info.description());
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.开启摄像头并且显示预览

    QCameraInfo info = Cameralist.at(ui->comboBox->currentIndex()); //获取一个摄像头信息
    camera = new QCamera(info);//通过摄像头信息创建设备
    viewFinder = new QCameraViewfinder(ui->cameraView);//创建一个预览窗口
    camera->setViewfinder(viewFinder);
    viewFinder->resize(ui->cameraView->size());
    viewFinder->show();
    camera->start();//开始
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4.初始化抓取数据的对象

    imageCap = new QCameraImageCapture(camera);
        connect(imageCap,&QCameraImageCapture::imageCaptured,this,&ModelWin::get_frame);
    
    • 1
    • 2

    5.发送抓取数据的信号

    filename = QFileDialog::getSaveFileName(this);//选择文件存放的路径
    imageCap->capture();//发送一个信号
    
    • 1
    • 2

    6.数据抓取

    image.save(filename);
    
    • 1
  • 相关阅读:
    [Java Framework] [MQ] SpringBoot 集成RabbitMQ
    MacOS Monterey 12.6(21G115) OC 0.8.4 / Cl 5149 / PE 三分区原版黑苹果镜像
    前端页面滑动问题求解
    c语言字符串&结构体考试总结
    C专家编程 第3章 分析C语言的声明 3.6 typedef int x[10]和#define x int[10]的区别
    eslint+prettier 配置
    深度学习服务器怎么选?哪个更划算?
    bootstrap学习(一)
    0006__js库中文版
    查看系统信息和关机及重启操作
  • 原文地址:https://blog.csdn.net/LCHONSEONE/article/details/125612229
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | 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号