Qt 数据库,人脸识别

news2024/10/11 23:46:13

数据库 

 

头文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QMainWindow>
#include<QSqlDatabase>
QT_BEGIN_NAMESPACE
namespace Ui { class widget; }
QT_END_NAMESPACE

class widget : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void on_addbtn_clicked();

    void on_showedit_clicked();

    void on_deledit_clicked();

    void on_sortbtn_clicked();

private:
    Ui::widget *ui;
    QSqlDatabase db;
};
#endif // WIDGET_H

源文件 

#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>
#include <QSqlRecord>

widget::widget(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::widget)
{
    ui->setupUi(this);

    // 检查是否已经存在名为 "stu.db" 的数据库连接
    if (!db.contains("stu.db")) {
        // 通过 QSQLITE 驱动创建或连接数据库
        db = QSqlDatabase::addDatabase("QSQLITE");
        db.setDatabaseName("stu.db");
    }

    // 尝试打开数据库,若打开失败则显示提示信息并返回
    if (!db.open()) {
        QMessageBox::information(this, "提示", "数据库打开失败: " + db.lastError().text());
        return;
    }

    // 创建数据表的 SQL 语句
    QSqlQuery query;
    QString sql = "CREATE TABLE IF NOT EXISTS stu (num INT PRIMARY KEY, name CHAR(50), sex CHAR(1), score DOUBLE)";

    // 执行创建表的 SQL 语句,若执行失败则显示错误信息并返回
    if (!query.exec(sql)) {
        QMessageBox::information(this, "提示", "数据表创建失败: " + query.lastError().text());
        return;
    }
}

widget::~widget()
{
    delete ui;
}

void widget::on_addbtn_clicked()
{
    // 从界面获取用户输入的数据
    int num = ui->numedit->text().toUInt();
    QString ui_name = ui->nameedit->text();
    QString ui_sex = ui->genderedit->text();
    double ui_score = ui->scoreedit->text().toDouble();  // 将文本转换为 double 类型

    // 检查输入数据是否完整,若不完整则提示用户并返回
    if (num == 0 || ui_name.isEmpty() || ui_sex.isEmpty() || ui_score == 0) {
        QMessageBox::information(this, "提示", "数据不完整");
        return;
    }

    // 生成插入数据的 SQL 语句
    QString sql = QString("INSERT INTO stu (num, name, sex, score) "
                          "VALUES (%1, '%2', '%3', %4);")
                          .arg(num)
                          .arg(ui_name)
                          .arg(ui_sex)
                          .arg(ui_score);

    QSqlQuery query;
    // 执行插入数据的 SQL 语句,若执行失败则显示错误信息,否则提示数据插入成功
    if (!query.exec(sql)) {
        QMessageBox::information(this, "提示", "插入数据失败: " + query.lastError().text());
    } else {
        QMessageBox::information(this, "提示", "数据插入成功");
    }
}

void widget::on_showedit_clicked()
{
    // 查询数据库中的所有数据
    QSqlQuery query("SELECT num, name, sex, score FROM stu");

    // 检查查询是否成功执行,若失败则显示提示信息并返回
    if (!query.exec()) {
        QMessageBox::information(this, "提示", "查询数据失败");
        return;
    }

    // 清空表格中的所有行
    ui->tableWidget->setRowCount(0);

    // 遍历查询结果并将每行数据插入到表格中
    int row = 0;
    while (query.next())
    {
        QSqlRecord record = query.record(); // 获取当前行的记录
        ui->tableWidget->insertRow(row); // 在表格中插入新行
        for (int j = 0; j < record.count(); j++)
        {
            // 将查询到的数据填入表格
            ui->tableWidget->setItem(row, j, new QTableWidgetItem(query.value(j).toString()));
        }
        row++; // 更新行索引
    }
}

