1、在Qt的pro文件中添加模块
QT += multimedia multimediawidgets
这一行代码是用来在项目中使用Qt的多媒体模块。
Qt Multimedia 是Qt的一个重要模块,它提供了许多C++类和QML模块来进行多媒体内容的展示和处理,还提供了一些访问录音机和摄像头的必要的API。
Qt Multimedia Widgets 提供了简易直观的多媒体窗体。在使用时,需要包含这两个模块对应的头文件,建议根据需要包含相关头文件。对于Qt工程的pro文件,需要将这两个模块添加在Qt的pro文件中以在项目中导入该模块。
2、需要使用到的用于处理和操作摄像头相关功能的类库
①添加头文件
#include <QCamera> //管理摄像头的大类
它是用于管理摄像头设备及其功能的基类。
#include <QCameraInfo> //管理摄像头的设备表
该类提供有关可用摄像头设备的信息,如设备名称、设备ID等。
#include <QCameraViewfinder> //管理摄像头显示区域
用于管理摄像头视图查找器,即显示摄像头实时画面的区域。
#include <QCameraImageCapture> //管理图片
用于在摄像头设备上捕获图像,以及管理图像的捕获和保存。
#include <QDateTime> //管理时间
#include <QString> //管理字符串
这些类库通常用于构建具有摄像头功能的Qt应用程序,如视频录制、图片捕捉、摄像头控制等。通过使用这些类库,你可以方便地访问和控制摄像头设备,并与其交互。请注意,为了使用这些类库,你需要先确保你的Qt开发环境已经配置正确,并且支持摄像头功能。
②在private中创建摄像头对象
private:
QCamera *Camera; //使用这个类,实例化出来,用指针接收
QList<QCameraInfo> Infolist; //用于保存可用摄像头
QCameraViewfinder *Viewfinder;
QCameraImageCapture *ImageCapture;
3、打开摄像头
1、调用可选摄像头
//获取当前可用摄像头设备
Infolist = QCameraInfo::availableCameras();
//定义it指针(作用:遍历可用摄像头设备的表)
QList<QCameraInfo>::iterator it;
//循环操作,将可用摄像头设备名称添加到下拉框中
for(it = Infolist.begin(); it != Infolist.end(); it++)
{
//在ui的cbb组件(下拉框)中添加一个新的项,description()返回一个字符串
ui->cbb->addItem((*it).description());
}
2、选择摄像头,使用Qt库中的QCamera类来初始化一个摄像头对象
//获取使用摄像头的名称(通过ui->cbb->currentIndex()获取当前选择的索引,然后通过At函数获取该索引处的QCameraInfo对象)
QCameraInfo Infoname = Infolist.at(ui->cbb->currentIndex());
//然后使用这个QCameraInfo对象来初始化一个新的QCamera对象。
Camera = new QCamera(Infoname);
3、摄像头显示设置
//QCameraViewfinder是Qt框架中用于表示摄像头预览窗口的类
//设置摄像头显示的区域
Viewfinder = new QCameraViewfinder(ui->lb1);
Camera->setViewfinder(Viewfinder);
//设置摄像头显示的范围
Viewfinder->resize(ui->lb1->width(),ui->lb1->height());
4、开启摄像头准备工作
Viewfinder->show();
Camera->start();
4、拍照
1、拍摄图片保存格式设置
//获取当前时间
QDateTime Time(QDateTime::currentDateTime());
//当前时间转变为文本格式
QString datetime = Time.toString("yyyy-mm-dd hh-mm-ss");
//组装文件名(路径+名称)
QString fliename = QString("D:/picture/%1.jpg").arg(datetime);
2、保存图片
//用于将图像对象(QImage)以给定的文件名('filename')保存为文件。
Image.save(filename);
3、图片显示设置
ui->lb2->setPixmap(QPixmap(fliename)); //显示图片
ui->lb2->setScaledContents(true); //自适应图片的大小
5、连接
1、捕获图像
//QCameraImageCapture用于在摄像头设备上捕获图像,以及管理图像的捕获和保存。
ImageCapture = new QCameraImageCapture(Camera);
connect(ImageCapture,&QCameraImageCapture::imageCaptured,this,&MainWindow::tack_pic);
6、
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QCamera> //管理摄像头的大类
#include <QCameraInfo> //管理摄像头设别表
#include <QCameraViewfinder> //管理摄像头显示区域
#include <QCameraImageCapture> //管理图片
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_pb_option_clicked();
void on_pb_camera_clicked();
void tack_pic(int id,const QImage &Image);
private:
Ui::MainWindow *ui;
QCamera *Camera; //使用这个类,实例化出来,用指针接收
QList<QCameraInfo> Infolist; //用于保存可用摄像头
QCameraViewfinder *Viewfinder;
QCameraImageCapture *ImageCapture;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QCamera> //管理摄像头的大类
#include <QCameraInfo> //管理摄像头的设备表
#include <QCameraViewfinder> //管理摄像头显示区域
#include <QCameraImageCapture> //管理图片
#include <QDateTime> //管理时间
#include <QString> //管理字符串
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowTitle("拍摄照片");
setFixedSize(1020, 690);
//获取当前可用摄像头设备
Infolist = QCameraInfo::availableCameras();
//定义it指针,作用:遍历可用摄像头设备的表
QList<QCameraInfo>::iterator it;
//循环操作,将可用摄像头设备名称添加到下拉框中
for(it = Infolist.begin(); it != Infolist.end(); it++)
{
//在ui的cbb组件(下拉框)中添加一个新的项,description()返回一个字符串
ui->cbb->addItem((*it).description());
}
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pb_option_clicked()
{
//获取使用摄像头的名称
QCameraInfo Infoname = Infolist.at(ui->cbb->currentIndex());
Camera = new QCamera(Infoname);
Viewfinder = new QCameraViewfinder(ui->lb1);
//设置摄像头显示的区域
Camera->setViewfinder(Viewfinder);
//设置摄像头显示的范围
Viewfinder->resize(ui->lb1->width(),ui->lb1->height());
//摄像头设备开始工作
Viewfinder->show();
Camera->start();
ImageCapture = new QCameraImageCapture(Camera);
connect(ImageCapture,&QCameraImageCapture::imageCaptured,this,&MainWindow::tack_pic);
}
void MainWindow::tack_pic(int id,const QImage &Image)
{
//获取当前时间
QDateTime Time(QDateTime::currentDateTime());
//当前时间转变为文本格式
QString datetime = Time.toString("yyyy-MM-dd-hh-mm-ss");
//组装文件名(路径+名称)
QString filename = QString("E:/pic/%1.jpg").arg(datetime);
//保存图片
//用于将图像对象(QImage)以给定的文件名('filename')保存为文件。
Image.save(filename);
ui->lb2->setPixmap(QPixmap(filename)); //显示图片
ui->lb2->setScaledContents(true); //自适应图片的大小
}
void MainWindow::on_pb_camera_clicked()
{
ImageCapture->capture();
}