加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
widget.cpp 7.29 KB
一键复制 编辑 原始数据 按行查看 历史
顽石 提交于 2019-12-19 11:33 . today copy Mr.Li codes
#include "widget.h"
#include "ui_widget.h"
#include <vector>
#include <QDebug>
#include <QTime>
using std::vector;
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget),video(0)
{
ui->setupUi(this);
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this,SLOT(UpdatePic()));
timer->start(100); //每秒钟检测10帧
ui->label->setScaledContents(true);
ui->tips->setText("welcome");
//创建级联分类器,并加载模型文件
classifier = new cv::CascadeClassifier("/home/ljw/project/opencv-3.1.0/data/haarcascades/haarcascade_frontalface_alt.xml");
bdf = new baiduFace("5pdFGPo8uYLGdllF4g28O7uw","tB2BPpwBRSnMZsqNiZ8bGNP3NwZ78ke4",this);
connect(bdf,&baiduFace::isfound,this,&Widget::IsFoundFace);
//设置组id
group = "777";
sound = new QSound("3.wav",this);
//创建数据库,建表
if(true == QSqlDatabase::contains("qt_sql_default_connection"))
{
db = QSqlDatabase::database("qt_sql_default_connection");
qDebug() << "connection there";
}
else
{
db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("face_people.db");
bool ok = db.open();
if(ok)
{
qDebug() << "open db ok";
}
else
{
qDebug() << "db open error!" << db.lastError();
}
}
//创建数据库并建表
QSqlQuery sql_query;
QString sql_create_table = "create table face_list (count int primary key,name varchar(30),id varchar(30),time varchar(30) default 0)";
if(!db.tables().contains("face_list"))
{
sql_query.prepare(sql_create_table);
bool exec_ok = sql_query.exec();
if(true == exec_ok)
{
//数据库中数据
sql_query.exec("insert into face_list(count,name,id) values(1,'hqd','001')");
sql_query.exec("insert into face_list(count,name,id) values(2,'ljw','002')");
sql_query.exec("insert into face_list(count,name,id) values(3,'jks','003')");
qDebug() << "create table and initialize ok!";
}
else
{
qDebug() << "create table and initialize failed!" << sql_query.lastError();
}
}
}
void Widget::sleep(int msec)
{
QTime reachtime = QTime::currentTime().addMSecs(msec);
while(QTime::currentTime()< reachtime)
{
QCoreApplication::processEvents(QEventLoop::AllEvents,100);
}
}
void Widget::DetectFace(cv::Mat& img)
{
//累计连续检测成功次数,如果等于5次就认为检测到人脸并开始进行识别
static int punch = 0;
cv::Mat gray(img.size(), CV_8UC1);
//灰度处理
cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);
cv::equalizeHist(gray, gray);
vector<cv::Rect> objects;
//搜寻人脸
classifier->detectMultiScale(gray, objects,1.5,5);
//发送识别好的人脸图片
/*if(objects.size())
{
cv::rectangle(img,objects[0],CV_RGB(255,0,0));
cv::Mat roi(img,objects[0]);
vector<uchar> buf;
cv::imencode(".jpg",roi,buf);
//因为百度云的人脸识别速率为2帧/s,所以加了延时
sleep(500);
bdf->search(QByteArray::fromRawData((char*)buf.data(),buf.size()),group);
}*/
if (objects.size())
{
punch++;
cv::rectangle(img, objects[0], CV_RGB(255,0,0)); //仅检测一张脸
if (punch == 3 && sound->isFinished()) //识别成功5次之后且上次提示音频播放完之后才会继续检测人脸
{
cv::Mat roi(img, objects[0]);
//to do recognize faces
vector<uchar> buf;
cv::imencode(".jpg",roi,buf);//将检测到的人脸存入到内存中去
bdf->search(QByteArray::fromRawData((char*)buf.data(),buf.size()),group);//发送内存中的人脸信息去与百度云人脸库中的人脸进行比较
}
}
else
{
punch = 0;
}
}
/*
//判断此人是否已经签到过
bool Widget::IsSignIn(QString _uid)
{
if(_uid.isEmpty())
{
return true;
}
//设置map的key为工号,value为是否签到,0标识未签到,非0标识签到
//map如果为空,则还没有人进行签到,则插入第一个人的数据,并执行签到
if(map.isEmpty())
{
map.insert(_uid,1);
return false;
}
else
{
//map不为空,则遍历map,查找工号为_uid的员工
QMap<QString,int>::iterator i=map.begin();
while(i!=map.end())
{
//如果找到了
if(i.key() == _uid)
{
//非0就是已签到
if(i.value() != 0)
{
return true;
}
else
{
//0就是未签到,将其value置为1,并返回结果
i.value()++;
return false;
}
}
i++;
}
//此时表明,map不为空,且里面没有这个人,所以进行插入操作
map.insert(_uid,1);
return false;
}
}*/
void Widget::IsFoundFace(bool yes)
{
//更新提示框上的签到信息
if(yes)
{
ui->tips->setText(bdf->userid() + " sign in successfully!");
sound->play("3.wav");
UpdateDbInfo(bdf->userid());
sleep(2000);
ui->tips->setText("welcome");
}
else
{
ui->tips->setText(bdf->userid() + " sign in failed!");
sleep(2000);
ui->tips->setText("welcome");
}
}
//更新数据库操作
void Widget::UpdateDbInfo(QString _uid)
{
QSqlQuery sql_query;
QString select_sql = "select * from face_list";
sql_query.exec(select_sql);
QString id,name;
//查询数据库找到符合id的人,记录其id和name
while(sql_query.next())
{
id = sql_query.value(2).toString();
name = sql_query.value(1).toString();
if(id == _uid)
{
qDebug()<<"find this man";
break;
}
}
//找到最大的编号
select_sql = "select * from face_list";
sql_query.exec(select_sql);
int maxcot;
while(sql_query.next())
{
maxcot = sql_query.value(0).toInt();
}
qDebug()<<maxcot;
maxcot++;
//更新数据库中数据
QString time =QDateTime::currentDateTime().toString("yyyy/MM/dd") + "-" + QTime::currentTime().toString("hh:mm:ss");
QString insert_sql = "insert into face_list(count,name,id,time) values(:maxcot,:name,:id,:time)";
sql_query.prepare(insert_sql);
sql_query.bindValue(":maxcot",maxcot);
sql_query.bindValue(":id",id);
sql_query.bindValue(":name",name);
sql_query.bindValue(":time",time);
bool exec_ok = sql_query.exec();
if(true == exec_ok)
{
qDebug() << "insert data ok";
}
else
{
qDebug() << "insert table error" << sql_query.lastError();
}
}
//更新label上的画面
void Widget::UpdatePic()
{
cv::Mat image;
video >> image; //采集一帧图像
DetectFace(image);
cv::cvtColor(image, image, CV_BGR2RGB); //将OpenCV的Mat数据结构转换为QImage
ui->label->setPixmap(QPixmap::fromImage(QImage(image.data, image.cols, image.rows, image.step, QImage::Format_RGB888)));
}
Widget::~Widget()
{
delete ui;
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化