基于Qt设计的人脸识别门禁系统(录入、识别、对比、删除)

2022-07-12 16:40:12 浏览数 (1)

一、前言

随着现代科技的不断发展,现在的中国已经迈入5G时代,人工智能技术也正逐步广泛运用到了各行各业中,尤其人脸识别技术,已在各大行业中广泛使用。人脸识别门禁系统,可以防止陌生人尾随进入园区,大大降低了该风险。通过前端设备的识别,进行人脸与后台系统1对1的比对,比对成功方可进入。

目前一些小区、单位都应用了传统的门禁系统,小区有着各种各样的人群,比如:发传单、产品推销、贴广告的等等,而且还有不明的车辆来来往往。这样不仅影响居民的生活安全,而且对于一些突发事情无法处理。因为传统的小区治安管理不高,对于一些盗窃事故不知如何去解决。 如果升级为人脸识别系统,那么对治安方面也有着不小的帮助。

本文就通过飞浆平台(EasyDL) Qt设计了一个门禁系统,实现人脸录入、识别、对比、删除等等操作。识别人脸之后完成开锁动作,因为本软件没有连接硬件,只是为了实现人脸识别的部分,所以当人脸识别成功之后在界面上会进行提示的。

二、软件实现效果

如果需要整个代码工程和资料可以去这里下载:

https://download.csdn.net/download/xiaolong1126626497/85892592

三、搭建QT开发环境

上位机软件采用Qt框架设计,Qt是一个跨平台的C 图形用户界面应用程序框架。

QT官网: https://www.qt.io/ 

QT5.12.6的下载地址:https://download.qt.io/archive/qt/5.12/5.12.6/ 

打开下载链接后选择下面的版本进行下载:

qt-opensource-windows-x86-5.12.6.exe 13-Nov-2019 07:28 3.7G Details

软件安装时断网安装,否则会提示输入账户。

安装的时候,第一个复选框里勾选一个mingw 32编译器即可,其他的不管默认就行,直接点击下一步继续安装。

选择MinGW 32-bit 编译器:

四、基于深度学习的人脸识别技术

深度学习技术是现在人工智能研究领域非常重要的组成部分。深度学习技术广泛的借鉴了其他学科得到的研究成果。其中包括了、数学领域、统计学领域、信息学领域、传播学领域、计算机基础理论领域、还有哲学领域、心理学领域等很多方面的研究技术支持。深度学习技术可以被看成是利用计算机技术来学习,模拟、人类思考方式、学习方式的过程。根据已知的模型、函数执行结果,不断的优化、迭代现在的函数模型,还可以在系统提供新的变量数据时,这个可以根据模型来判断即将到来的识别结果。近几年来,通过计算机、互联网等科学信息技术发展的成果,深度学习技术在人工智能研究中获取了非常快速的发展。包括在语音识别、辅助决策、自动驾驶等很多方面都有很多显著的研究成果。深度学习技术在自动视频识别领域、安防领域都得到了非常好的应用。与语音智能识别技术相比较,视频图像的及技术相对更加复杂一些。

就深度学习技术来说,一个重要的学习技术和它的应用领域是对特定事物的正确认知。这种技术是可以对有限范围的物体进行预先识别。就像,对于人脸的识别检测,正常只能识别图像的人脸存在,但是对于其他物体则无能为力,无法识别。这种识别模式与技术给设备赋予了类似于人体大脑的信息识别和处理功能,并可以通过大量素材学习,训练可以不断增强这种能力。结合成熟的特征提取技术,是实现深度学习技术精准度的重要途径,根据图形、图像模型内容中识别包含的信息进行投影,可以实现高维到低维信息转换,人脸的信息、高维空间的信息也可以投影到低维空间,几何特征子集的特征在低维空间中找到相关性最大的特征,这个识别的过程一般不涉及特征的属性,只进行通过比较来确定他们的相关性。结合线性算法判断分析,可以实现对特定信息的类比识别。这个过程是,先通过类比图像内部方差,进行调整后,放大类别之间的方差。用在人脸识别的深度学习技术上,主要依赖于最小化、最大化不同类别之间差异算法。对这些成熟的算法使用大大提高了人脸识别的准确性和速度。还可以更有效的提取人脸信息、可以借助Gabor、LBP算法快速实现图像信息获取,结合现场具体应用场合,选择多种针对算法进行图像识别。

五、人脸识别技术中的难点

现有的人脸识别技术在用户配合、采集条件比较理想的情况下可以取得令人满意的结果。但是,如果对于用户不配合,采集条件不理想(如光照恶劣、有遮挡、图像分辨率低等)的情况下,现有系统的识别率将陡然下降。因此,要将人脸识别技术应用到实际中还存在着诸多挑战性的问题需要解决。

(1)复杂条件下人脸的检测和关键点定位问题

(2)光照变化问题

(3)姿态问题

(4)表情问题

(5)遮挡问题下载高

(6)大规模人脸识别问题

(7)样本缺乏问题

六、代码实现

6.1 摄像头检测代码

代码语言:javascript复制
/*
将图片进行base64编码
*/
QByteArray Widget::toBase64(const QImage &image)
{
    //将要检测的图片进行BASE64编码
    QByteArray ba;
    QBuffer buffer(&ba);
    buffer.open(QIODevice::WriteOnly);
    //以png格式将图片数据写入ba
    image.save(&buffer,"jpg");

    buffer.close();
    return ba.toBase64();
}

