调用摄像头,显示摄像头视频,截取图片,保存截取的图片,显示数据库的表格,点击表格中的数据,显示图片
摄像头相当于一个视频流,是通过输入或捕捉视频的硬件。在不同的系统环境或者是硬件条件下,需要选择不同的处理方法,在windows系统中,可以使用QT中提供的摄像头相关的类,来处理摄像头信息。
调用创建摄像头对象
同时创建一个数据表,表中记录拍摄时间和图片的存储路径
#include "widget.h"
#include "ui_widget.h"
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QTime>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//获取系统的所有可用的摄像头-------------------------------------------------------
QList<QCameraInfo> infos = QCameraInfo::availableCameras();
//第二步 遍历一下列表
//每一次取出的infos中的一个数据放入info中
foreach(QCameraInfo info , infos)
{
//打印一下摄像头的设备名称和设备信息
qDebug()<<info.deviceName()<<info.description();
//写入列表中显示
//要写deviceName,不能写description,
//因为在后面开启摄像头的时候,创建一个摄像头对象的时候,获取的是框框中的信息,必须是设备名字才能创建
ui->comboBox->addItem(info.deviceName());
}
//添加数据库的驱动-----------------------------------------------------------------
//1.添加驱动.将数据库的名字传进去
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
//2.指定一个数据库文件的路径,就相当于新建一个文件夹,里面去存放东西
db.setDatabaseName("user.db");
//3.打开数据库
//系统将user自动传入,返回一个布尔类型 打开成功返回true
//判断打开是否成功
if(!db.open()) //如果打开不成功
{
qDebug()<<"数据库打开失败";
}
//初始化数据库的模型-----------------------------------------------------------------------------------------
model = new QSqlTableModel(this);//关联对象,当前窗口
QString sql = QString("create table if not exists captbl(id integer primary key autoincrement,picpath ntext)");
QSqlQuery query;
if(!query.exec(sql))
{
qDebug()<<"创建表格失败!";
return;
}
//使能按钮
ui->JT->setEnabled(false); //截图按钮停止,是灰的,不能动
}
Widget::~Widget()
{
delete ui;
}
开启&关闭摄像头
//开启摄像头
void Widget::on_pushButton_clicked()
{
//构造一下摄像头对象
ca = new QCamera(ui->comboBox->currentText().toUtf8(),this);
ui->widget->show();
//创建截图对象的内存 截图软件要和摄像头对象相互关联
cap = new QCameraImageCapture(ca);
//将截图信号与显示截图的槽函数关联一下
//连接 截图信号和显示截图的槽函数 一旦发出imageCaptured截图信号,就触发截图的槽函数
connect(cap,&QCameraImageCapture::imageCaptured,this,&Widget::show_pic);
//先配置一下widget
//让ui->widget和主的widget成为兄弟关系
QCameraViewfinder *v = new QCameraViewfinder(ui->widget);
v->resize(ui->widget->size());
ca->setViewfinder(v);
v->show();
//启动摄像头
ca->start();
ui->JT->setEnabled(true);
}
//停止
void Widget::on_TZ_clicked()
{
//关闭摄像头
ca->stop();
//清空显示屏 假装清空
ui->widget->hide();//隐藏
}
截取视频流中的图片
截取一张
截图多张,与数据表结合,写入数据表中
//从视频中截取图片
void Widget::on_JT_clicked()
{
// //
// //保存一帧的数据 地址
// cap->capture("D:/qt_project/day8two/capture/1.jpg");
// //在ui中显示一下截图的图片 在这个路径中去得到这个图片
// QPixmap pix("D:/qt_project/day8two/capture/1.jpg");
// //设置图片和label一样大
// pix = pix.scaled(ui->label_pic->size());
// ui->label_pic->setPixmap(pix);
//------------------
//保存多张图片
QTime t = QTime::currentTime();
QString str = "D:/qt_project/day8two/capture/"+t.toString("hh-mm-ss")+".jpg";
qDebug()<<str;
//保存一帧的数据
cap->capture(str);
//绑定模型表 模型与表名绑定
model->setTable("captbl");
//创建一条空的记录
QSqlRecord record = model->record();
//把str的内容写入picpath这个属性中
record.setValue("picpath",str);
//尾插入法 -1是尾部
if(model->insertRecord(-1,record))
{
qDebug()<<"创建成功";
}
//提交修改
model->submitAll();
model->database().commit();
}
//显示截取图片的槽函数
void Widget::show_pic(int id, const QImage &pre)
{
//id 打印的是截图的张数
qDebug()<<id;
//将qimage转换成Qpixmap 都是用Qpixmap显示的
//fromImagey与QImage相连接
QPixmap pix = QPixmap::fromImage(pre);
//显示Qpixmap这个格式的图片
pix = pix.scaled(ui->label_pic->size());
ui->label_pic->setPixmap(pix);
}
查询图片并显示
//查询
void Widget::on_pushButton_2_clicked()
{
//先模型绑定
model->setTable("captbl");
//显示一下模型的内容
ui->tableView->setModel(model);
//查询
model->select();
}
//需要在ui界面中创建一个tabelview 右键 转到槽
//单击列表中的选项 显示对应的图片
void Widget::on_tableView_clicked(const QModelIndex &index)
{
QPixmap map = QPixmap(index.data().toString());//打开图片的路径
qDebug()<<index.data().toString();//打印出来的是图片你的路径
map = map.scaled(ui->label_pic->size());
ui->label_pic->setPixmap(map);
}