您现在的位置是:首页 >其他 >关于QT5和qt6的Camera不同网站首页其他

关于QT5和qt6的Camera不同

sg-expert 2024-06-29 18:01:02
简介关于QT5和qt6的Camera不同

Qt5部分

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

举例代码

cameraImgCapture.h

#ifndef CAMERAIMGCAPTURE_H
#define CAMERAIMGCAPTURE_H

#include <QWidget>
#include <QDebug>
#include <QCamera>
#include <QCameraViewfinder>
#include <QCameraImageCapture>
#include <QLabel>
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

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();
}

可参考的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.QCamera对系统摄像头进行封装
2.QCameraViewfinder提供一个展示窗口
3.QCameraImageCapture对记录的媒体资源进行捕捉

Qt6部分

(1)设备发现

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

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

(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();

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

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。