QT调用摄像头实现拍照功能

文件配置

创建项目后

配置文件是.pro文件

首先在Qt中调用摄像头功能,通常会使用Qt Multimedia模块中的QCamera类。所以需要导入这个模块,这个模块在较新版本的Qt中是直接支持的,但你可能需要确保你的Qt环境已经包含了Multimedia模块。此外,你还需要确保你的操作系统支持摄像头,并且摄像头已经被正确安装和驱动。我使用的QT版本是5.14.2。

在Qt中调用摄像头功能时,Multimediawidgets模块也是一个重要的部分,特别是当你需要显示摄像头捕捉到的视频流时。Multimediawidgets模块提供了QCameraViewfinder类,这个类用于显示摄像头的实时视频预览。因为我们会在后面讲摄像头拍摄内容做一个实时预览,所以添加Multimediawidgets。

UI界面

我这里只是显示摄像头的实时预览和一个拍摄功能。

Qwidget是用来显示实时检测的视频画面;

textEdit是显示可调用的摄像头的设备名称;

pushbutton是实现取帧拍照功能的实现。

代码文件

1.头文件

导入我们会用到的类

#include <QCamera>
#include <QCameraImageCapture>
#include <QCameraViewfinder>

在Qt中,当想要使用摄像头进行视频预览和图像捕捉时,你会用到QCameraQCameraViewfinderQCameraImageCapture这几个类。

QCamera

QCamera类提供了对摄像头设备的访问。可以使用它来启动和停止视频捕捉,以及配置摄像头的各种参数(如分辨率、帧率等)。

QCameraViewfinder

QCameraViewfinder类是一个小部件,用于显示来自摄像头的实时视频流。它是QCamera的视图查找器,你需要将它与QCamera实例关联起来,以便在UI中显示视频预览。

QCameraImageCapture

QCameraImageCapture类提供了从摄像头捕捉静态图像的功能。你可以使用它来设置图像捕捉的参数(如分辨率、格式等),并处理图像捕捉事件(如捕捉完成)。

我们需要定义这些类的私有成员变量。

示例代码

    QCamera *ca;
    QCameraImageCapture *capture;

我们还需要pushbutton的槽函数声明,这里可以直接在ui界面选中控件转到槽函数,会自动在头文件中添加声明。

整体的头文件代码如下:
 

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QCamera>
#include <QCameraImageCapture>
#include <QCameraViewfinder>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
    QCamera *ca;
    QCameraImageCapture *capture;
};
#endif // MAINWINDOW_H

2.源文件

在源文件中主要包含两部分内容一个是设备的访问于ui控件的连接,还有就是我们实现静态图像捕获的功能函数的实现。

首先也是导入一些我们需要的类

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QCameraInfo>
#include<QCamera>
#include<QCameraImageCapture>
#include<QPixmap>
#include<QCameraViewfinder>
#include<QMessageBox>

QCameraInfo类是Qt Multimedia模块的一部分,用于查询系统当前可用的相机设备信息。它提供了一系列静态函数和方法,允许开发者检测并获取有关系统上安装的摄像头设备的信息。

这个类的导入是因为我还添加了一个textEdit的控件,是为了显示访问到的设备信息,因为这里调用摄像头设备,可能是外接的设备,代码中我使用的infos.value的索引是1,如果使用的是内置的比如笔记本自带的摄像头一般默认索引为0,也可以去电脑设备信息中进行查询。

