最近用qt6搞了个调试摄像头的软件,其ui界面设计如下:
本篇主要讲讲获取摄像头以及抓拍功能的实现,对于ui界面,注意要把中间摄像头显示控件QWidget提升为QVideoWidget,鼠标焦点在控件右键点击提升为即可,如下:
下面是摄像头获取的关键代码:
在.h文件添加:
1、摄像头所需头文件
#include <QWidget>
//#include <QStandardItemModel>
#include <QMessageBox>
#include <QDir>
#include <QTimer>
#include <QTime>
#include <QMouseEvent>
#include <QKeyEvent>
//摄像头所需头文件
#include <QCamera>
#include <QMediaDevices>
#include <QMediaCaptureSession>
#include <QMediaRecorder>
#include <QImageCapture>
#include <QVideoWidget>
#include <QVideoSink>
2、获取摄像头函数
void getCamera();
3、摄像头相关变量
QList<QCameraDevice> list_cameras;
QScopedPointer<QCamera> my_camera;
QScopedPointer<QMediaRecorder> my_mediaRecorder;
QMediaCaptureSession my_captureSession;
QImageCapture *imageCapture;
bool camera_state;
在.cpp里添加:
1、获取摄像头函数实现,可放在构造函数里(我这里设定最多只有两个摄像头,用的两个按钮控制,如果有多个摄像头可以设定一个下拉框获取list_cameras里的设备名即可)
//获取摄像头信息
void Camera::getCamera()
{
list_cameras = QMediaDevices::videoInputs();
//判断设备数(设置最多两个设备,没有则不会读取设备信息)
switch(list_cameras.length()){
case 1:
ui->camera1_btn->setText(list_cameras[0].description());
break;
case 2:
ui->camera1_btn->setText(list_cameras[0].description());
ui->camera2_btn->setText(list_cameras[1].description());
break;
}
if(ui->camera1_btn->text() == "暂无设备")
{
ui->camera1_btn->setEnabled(false);
}
if(ui->camera2_btn->text() == "暂无设备")
{
ui->camera2_btn->setEnabled(false);
}
}
2、当获取到摄像头设备名后,点击对应按钮即可打开对应摄像头
//切换摄像头1
void Camera::on_camera1_btn_clicked()
{
//关闭摄像头
if(camera_state)
{
my_camera->stop();
camera_state = false; //更新摄像头状态
}
//新建并设置摄像头
my_camera.reset(new QCamera(list_cameras[0],this));
//捕获摄像头画面
my_captureSession.setCamera(my_camera.data());
//设置捕捉画面显示窗口
my_captureSession.setVideoOutput(ui->display_widget);
//启动摄像头
my_camera->start();
//更新摄像头状态
camera_state = true;
//抓拍静止图像
imageCapture = new QImageCapture;
my_captureSession.setImageCapture(imageCapture);
}
以下是抓拍的关键代码:
对于抓拍功能其实比较简单,就是抓拍到的截图文件路径麻烦点,具体代码如下:
//抓拍
void Camera::on_capture_btn_clicked()
{
QDir dir;
//没有photograph文件夹则创建
if(dir.exists("./photograph") == false)
{
dir.mkpath("./photograph");
}
//使用系统时间来命名图片的名称,时间是唯一的,图片名也是唯一的
QDateTime dateTime(QDateTime::currentDateTime());
QString time = dateTime.toString("yyyy-MM-dd-hh-mm-ss");
//创建图片保存路径名
QString filename = QDir::currentPath(); //获得当前路径
filename += "/photograph/photo_";
filename += QString("%1.jpg").arg(time);
if(!camera_state)
{
QMessageBox::warning(this, "警告", tr("抓拍失败,摄像头未打开!"));
return;
}
QMessageBox::information(this, "提示", tr("抓拍成功!"));
imageCapture->captureToFile(filename); //截图存储路径
}
点击抓拍按钮后,截图文件会保存在build目录下的photograph文件夹里,并以当前时间命名
关于摄像头简单的获取和抓拍功能暂时记录这么多,后面如果有接触更多摄像头的功能再补充吧。