• 关于QT5和qt6的Camera不同


    Qt5部分

    使用下面这几个类读取摄像头的图像帧:
    QCamera
    QCameraViewfinder
    QCameraImageCapture。

    举例代码

    cameraImgCapture.h

    #ifndef CAMERAIMGCAPTURE_H
    #define CAMERAIMGCAPTURE_H
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    namespace Ui {
    class CameraImgCapture;
    }
    
    class CameraImgCapture : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit CameraImgCapture(QWidget *parent = nullptr);
        ~CameraImgCapture();
    
        void init();
    
    private slots:
        void on_pushButton_second_clicked();
        void on_imageCaptured(int id, QImage img);
        void on_pushButton_one_clicked();
    
    private:
        Ui::CameraImgCapture *ui;
        QCamera *camera;
        QCameraViewfinder *view;
        QCameraImageCapture *imgCapture;
        QVector<QLabel*> m_Labels;
    };
    
    #endif // CAMERAIMGCAPTURE_H
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    cameraImgCapture.cpp

    #include "cameraimgcapture.h"
    #include "ui_cameraimgcapture.h"
    
    CameraImgCapture::CameraImgCapture(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::CameraImgCapture)
    {
        ui->setupUi(this);
    }
    
    CameraImgCapture::~CameraImgCapture()
    {
        delete ui;
    }
    
    void CameraImgCapture::init()
    {
        m_Labels<<ui->label_1<<ui->label_2<<ui->label_3<<ui->label_4<<ui->label_5<<ui->label_6;
        camera = new QCamera;
        view = new QCameraViewfinder;
        imgCapture = new QCameraImageCapture(camera);
        connect(imgCapture,&QCameraImageCapture::imageCaptured,this,&CameraImgCapture::on_imageCaptured);
    
        ui->verticalLayout_2->addWidget(view);
    
        imgCapture->setCaptureDestination(QCameraImageCapture::CaptureToFile);
        camera->setCaptureMode(QCamera::CaptureStillImage);
        camera->setViewfinder(view);
        camera->start();
    }
    
    void CameraImgCapture::on_pushButton_second_clicked()
    {
        imgCapture->capture();
    }
    void CameraImgCapture::on_imageCaptured(int id,QImage img)
    {
        static int index = -1;
        index ++;
        if(index >=6){
            index = -1;
            return;
        }
        qDebug()<<"index"<<index;
        m_Labels.at(index)->setPixmap(QPixmap::fromImage(img).scaled(m_Labels.at(index)->size()));
    }
    
    void CameraImgCapture::on_pushButton_one_clicked()
    {
        init();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    可参考的cameraImgCapture.ui

    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
     <class>CameraImgCapture</class>
     <widget class="QMainWindow" name="CameraImgCapture">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>900</width>
        <height>667</height>
       </rect>
      </property>
      <property name="windowTitle">
       <string>MainWindow</string>
      </property>
      <widget class="QWidget" name="centralwidget">
       <widget class="QGroupBox" name="groupBox">
        <property name="geometry">
         <rect>
          <x>20</x>
          <y>10</y>
          <width>791</width>
          <height>581</height>
         </rect>
        </property>
        <property name="title">
         <string>GroupBox</string>
        </property>
        <widget class="QCameraViewfinder" name="viewfinder" native="true">
         <property name="geometry">
          <rect>
           <x>90</x>
           <y>70</y>
           <width>541</width>
           <height>361</height>
          </rect>
         </property>
        </widget>
       </widget>
      </widget>
      <widget class="QMenuBar" name="menubar">
       <property name="geometry">
        <rect>
         <x>0</x>
         <y>0</y>
         <width>900</width>
         <height>30</height>
        </rect>
       </property>
      </widget>
      <widget class="QStatusBar" name="statusbar"/>
     </widget>
     <customwidgets>
      <customwidget>
       <class>QCameraViewfinder</class>
       <extends>QWidget</extends>
       <header>PyQt5.QtMultimediaWidgets</header>
       <container>1</container>
      </customwidget>
     </customwidgets>
     <resources/>
     <connections/>
    </ui>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    三、总结
    1.QCamera对系统摄像头进行封装
    2.QCameraViewfinder提供一个展示窗口
    3.QCameraImageCapture对记录的媒体资源进行捕捉

    Qt6部分

    (1)设备发现

    让我们从设备发现开始。 QMediaDevices 类旨在为您提供有关可用音频和视频设备的信息。它将允许您列出可用的音频输入(通常是麦克风)、音频输出(扬声器和耳机)和摄像头。您可以检索默认设备,类还会通知您有关配置的任何更改,例如,当用户连接外部耳机时。

    QMediaDevices devices;
    connect(&devices, &QMediaDevices::audioInputsChanged, 
            []() { qDebug() << “available audio inputs have changed”; }
    
    • 1
    • 2
    • 3

    (2)捕获和记录

    捕获和记录功能在 Qt 6 中经历了最大的 API 更改。在 Qt 5 中,您必须神奇地将相机连接到记录器,而 Qt 6 现在带有更明确的 API 来设置捕获管道。
    Qt 6 中的中心类是QMediaCaptureSession。录制音频/视频或捕获图像时始终需要此类。要设置录音会话,您可以使用setAudioInput()将音频输入连接到会话,如果您想从相机录制,请使用setCamera()将相机连接到它。
    这里要注意的一件事是QAudioInput和QCamera充当两个输入通道。使用QAudioInput::setDevice()或QCamera::setCameraDevice()选择要使用的物理设备。选择设备后,QAudioInput和QCamera允许您更改该设备的属性,例如设置音量或相机的分辨率和帧速率。
    QMediaCaptureSession允许将音频和视频输出连接到它以进行预览和监视。要拍摄静止图像,请使用setImageCapture()将QImageCapture对象连接到它。
    要录制音频和视频,请将QMediaRecorder连接到会话。QMediaRecorder允许通过指定一个请求记录特定的文件格式和编解码器QMediaFormat。在 Qt 6 中,我们没有在此处提供跨平台 API,使用不同格式和编解码器的枚举。
    由于编解码器支持取决于平台,您还可以查询QMediaFormat以获取支持的文件格式和编解码器集。后端也将始终尝试将请求的格式解析为支持的格式。
    因此,例如,如果您请求带有 H265 视频编解码器的 MPEG4 文件,但不支持 H265,则它可能会回退到 H264 或其他受支持的编解码器。
    除了设置格式之外,您还可以在编码器上设置其他属性,例如质量、分辨率和帧率。

    QMediaCaptureSession session; QCamera camera;
    session.addCamera(&camera); QImageCapture imageCapture;
    session.addImageCapture(&imageCapture); camera.start();
    imageCapture.captureToFile(“mytmpimage.jpg”);
    
    QMediaRecorder recorder; session.setRecorder(&recorder);
    QMediaFormat format(QMediaFormat::MPEG4);
    format.setAudioCodec(QMediaFormat::AudioCodec::AAC);
    format.setVideoCodec(QMediaFormat::VideoCodec::H265);
    recorder.setMediaFormat(format);
    
    recorder.setOutputLocation(“mytmpcapture.mp4”); recorder.record();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    官方参考代码:https://doc.qt.io/qt-6/qtmultimedia-camera-example.html

  • 相关阅读:
    Java的jinfo命令使用详解
    数据库批处理
    ES6 Reflect
    wpf webBrowser控件 常用的函数和内存泄漏问题
    Ansible 快速入门到放弃
    DetailView/货币详情页 的实现
    Spring Bean 详解
    jenkins pipeline 通过withCredentials连接项目服务器进行自动部署
    EPLAN学习笔记1:连接定义点和电位定义点
    机械制造企业如何借助ERP系统,做好供应商管理?
  • 原文地址:https://blog.csdn.net/zjc156m/article/details/130900805