要在QT中使用摄像头,就要链接多媒体模块以及多媒体工具模块

QT += multimedia
QT += multimediawidgets

废话少说,直接上代码,想说的都在代码里面斜体样式:
mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QCamera>
#include <QCameraViewfinder>
#include <QCameraImageCapture>
#include <QCameraInfo>
#include <QDateTime>
#include <QMessageBox>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_startBt_clicked();

    void on_photographBt_clicked();

    void take_photo(int id, const QImage &image);

private:
    Ui::MainWindow *ui;
    //摄像头对象指针
    QCamera* Camera;
    //摄像头的取景器
    QCameraViewfinder* CameraViewFinder;
    //存储摄像机设备信息
    QList<QCameraInfo> CameraInfoList;
    //记录摄像头内容
    QCameraImageCapture* CameraImageCapture;
    //照片的名字
    QString ImageName;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //若连接到多个摄像头设备,获取可使用的摄像头信息
    CameraInfoList = QCameraInfo::availableCameras();
    //遍历,将摄像头信息逐个添加到下拉列表当中
    QList<QCameraInfo>::const_iterator it;
    for(it=CameraInfoList.begin(); it!=CameraInfoList.end(); it++)
    {
        ui->deviceComboBox->addItem((*it).description());
    }
}

MainWindow::~MainWindow()
{
    delete ui;
}

//打开摄像头设备
void MainWindow::on_startBt_clicked()
{
    //获取到要打开的设备的名称
    QCameraInfo CameraInfo = CameraInfoList.at(ui->deviceComboBox->currentIndex());
    //创建摄像头对象
    Camera = new QCamera(CameraInfo);
    //创建取景器并将其附在要显示的区域
    CameraViewFinder = new QCameraViewfinder(ui->CameraLabel);
    Camera->setViewfinder(CameraViewFinder);
    //调整摄像头数据显示的大小
    CameraViewFinder->resize(ui->CameraLabel->width(), ui->CameraLabel->height());
    //显示摄像头取景器
    CameraViewFinder->show();
    //开启摄像头
    Camera->start();

    //创建获取一帧数据对象
    CameraImageCapture = new  QCameraImageCapture(Camera);
    //关联图像获取信号
    connect(CameraImageCapture, &QCameraImageCapture::imageCaptured, this, &MainWindow::take_photo);
}

//点击了拍照按键
void MainWindow::on_photographBt_clicked()
{
    //发送获取一帧数据的信号
    CameraImageCapture->capture();
}

void MainWindow::take_photo(int id, const QImage &image)
{
    //使用系统时间来命名图片的名称,时间是唯一的,图片名也是唯一的
    QDateTime dateTime(QDateTime::currentDateTime());
    QString time = dateTime.toString("yyyy-MM-dd-hh-mm-ss");
    //创建图片保存路径名
    QString filename = QString("./%1.jpg").arg(time);
    //保存一帧数据
    image.save(filename);
    //提示获取到了一帧数据
    QMessageBox::information(this, "提示:", "获取到一帧图片");
}

界面设计:
在这里插入图片描述
在QT当中使用摄像头的步骤是简单易懂的,若是使用V4L2框架进行数据拍摄的话就会有些繁琐一些,但繁琐自有其繁琐的好处。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