void widget::on_deledit_clicked()
{
    // 获取当前选中的行号
    int row = ui->tableWidget->currentRow();
    if (row != -1) {
        // 如果选中了行,则删除该行
        ui->tableWidget->removeRow(row);
        QMessageBox::information(this, "提示", "行已经删除");
    } else {
        // 如果没有选中行,则提示用户
        QMessageBox::warning(this, "警告", "没选中行");
    }
}

void widget::on_sortbtn_clicked()
{
    // 查询数据库中的所有数据并按 num 降序排列
    QSqlQuery query("SELECT num, name, sex, score FROM stu ORDER BY num DESC");

    // 检查查询是否成功执行,若失败则显示提示信息并返回
    if (!query.exec()) {
        QMessageBox::information(this, "提示", "查询数据失败");
        return;
    }

    // 清空表格中的所有行
    ui->tableWidget->setRowCount(0);

    // 遍历查询结果并将每行数据插入到表格中
    int row = 0;
    while (query.next())
    {
        QSqlRecord record = query.record(); // 获取当前行的记录
        ui->tableWidget->insertRow(row); // 在表格中插入新行
        for (int j = 0; j < record.count(); j++)
        {
            // 将查询到的数据填入表格
            ui->tableWidget->setItem(row, j, new QTableWidgetItem(query.value(j).toString()));
        }
        row++; // 更新行索引
    }
}

 

人脸识别 

头文件

#include<opencv2/face.hpp>
#include <vector>
#include <map>
#include <QMessageBox>
#include <QDebug>
#include <QFile>
#include <QTextStream>
#include <QDateTime>
#include <QTimerEvent>
#include<QtSerialPort/QtSerialPort>
#include<QtSerialPort/QSerialPortInfo>
using namespace  cv;
using namespace cv::face;
using namespace std;
#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

源文件

#include "mainwindow.h"
#include "ui_mainwindow.h"

// 构造函数,初始化 MainWindow 并设置 UI
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this); // 设置 UI

    // 创建 VideoCapture 对象,用于打开和读取视频
    VideoCapture video;

    // 打开视频文件 "01.mp4"
    video.open("D:\\opencv\\resource\\01.mp4");

    // 如果视频无法打开,弹出提示信息
    if(!video.open("D:\\opencv\\resource\\01.mp4"))
    {
        QMessageBox::information(this,"提示","视频打开失败");
        return;
    }

    // 定义 Mat 对象,用于存储视频帧、灰度图像和直方图均衡化后的图像
    Mat src;   // 原始帧
    Mat gray;  // 灰度图像
    Mat dest;  // 直方图均衡化后的图像

    // 定义人脸检测的级联分类器对象
    CascadeClassifier c;

    // 定义矩形向量用于存储检测到的面部区域
    vector<Rect> faces;

    // 加载 Haar 级联分类器文件,用于人脸检测
    if(!c.load("D:\\opencv\\resource\\haarcascade_frontalface_alt.xml"))
    {
        QMessageBox::information(this,"提示","加载失败");
        return;
    }

    // 开始读取视频帧
    while(video.read(src))
    {
        // 水平翻转视频帧(镜像效果)
        cv::flip(src, src, 1);

        // 将原始视频帧转换为灰度图像
        cv::cvtColor(src, gray, CV_BGR2GRAY);

        // 对灰度图像进行直方图均衡化,增强图像对比度
        cv::equalizeHist(gray, dest);

        // 检测人脸区域
        c.detectMultiScale(dest, faces);

        // 在每个检测到的人脸区域绘制红色矩形框
        for(uint i=0; i<faces.size(); i++)
        {
            cv::rectangle(src, faces[i], Scalar(0, 0, 255), 2);
        }

        // 显示标记了人脸的原始视频帧
        imshow("src", src);

        // 如果需要,可以打开以下代码,显示灰度图和均衡化后的图像
        // imshow("Gray", gray); // 显示灰度图
        // imshow("Equalized", dest); // 显示直方图均衡化后的图像

        // 按下 "ESC" 键退出
        if(waitKey(30) == 27)
        {
            break;
        }
    }
}