ui->setupUi(this);
    QList<QCameraInfo> infos = QCameraInfo::availableCameras(); // 获取系统中可用的摄像头信息列表
    qDebug() << infos.value(1).deviceName() << ";" << infos.value(0).description(); // 打印第一个摄像头的设备名和描述

    QString camera = infos.value(1).deviceName(); // 获取第一个摄像头的设备名
    qDebug() << camera; // 打印设备名
    
    ui->textEdit->setText(QString("设备信息:").arg(camera));

    ca = new QCamera(camera.toUtf8(), this); // 尝试创建一个QCamera对象,但这里有一个问题
    

    QCameraViewfinder *v2 = new QCameraViewfinder(ui->camare); // 尝试将 QCameraViewfinder 设置为某个 QWidget 的子控件
    

    v2->resize(ui->camare->size()); // 尝试调整 QCameraViewfinder 的大小,同样因为 ui->camare 可能无效而有问题

    ca->setViewfinder(v2); // 将 QCameraViewfinder 设置为 QCamera 的视图查找器

    v2->show(); // 显示 QCameraViewfinder,但通常如果它是某个已显示 QWidget 的子控件,则不需要显式调用 show()

    ca->start(); // 启动摄像头

功能函数的定义,ui界面转到槽的时候源文件会自动定义空的功能函数的实现,只需要添加内容就行。

capture = new QCameraImageCapture(ca); 创建一个QCameraImageCapture对象,该对象与先前创建的QCamera对象ca相关联。  
所有通过capture对象进行的图像捕获操作都将使用ca摄像头。  

capture->capture("D:\\qt xiangmu\\photo.jpg"); 尝试使用capture对象捕获一张图像,并将其保存到指定的文件路径中。这里的路径被我硬编码为"D:\\qt xiangmu\\photo.jpg"。更换自己的路径。

QMessageBox::information(this, "good", "good");显示一个消息框,向用户显示信息“good”。  
这与图像捕获操作是独立的,它会在捕获操作启动后立即执行,而不管捕获操作是否成功。  

void MainWindow::on_pushButton_clicked()
{
    capture = new QCameraImageCapture(ca);
    capture->capture("D:\\qt xiangmu\\photo.jpg");
    QMessageBox::information(this,"good","good");
}

效果展示

可以按照以下步骤实现: 1. 在.pro文件中添加multimedia模块: ``` QT += multimedia ``` 2. 在代码中引入QCamera、QCameraViewfinder和QMediaRecorder头文件: ```c++ #include <QCamera> #include <QCameraViewfinder> #include <QMediaRecorder> ``` 3. 创建一个QCamera对象和一个QCameraViewfinder对象,并将QCameraViewfinder设置为QWidget的子类: ```c++ QCamera *camera; QCameraViewfinder *viewfinder; camera = new QCamera; viewfinder = new QCameraViewfinder; viewfinder->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); viewfinder->setFixedSize(640, 480); viewfinder->setVisible(true); camera->setViewfinder(viewfinder); ``` 4. 创建一个QMediaRecorder对象并设置输出格式、输出文件名和音视频编码器: ```c++ QMediaRecorder *recorder; recorder = new QMediaRecorder(camera); // 设置输出格式 QString fileName = "video.mp4"; QMediaMetaData mediaMetaData; mediaMetaData.insert(QMediaMetaData::Title, QVariant(fileName)); recorder->setMetaData(mediaMetaData); recorder->setOutputLocation(QUrl::fromLocalFile(fileName)); // 设置音视频编码器 QVideoEncoderSettings videoSettings = recorder->videoSettings(); videoSettings.setResolution(640, 480); QAudioEncoderSettings audioSettings = recorder->audioSettings(); recorder->setVideoSettings(videoSettings); recorder->setAudioSettings(audioSettings); ``` 5. 调用QCamera的start()函数开始预览,调用QMediaRecorder的record()函数开始录制,调用QMediaRecorder的stop()函数停止录制: ```c++ // 开始预览 camera->start(); // 开始录制 recorder->record(); // 停止录制 recorder->stop(); ``` 6. 调用QCamera的searchAndLock()函数锁定摄像头并进行拍照,调用QCamera的unlock()函数解锁摄像头: ```c++ // 拍照 camera->searchAndLock(); QImage image = viewfinder->grab().toImage(); image.save("photo.jpg"); camera->unlock(); ``` 完成以上步骤后,你就可以在Qt应用程序中调用摄像头,并实现拍照和录像功能了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值