码农知识堂 - 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
  • 相关阅读:
    Qt 信号与槽
    【C++初阶】小白入门C++
    软导作业扫码
    分布式.分布式锁
    RabbitMQ核心总结
    shell小练习2
    Express框架连接MySQL及ORM框架
    跟着阿昌学习day3-【go基础知识】Content(上下文)探究
    Protocol buffe vs Json 为什么还会大量使用Json?
    海康威视综合安防平台视频摄像头接入Java
  • 原文地址:https://blog.csdn.net/LCHONSEONE/article/details/125612229
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号