// 析构函数,释放 UI 资源
MainWindow::~MainWindow()
{
    delete ui;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2206253.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HCIP-HarmonyOS Application Developer 习题(九)

(多选) 1、HarmonyOS多窗口交互能力提供了以下哪几种交互方式&#xff1f; A. 全局消息通知 B.平行视界 C.悬浮窗 D.分屏 答案&#xff1a;BCD 分析&#xff1a;系统提供了悬浮窗、分屏、平行视界三种多窗口交互&#xff0c;为用户在大屏幕设备上的多任务并行、便捷的临时任务…

项目 多人对话

项目 目标 多人对话仿真平台 技术点 socketIO异常多线程集合面向对象字符串GUI&#xff08;client&#xff09;… 项目开发方式 迭代开发-敏捷开发 建立模型 C/S 客户端/服务器模型(console) 服务器 package com.ffyc.tcp.one;import java.io.IOException; import java.i…

【大模型】RMS Normalization原理及实现

1.RMS Normalization的原理 说RMS Normalization之前&#xff0c;先讲Layer Normalization 和 Batch Normalization。 BN和LN是两种常见的归一化方法。它们的目的是帮助模型训练更稳定、收敛更快。BN是在Batch维度上进行归一化&#xff0c;即对同一batch中每个特征维度的值进行…

操作系统的了解及安装

一、linux系统认识 linux是指操作系统的内核&#xff0c;ubuntu是指基于这种内核的操作系统&#xff0c;Ubuntu属于Linux的一个发行版本&#xff0c;有简易的用户界面&#xff0c;完善的包管理系统&#xff0c;Ubuntu还对大多数硬件有着良好的兼容性&#xff0c;包含最新的图形…

一文区分SSTI 和 CSTI

前言 有时&#xff0c;SSTI&#xff08;服务器端模板注入&#xff09;和 CSTI&#xff08;客户端模板注入&#xff09;可能会由于它们相似的负载语法而混淆。这种混乱可能会导致渗透测试人员浪费时间尝试实现反向 shell&#xff0c;即使payload仅限于客户端。 定义 &#x1d…

10.11 QT数据库实现学生信息的增、删、改、查

.pro文件 QT core gui sql .h文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QSqlDatabase> //数据库管理类 #include <QSqlQuery> //数据库查寻类 #include <QSqlRecord> //记录类 #include <QMessage…

从数据到洞察:ChatGPT如何革新Python数据分析流程

导读&#xff1a;通过ChatGPT与Python的结合&#xff0c;数据分析流程得到了极大的优化和提升&#xff0c;从数据获取、清洗、代码生成到智能分析和可视化展示&#xff0c;每一步都变得更加高效和智能化。这不仅提高了分析的准确性和效率&#xff0c;还降低了技术门槛&#xff…

网络编程(18)——使用asio协程实现并发服务器

十八、day18 到目前为止&#xff0c;我们以及学习了单线程同步/异步服务器、多线程IOServicePool和多线程IOThreadPool模型&#xff0c;今天学习如何通过asio协程实现并发服务器。 并发服务器有以下几种好处&#xff1a; 协程比线程更轻量&#xff0c;创建和销毁协程的开销较…

【python】之socket编程(附带无偿源码)

本章内容 1、socket 2、IO多路复用 3、socketserver Socket socket起源于Unix&#xff0c;而Unix/Linux基本哲学之一就是“一切皆文件”&#xff0c;对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现&#xff0c;socket即是一种特殊的文件&…

【路径规划】自主机器人的路径规划和导航

摘要 本文讨论了如何利用路径规划算法对自主机器人进行路径规划和导航。自主机器人在环境中的路径规划是通过参考路径与机器人的当前位置进行比对&#xff0c;采用纯追踪算法&#xff08;Pure Pursuit&#xff09;进行路径跟踪&#xff0c;以确保机器人沿预定路线行驶。本文通…

黑马程序员C++核心编程学习笔记

黑马程序员C核心编程学习笔记 一、内存 1.1 内存四区 C程序在执行时&#xff0c;将内存大致分为4个区域&#xff1a;代码区&#xff0c;全局区&#xff0c;栈区&#xff0c;堆区 代码区&#xff1a;存放函数体的的二进制代码&#xff0c;操作系统管理。 &#x1f535;特点&a…

从数据管理到功能优化:Vue+TS 项目实用技巧分享

引言 在项目开发过程中&#xff0c;优化用户界面和完善数据处理逻辑是提升用户体验的重要环节。本篇文章将带你一步步实现从修改项目图标、添加数据、优化日期显示&#xff0c;到新增自定义字段、调整按钮样式以及自定义按钮跳转等功能。这些操作不仅提升了项目的可视化效果&am…

双十一适合买什么?2024双十一值得入手好物推荐

即将来临的2024年双十一&#xff0c;有哪些超值宝贝会令人忍不住疯狂下单呢&#xff1f;双十一购物狂欢节&#xff0c;这个一年一度的盛大庆典&#xff0c;向来使我们这些热衷于购物的消费者们激动万分。那么&#xff0c;在今年的双十一&#xff0c;究竟有哪些商品能够成功吸引…

利用FnOS搭建虚拟云桌面,并搭建前端开发环境(二)

利用FnOS搭建虚拟云桌面&#xff0c;并搭建前端开发环境 二 一、docker镜像二、环境配置三、核心环境配置流程文档 利用FnOS搭建虚拟云桌面&#xff0c;并搭建前端开发环境&#xff08;一&#xff09; 上一章安装了飞牛FnOS系统&#xff0c;界面如下&#xff0c;这一张配置前端…

Docker安装Minio+SpringBoot上传下载文件

Docker 安装Minio docker pull minio/minio docker images REPOSITORY TAG IMAGE ID CREATED SIZE minio/minio latest 162489e21d26 7 days ago 165MB nginx latest 7f553e8bbc89 7 days ago 192MB # 外挂磁盘存储使用 mkdir -p…

高清实拍类型视频素材网站推荐

大家好&#xff0c;我是一名新媒体创作者&#xff0c;今天想和大家分享一些平时常用的高清实拍类型视频素材资源。作为新媒体人&#xff0c;视频素材的质量直接影响作品的受欢迎程度&#xff0c;因此找到优质的视频素材库非常重要。接下来&#xff0c;我将为大家推荐一些非常优…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-12

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-12 1. Autoregressive Large Language Models are Computationally Universal D Schuurmans, H Dai, F Zanini - arXiv preprint arXiv:2410.03170, 2024 https://arxiv.org/pdf/2410.03170 自回归大型语言模型…

太速科技-628-基于VU3P的双路100G光纤加速计算卡

基于VU3P的双路100G光纤加速计算卡 一、板卡概述 基于Xilinx UltraScale16 nm VU3P芯片方案基础上研发的一款双口100 G FPGA光纤以太网PCI-Express v3.0 x16智能加速计算卡&#xff0c;该智能卡拥有高吞吐量、低延时的网络处理能力以及辅助CPU进行网络功能卸载的能力…

UE5安卓,多指点击时会调出控制台

参考文章&#xff1a; How to turn off "console window" on swipe (my Lemurs keep opening it!) - Platform & Builds / Mobile - Epic Developer Community Forums (unrealengine.com) 准确来说是4只手指同时在屏幕中按下。这个控制台能像编辑器那样&#xf…

浏览器和客户端结合的erp系统,java控制浏览器操作自动登录,socket客户端通信进行表单赋值

java做一个toB的客户端操作系统&#xff0c;客户端和web的结合&#xff1b; 主要是使用java编写客户端代码&#xff0c;采用selenium控制浏览器&#xff0c;主要是用到selenium自动化测试的功能&#xff1b; javaEE 项目调用 selenium使用谷歌控件chromedriver.exe控制浏览器…