//启动摄像头
void Widget::start_camera()
{
    //摄像头启动标志
    if(camera_flag) //如果摄像头已经启动一次,再次启动需要将之前的空间释放掉
    {
        camera_flag=0;
        camera->stop();
        delete camera;
        ui->verticalLayout_camera->removeWidget(videoWidget);
        delete videoWidget;
    }

    if(cameras.size()<=0)
    {
        QMessageBox::critical(this,"提示","你电脑没有可用的摄像头!!!",
        QMessageBox::Ok,QMessageBox::Ok);
        return;
    }

    camera_flag=1;  //标志摄像头已经启动一次

   /*创建摄像头对象,根据选择的摄像头打开*/
   camera = new QCamera(cameras.at(CAMERA_INDEX));

   /*构造捕获的对象*/
   camera_image_capture = new QCameraImageCapture(camera);

   /*设置捕获的目的地*/
   camera_image_capture->setCaptureDestination(QCameraImageCapture::CaptureToFile);

   //设置截图输出、缓冲区格式、分辨
   camera_image_capture->setCaptureDestination(QCameraImageCapture::CaptureToBuffer);
   camera_image_capture->setBufferFormat(QVideoFrame::PixelFormat::Format_Jpeg);

   //设置截图的图片尺寸
   iamge_setting.setResolution(640,480);
   camera_image_capture->setEncodingSettings(iamge_setting);

   //关联捕获的信号,发出捕获截图信号时,发出信号
   connect(camera_image_capture,&QCameraImageCapture::imageCaptured,this,&Widget::processCapturedImage);

   /*配置摄像头捕获模式为帧捕获模式*/
   camera->setCaptureMode(QCamera::CaptureViewfinder);

   videoWidget = new QVideoWidget();
   videoWidget->setMinimumSize(320,240);

   //将摄像头显示窗口加入到布局中
   ui->verticalLayout_camera->insertWidget(0,videoWidget);

   /*设置取景器显示*/
   camera->setViewfinder(videoWidget);

   /*启动摄像头*/
   camera->start();
}


//查找系统可用摄像头
void Widget::Find_CameraNumber()
{
    /*查找电脑当前可用摄像头*/
    cameras = QCameraInfo::availableCameras();
}

//摄像头开启与关闭
void Widget::on_toolButton_camera_clicked(bool checked)
{
    //开启摄像头
    if(checked)
    {
        start_camera();
    }
    //关闭摄像头
    else
    {
        //摄像头启动标志
        if(camera_flag) //如果摄像头已经启动一次,再次启动需要将之前的空间释放掉
        {
            camera_flag=0;
            camera->stop();
            delete camera;
            ui->verticalLayout_camera->removeWidget(videoWidget);
            delete videoWidget;
        }
    }
}

6.2 数据保存

代码语言:javascript复制
/*
功能: 保存数据到文件
*/
void Widget::SaveDataToFile(QString text)
{
    /*保存数据到文件,方便下次加载*/
    QString file;
    file=QCoreApplication::applicationDirPath() "/" ConfigFile;
    QFile filesrc(file);
    filesrc.open(QIODevice::WriteOnly);
    QDataStream out(&filesrc);
    out << text;  //序列化写字符串
    filesrc.flush();
    filesrc.close();
}


/*
功能: 从文件读取数据
*/
QString Widget::ReadDataFile(void)
{
    //读取配置文件
    QString text,data;
    text=QCoreApplication::applicationDirPath() "/" ConfigFile;

    //判断文件是否存在
    if(QFile::exists(text))
    {
        QFile filenew(text);
        filenew.open(QIODevice::ReadOnly);
        QDataStream in(&filenew); // 从文件读取序列化数据
        in >> data; //提取写入的数据
        filenew.close();
    }
    return data; //返回值读取的值
}

6.3 识别处理

代码语言:javascript复制
//人脸识别开锁
void Widget::on_pushButton_clicked()
{
    //摄像头启动标志
    if(camera_flag) //如果摄像头已经启动一次,再次启动需要将之前的空间释放掉
    {
        //拍照
        camera_image_capture->capture();
    }
    else
    {
        QMessageBox::information(this,"提示","请先开启摄像头.",
        QMessageBox::Ok,QMessageBox::Ok);
        return;
    }
}


//输入密码开锁
void Widget::on_pushButton_password_lock_clicked()
{
    bool ok;
    QString text = QInputDialog::getText(this, tr("密码开锁"),tr("请输入密码:"), QLineEdit::Password,
    tr(""),&ok);
    if (ok && !text.isEmpty())
    {
        if(text==OPEN_LOCK_PASSWORD)
        {
            //播放提示音
            QSound::play(":/res/open_lock_ok.wav");
            QMessageBox::information(this,"提示","开锁成功.",
            QMessageBox::Ok,QMessageBox::Ok);
            return;
        }
        else
        {
            //播放提示音
            QSound::play(":/res/open_lock_error.wav");
            QMessageBox::information(this,"提示","密码错误n请联系管理员.",
            QMessageBox::Ok,QMessageBox::Ok);
            return;
        }
    }
    else
    {
        QMessageBox::information(this,"提示","未正确输入信息.",
        QMessageBox::Ok,QMessageBox::Ok);
        return;
    }
}

0 人点赞