打开摄像头,拍照功能设计
registerwin.h文件添加定时器事件,设置定时器id方便管理
void timerEvent(QTimerEvent *e);
//添加定时器id
int timerid;
在registerwin.cpp中定义
void RegisterWin::timerEvent(QTimerEvent *e)
{
//获取摄像头数据并且显示在界面上(实时刷新摄像头数据显示)
cv::Mat image;
if(cap.isOpened())
{
cap>>image;
if(image.data == nullptr) return;
}
//Mat--->QImage
cv::Mat rgbImage;
cv::cvtColor(image,rgbImage,cv::COLOR_BGR2RGB);
QImage qImg(rgbImage.data, rgbImage.cols, rgbImage.rows,rgbImage.step1(), QImage::Format_RGB888);
//在qt界面上显示
QPixmap mmp=QPixmap::fromImage(qImg);
mmp = mmp.scaledToWidth(ui->headpicLb->width());
ui->headpicLb->setPixmap(mmp);
}
可以将摄像头数据保存在头文件做全局变量
//保存摄像头数据
cv::Mat image;
registerwin.h添加摄像头头文件,设置摄像头对象
#include <opencv.hpp>
//创建摄像头对象
cv::VideoCapture cap;
在registerwin.cpp中定义
//打开摄像头
void RegisterWin::on_videoswitchBt_clicked()
{
if(ui->videoswitchBt->text() == "打开摄像头")
{
//打开摄像头
if(cap.open(0))
{
ui->videoswitchBt->setText("关闭摄像头");
//启动定时器事件
timerid = startTimer(100);
}
}else
{
//关闭定时器事件
killTimer(timerid);
ui->videoswitchBt->setText("打开摄像头");
//关闭摄像头
cap.release();
}
}
拍照
//拍照
void RegisterWin::on_cameraBt_clicked()
{
//保存数据
//把头像保存到一个固定路径下
QString headfile = QString("./data/%1.jpg").arg(QString(ui->nameEdit->text().toUtf8().toBase64()));//64位编码之后作为名称保存
//显示路径
ui->picFileEdit->setText(headfile);
//保存注册图像
cv::imwrite(headfile.toUtf8().data(), image);
//关闭定时器事件
killTimer(timerid);
ui->videoswitchBt->setText("打开摄像头");
//关闭摄像头
cap.release();
}