#include <opencv2/opencv.hpp>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>
// 连接数据库
bool connectDatabase(QSqlDatabase &db) {
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":/database/attendance.db"); // 使用资源文件
if (!db.open()) {
qDebug() << "数据库连接失败:" << db.lastError().text();
return false;
}
return true;
}
// 将OpenCV的Mat图像转换为Qt的QImage
QImage cvMatToQImage(const cv::Mat &inMat) {
switch (inMat.type()) {
// 8-bit, 4 channel
case CV_8UC4: {
QImage image(inMat.data, inMat.cols, inMat.rows, static_cast<int>(inMat.step), QImage::Format_ARGB32);
return image;
}
// 8-bit, 3 channel
case CV_8UC3: {
QImage image(inMat.data, inMat.cols, inMat.rows, static_cast<int>(inMat.step), QImage::Format_RGB888);
return image.rgbSwapped();
}
// 8-bit, 1 channel
case CV_8UC1: {
static QVector<QRgb> sColorTable;
// ... 初始化颜色表
QImage image(inMat.data, inMat.cols, inMat.rows, static_cast<int>(inMat.step), QImage::Format_Indexed8);
image.setColorTable(sColorTable);
return image;
}
default:
break;
}
return QImage();
}
// 人脸识别并记录出勤信息
void faceRecognitionAndAttendance(cv::VideoCapture &cap, cv::CascadeClassifier &cascade, QSqlDatabase &db) {
cv::Mat frame;
cap >> frame; // 从摄像头读取帧
if (!frame.empty()) {
std::vector<cv::Rect> faces;
cv::Mat gray;
cv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY); // 转换为灰度图
cascade.detectMultiScale(gray, faces, 1.2, 3, cv::CASCADE_FIND_BIGGEST_OBJECT | cv::CASCADE_DO_ROUGH_SEARCH, cv::Size(30, 30));
for (size_t i = 0; i < faces.size(); i++) {
cv::Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2);
cv::ellipse(frame, center, cv::Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, cv::Scalar(255, 0, 255), 4);
// 假设已经识别到人脸并获取了人脸特征
// ...
// 在数据库中查找是否有对应特征的记录
QSqlQuery query(db);
query.prepare("SELECT name FROM attendance WHER
评论已关闭