#include "widget.h"
#include "ui_widget.h"
#include <QMovie>
#include <QPixmap>
#include <QMessageBox>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//开始展示一张页面图片
this->setFixedSize(this->size());//设置图片大小自适应
ui->yemianLab->setScaledContents(true);//设置标签内容自适应
QMovie *moviePtr = new QMovie ("C:\\opencv\\resources\\yuehong.jpg");//实例化一个动图图像
ui->yemianLab->setMovie (moviePtr) ;//将上面的动态设置到logo标签上
moviePtr->start ( );//启动动图
// openUart();
//禁用各个视频播放按钮
// ui->huyaoBtn->setEnabled(false);
// ui->wangquanbtn->setEnabled(false);
// ui->zhuyebtn->setEnabled(false);
// ui->nanguobtn->setEnabled(false);
// ui->qianyanbtn->setEnabled(false);
//加载级联分类器(下载的人脸识别模型)创建/打开人脸模型图像
if(!c.load("C:\\opencv\\resources\\haarcascade_frontalface_alt2.xml"))
{
QMessageBox::information(this, "提示信息", "级联分类器打开失败");
return;
}
QFile file("C:\\opencv\\resources\\myface.xml");
if(file.exists())
{
recognizer = FaceRecognizer::load<LBPHFaceRecognizer>("C:\\opencv\\resources\\myface.xml");
}else
{
recognizer = LBPHFaceRecognizer::create();
}
//设置可信度阈值
recognizer->setThreshold(90);
}
Widget::~Widget()
{
delete ui;
}
//跳转槽函数
void Widget::jump_slot()
{
this->show();
}
//摄像头打开函数
void Widget::on_openCameraBtn_clicked()
{
if(v.open(0))
{
QMessageBox::information(this, "提示信息", "摄像头打开成功");
}else
{
QMessageBox::information(this, "提示信息", "摄像头打开失败");
return;
}
//摄像头定时器,每隔30MS读取视频流数据,并将处理后的图像展示到UI界面
cameraTimerId = this->startTimer(30);
}
//定时器函数
void Widget::timerEvent(QTimerEvent *e)
{
//摄像头定时器
if(e->timerId() == cameraTimerId)
{
if(v.read(src) == false)
{
return;
}
flip(src, src, 1);//翻转图像,大于0左右翻转,小于0左右翻转,0为上下翻转
cv::resize(src, src, Size(300,300));//调整图像大小
cvtColor(src, rgb, CV_BGR2RGB);//原图转RGB图像
cvtColor(rgb, gray, CV_BGR2GRAY);//RGB转灰度图
equalizeHist(gray, dest);//灰度图均衡化
c.detectMultiScale(dest, faces); //通过均衡化图像,获得人脸矩形框的数组
for(uint i=0; i<faces.size(); i++) //将人脸矩形框绘制到RGB图上
{
//将任意一个矩形框绘制到彩色图上,参数为:要被绘制矩形框的图像,要被绘制的矩形框,矩形框颜色,矩形框线条粗细
rectangle(rgb, faces[i], Scalar(255,0,0), 2);
}
//通过RGB图,转换成QT能识别的QImage图像,数据,宽度,高度,每行的字节数,形式
QImage image(rgb.data, rgb.cols, rgb.rows, rgb.cols*rgb.channels(), QImage::Format_RGB888);
ui->cameraLab->setPixmap(QPixmap::fromImage(image));//Lab中显示的应该是QPIXMAP图
}
//人脸录入定时器
if(e->timerId() == inputTimerId)
{
if(faces.empty()) //说明摄像头没人
{
return;
}
Mat face = src(faces[0]); //摄像头中矩形框框起来的人脸区域
cv::resize(face, face, Size(100,100)); //将图像进行统一化处理
cvtColor(face, face, CV_BGR2GRAY);//将图像设置成灰度图
//将人脸放入到更新容器中
input_faces.push_back(face);
input_labs.push_back(1);
count++;//表示容器中学习了一张图像
if(count == 50)
{
recognizer->update(input_faces, input_labs);//更新人脸模型
recognizer->save("C:\\opencv\\resources\\myface.xml");//将人脸模型导出到本地磁盘
count = 0; //以便下次录入
ui->inputFaceBtn->setEnabled(true);//将按钮设置成可用
ui->checkFaceBtn->setEnabled(true);
input_faces.clear();//清空人脸容器
input_labs.clear();
killTimer(inputTimerId);//关闭人脸录入定时器
QMessageBox::information(this, "提示", "人脸录入成功");
}
}
//人脸检测定时器
if(e->timerId() == checkTimerId)
{
if(faces.empty()) //说明摄像头没有人脸
{
return;
}
Mat face = src(faces[0]);//将摄像头中的矩形框框起来的部分截取下来
cv::resize(face, face, Size(100, 100));//设置存储图像的大小
cvtColor(face, face, CV_BGR2GRAY);//灰度处理,因为存储用的就是灰度图
//定义变量接受返回后的结果
int lab = -1; //接受验证后的图像编号
double confidence = 0;//可信度,越小越可信
recognizer->predict(face, lab, confidence);//预测功能,要判断的图像,该图像对应的编号,验证结果的可信度
qDebug() << "lab = "<<lab << " confidence = " << confidence; //电脑应用输出查看
if(confidence <= 90)//表明人脸验证成功
{
QMessageBox::information(this, "提示信息", "开始续缘");
//打开所有按钮
ui->huyaoBtn->setEnabled(true);
ui->wangquanbtn->setEnabled(true);
ui->zhuyebtn->setEnabled(true);
ui->nanguobtn->setEnabled(true);
ui->qianyanbtn->setEnabled(true);
killTimer(checkTimerId);//关闭人脸验证定时器
ui->checkFaceBtn->setText("人脸验证");
}
}
}
//关闭摄像头
void Widget::on_closeCameraBtn_clicked()
{
killTimer(cameraTimerId);//关闭摄像头的定时器
v.release();//关闭摄像头
ui->cameraLab->clear();//清空UI界面上的Lab内容
ui->cameraLab->setStyleSheet("background-color:black;");//设置关闭摄像头后的颜色
}
void Widget::on_inputFaceBtn_clicked()
{
ui->checkFaceBtn->setEnabled(false);//人脸验证和输入设为不可用
ui->inputFaceBtn->setEnabled(false);
inputTimerId = startTimer(20);//启动人脸录入定时器
}
void Widget::on_checkFaceBtn_clicked()
{
if(ui->checkFaceBtn->text() == "人脸验证")
{
checkTimerId = this->startTimer(40);//每隔40MS验证一次
ui->checkFaceBtn->setText("关闭验证");
}else
{
killTimer(checkTimerId);//关闭人脸验证定时器
ui->checkFaceBtn->setText("人脸验证");
}
}
//狐妖小红娘播放器
void Widget::on_huyaoBtn_clicked()
{
playerhy = new QMediaPlayer; //定义一个音频播放变量
//设置狐妖篇开始图片
this->setFixedSize(this->size()); //设置大小自适应
ui->yemianLab->setScaledContents(true);//设置标签内容自适应
QMovie *moviePtr = new QMovie ("C:\\opencv\\resources\\huyao.jpg");//实例化一个动图图像
ui->yemianLab->setMovie (moviePtr) ;//将上面的动态设置到logo标签上
moviePtr->start ( );//启动动图
if(v.open("C:\\opencv\\resources\\hyxhn.mp4") == true) //判断是否成功打开了视频
{
// QMessageBox::information(this,"提示性信息","视频打开成功");
playerhy->setMedia(QUrl::fromLocalFile("C:/opencv/resources/狐妖小红娘.mp3"));//播放音频
playerhy->setVolume(1000);//设置音量
playerhy->play();//展示音频
}else
{
QMessageBox::warning(this,"提示信息","视频打开失败");
return;
}
while(v.read(srchy)) //不断从视频流中读取一张图像,放入到srchy容器中,读取成功返回TRUE,失败返回FALSE
{
imshow("huyao",srchy);//将图像展示到一个串口中
if(waitKey(25) == 27) //延时函数,防止视频过快展示,ESC键推出
{
playerhy->stop();//停止音频播放
break;
}
}
}
//王权篇播放器
void Widget::on_wangquanbtn_clicked()
{
playerwq = new QMediaPlayer;
//设置王权篇开始图片
this->setFixedSize(this->size());
ui->yemianLab->setScaledContents(true);
QMovie *moviePtr = new QMovie ("C:\\opencv\\resources\\wangquan.jpg");
ui->yemianLab->setMovie (moviePtr) ;
moviePtr->start ( );
if(v.open("C:\\opencv\\resources\\wqfg.mp4") == true)
{
//QMessageBox::information(this,"提示性信息","视频打开成功");
playerwq->setMedia(QUrl::fromLocalFile("C:/opencv/resources/王权富贵.mp3"));
playerwq->setVolume(1000);
playerwq->play();
}else
{
QMessageBox::warning(this,"提示信息","视频打开失败");
return;
}
while(v.read(srcwq))
{
imshow("wangquan",srcwq);
if(waitKey(31) == 27)
{
playerwq->stop();
break;
}
}
}
//竹业篇播放器
void Widget::on_zhuyebtn_clicked()
{
playerzy = new QMediaPlayer;
//设置竹业篇开始图片
this->setFixedSize(this->size());
ui->yemianLab->setScaledContents(true);
QMovie *moviePtr = new QMovie ("C:\\opencv\\resources\\zhuye.jpg");
ui->yemianLab->setMovie (moviePtr) ;
moviePtr->start ( );
if(v.open("C:\\opencv\\resources\\zy.mp4") == true)
{
// QMessageBox::information(this,"提示性信息","视频打开成功");
playerzy->setMedia(QUrl::fromLocalFile("C:/opencv/resources/竹业篇.mp3"));
playerzy->setVolume(1000);
playerzy->play();
}else
{
QMessageBox::warning(this,"提示信息","视频打开失败");
return;
}
while(v.read(srczy))
{
imshow("zhuye",srczy);
if(waitKey(31) == 27)
{
playerzy->stop();
break;
}
}
}
//南国篇播放器
void Widget::on_nanguobtn_clicked()
{
playerng = new QMediaPlayer;
//设置南国篇开始图片
this->setFixedSize(this->size());
ui->yemianLab->setScaledContents(true);
QMovie *moviePtr = new QMovie ("C:\\opencv\\resources\\nanguo.jpg");
ui->yemianLab->setMovie (moviePtr) ;
moviePtr->start ( );
if(v.open("C:\\opencv\\resources\\ng.mp4") == true)
{
// QMessageBox::information(this,"提示性信息","视频打开成功");
playerng->setMedia(QUrl::fromLocalFile("C:/opencv/resources/南国篇.mp3"));
playerng->setVolume(1000);
playerng->play();
}else
{
QMessageBox::warning(this,"提示信息","视频打开失败");
return;
}
while(v.read(srcng))
{
imshow("nanguo",srcng);
if(waitKey(10) == 27)
{
playerng->stop();
break;
}
}
}
//千颜篇播放器
void Widget::on_qianyanbtn_clicked()
{
playerqy = new QMediaPlayer;
//设置千颜篇开始图片
this->setFixedSize(this->size());
ui->yemianLab->setScaledContents(true);
QMovie *moviePtr = new QMovie ("C:\\opencv\\resources\\qianyan.jpg");
ui->yemianLab->setMovie (moviePtr) ;
moviePtr->start ( );
if(v.open("C:\\opencv\\resources\\qy.mp4") == true)
{
//QMessageBox::information(this,"提示性信息","视频打开成功");
playerqy->setMedia(QUrl::fromLocalFile("C:/opencv/resources/千颜篇.mp3"));
playerqy->setVolume(1000);
playerqy->play();
}else
{
QMessageBox::warning(this,"提示信息","视频打开失败");
return;
}
while(v.read(srcqy))
{
imshow("qianyan",srcqy);
if(waitKey(31) == 27)
{
playerqy->stop();
break;
}
}
}
Qt 5使用QMediaPlayer播放音乐MP4无声音