QT入门(十四)——摄像头的使用

调用摄像头,显示摄像头视频,截取图片,保存截取的图片,显示数据库的表格,点击表格中的数据,显示图片

在这里插入图片描述
在这里插入图片描述
摄像头相当于一个视频流,是通过输入或捕捉视频的硬件。在不同的系统环境或者是硬件条件下,需要选择不同的处理方法,在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);
}

  • 12
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值