Qt 基于opencv的人脸识别

使用C++和OpenCV进行人脸识别,包含模型训练与调用过程 阅读详情

.pro文件

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    widget.cpp

HEADERS += \
    widget.h

FORMS += \
    widget.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

INCLUDEPATH += D:/opencv/opencv3.4-qt-intall/install/include
INCLUDEPATH += D:/opencv/opencv3.4-qt-intall/install/include/opencv
INCLUDEPATH += D:/opencv/opencv3.4-qt-intall/install/include/opencv2
LIBS += D:/opencv/opencv3.4-qt-intall/install/x86/mingw/lib/libopencv_*.a

.h文件 

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
#include<opencv2/face.hpp>
#include <vector>
#include <map>
#include <QMessageBox>
#include <QDebug>
#include <QFile>
#include <QTextStream>
#include <QDateTime>
#include <QTimerEvent>
#include<QtSerialPort/QtSerialPort>
#include<QtSerialPort/QSerialPortInfo>
using namespace  cv;
using namespace cv::face;
using namespace std;

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_openBtn_clicked();

    void on_closeBtn_clicked();

    void on_faceBtn_clicked();

private:
    Ui::Widget *ui;

    //=========摄像头相关成员设置===============//
    VideoCapture v;  //摄像头容器
    Mat src; //存放原图的容器
    Mat gray; //存放灰度图容器
    Mat dst; //存放直方图容器
    Mat rgb; //存放rgb图容器
    CascadeClassifier c; //定义级联分级容器  ---- 获取图像上的矩形框
    vector<Rect> faces; //定义一个数组存放人脸矩形框
    int camera_id ; //启动摄像头的定时器 id
    void timerEvent(QTimerEvent *e); //定时器事件 重写函数事件
    //===============人脸信息录入相关成员的设置============//
    Ptr<LBPHFaceRecognizer> recognizer;  //人脸 识别器指针
    vector<Mat> study_faces;    //定义一个存放录入人脸的数组
    vector<int> study_labels;   //定义一个存放人脸对应的标签数组
    int count = 0;    //记录录入人脸的次数
    int flag;     //用来区别是人脸录入还是人脸识别
    int face_id;   //人脸录入定时器id  ---- study_timer_id
    //===============================================//

    int check_id; //人脸检测定时器的id


};
#endif // WIDGET_H

main.cpp

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

 widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->wchatBtn->setEnabled(false);
    //打开系统摄像头
    if(!v.open(0))
    {
        QMessageBox::information(this,"","打开系统摄像头失败");
        return;
    }
    //配置级联分类器
    if(!c.load("D:\\opencv\\image\\haarcascade_frontalface_alt.xml"))
    {
        QMessageBox::information(this,"","配置级联分类器失败");
        return;
    }
    //将摄像头捕获的图像一帧一帧的放入到label中去

    //判断是否录入过人脸
    QFile file("D:\\opencv\\image\\m_face.xml");
    //判断文件是否存在
    if(file.exists())
    {
        //表示之前录入过人脸  则下载文件
        recognizer = LBPHFaceRecognizer::load<LBPHFaceRecognizer>("D:\\opencv\\image\\my_face.xml");
    }
    else
    {
        //表示之前没有录入过人脸,则创建
        recognizer = LBPHFaceRecognizer::create();
    }

    //启动人脸识别开始的定时器
    check_id = startTimer(3000);
    flag = 1; //表示可以人脸检测
    recognizer->setThreshold(100);

}

Widget::~Widget()
{
    delete ui;
}


//打开摄像头按钮对应的槽函数
void Widget::on_openBtn_clicked()
{
    //启动一个定时器
    camera_id = startTimer(20);
}

//定时器重写的函数
void Widget::timerEvent(QTimerEvent *e)
{
    //判断是否摄像头定时器超时
    if(e->timerId() == camera_id)    //camera_id 20 ms 一个
    {
        //读取系统摄像头中的图像
        v.read(src);
        //翻转图像
        flip(src,src,1); //1 表示沿y轴反转
        //将bgr图转换成rgb图
        cvtColor(src,rgb,CV_BGR2RGB);  //最后一个参数是枚举
        //重新设置图像的大小,以便适应label
        cv::resize(rgb,rgb,Size(300,200)); //最后一个参数是匿名对象
        cvtColor(rgb,gray,CV_RGB2GRAY);
        //均衡化处理
        equalizeHist(gray,dst);

        //锁定人脸矩形框位置---锁定人脸矩形框之前,灰度处理
        c.detectMultiScale(dst,faces);
        //将矩形框绘制到人脸上
        for(uint i=0; i<faces.size(); i++)
        {
            rectangle(rgb,faces[i],Scalar(255,0,0),2);
        }
        //将图像放入label中
        //rgb图像转换成pixmap
        QImage img(rgb.data,rgb.cols,rgb.rows,rgb.cols*rgb.channels(),QImage::Format_RGB888);
        ui->label->setPixmap(QPixmap::fromImage(img));

    }
    //判断是否是人脸录入 定时器超时
    if(e->timerId() == face_id )   // face_id  50 ms 一次人脸检测
    {
        if(0 == flag)
        {
            qDebug() << "人脸录入中,请正视摄像头";
            Mat face = src(faces[0]);  //将摄像头当前的一帧图像上的人脸给face
            //灰度处理
            cvtColor(face,face,CV_BGR2GRAY);
            //均衡化处理得到直方图
            equalizeHist(face,face);
            //将当前采集的人脸信息,放入study_face容器里
            study_faces.push_back(face);
            study_labels.push_back(1);
            count++;
            if(50 == count)
            {
                qDebug() << "count == 50";
                //将图像模型转换成数据模型
                recognizer->update(study_faces,study_labels);
                recognizer->save("D:\\opencv\\image\\my_face.xml");
                QMessageBox::information(this,"","录入人脸成功!");
                //关闭定时器
                killTimer(face_id);
                //可以录入人脸
                flag = 1;  //表示可以进行人脸检测了
                study_faces.clear();
                study_labels.clear();
                count = 0;

            }
        }
    }
    if(check_id == e->timerId())
    {
        if(1 == flag)
        {
            QFile file("D:\\opencv\\image\\my_face.xml");
            if(file.exists())
            {
                if(recognizer->empty() || faces.empty())
                {
                    return;
                }
                Mat face = src(faces[0]);
                //灰度处理
                cvtColor(face,face,CV_BGR2GRAY);
                equalizeHist(face,face);

                int lab = -1;
                double cof = 0.0;
                recognizer->predict(face,lab,cof);
                //根据lab判断是否识别成功
                if(-1 != lab)
                {
                    QMessageBox::information(this,"","Welcome!!");
                    ui->wchatBtn->setEnabled(true);
                    killTimer(check_id);
                }
            }


        }

    }

}





//关闭摄像头按钮对应的槽函数
void Widget::on_closeBtn_clicked()
{
    killTimer(camera_id);
}








//录入人脸信息按钮对应的槽函数
void Widget::on_faceBtn_clicked()
{
    count = 0;   //将录入人脸的次数 置为0
    flag = 0;    //表示只能做人脸录入,不能做人脸检测
    face_id = startTimer(50);  //50 ms 启动一个人脸检测器
}












基于QT,C++和opencv 的人脸识别项目(二) 引言 工欲善其事,必先利其器。我们先了解可能用到的相关知识。主要包含:opencv,dlib,相关模型。 正文 opencv 本实验主要是基于opencv实现的,了解opencv也就是重中之重了。学习opencv最好的地方当然是opencv官网,当然囿于英语阅读的速度和方便性,我们也会考虑中文读物。我把有关项目的重要信息摘要给大家。 OpenCV要求电脑中有如下packages GCC(GCC是linux最常用的C/C++编译器,通常以gcc命令的形式在终端shell中使用),GCC教程 Cmake(对于 阅读详情

相关推荐

基于qt和opencv实现人脸识别打卡系统_基于opencv+qt的人脸识别考勤系统设计

2、由于github传太大的文件下载太慢因此opecv的库我放在csdn上了。

2401_87555420的博客 552

人脸识别3:C/C++ InsightFace实现人脸识别Face Recognition(含源码)

C++人脸识别,人脸检测,opencv人脸识别,opencv人脸检测;整套人脸识别系统核心算法包含人脸检测和人脸关键点检测,人脸校准,人脸特征提取以及人脸比对(1:1)和人脸搜索(1:N)

AI吃大瓜的博客 1万+

C++ dlib实现人脸识别

前置(Ubuntu下配置c++dlib):https://blog.youkuaiyun.com/qq_34717531/article/details/107682381 需要文件:shape_predictor_68_face_landmarks.dat dlib_face_recognition_resnet_model_v1.dat haarcascade_frontalface_alt2.xml 前二个在这 http://dl...

qq_34717531的博客 9680

C++实现人脸识别系统

*************************代码来自上海华清远见C++课程老师周锁琴**************************

m0_54896893的博客 1838

C++实现的人脸识别系统

这是一个C++语言开发的人脸识别系统,文件包括说明文档,测试数据,源码等实例。

IPD流程中CBB管理的5个致命误区,第3个坑了80%的团队

本文深入剖析了IPD流程中CBB管理的五个致命误区,尤其指出缺乏有效的度量与激励机制是影响80%团队的核心陷阱。文章强调CBB的核心在于前瞻性设计,而非简单归档,并需平衡通用性与产品竞争力,同时建立持续运营机制,确保CBB与市场需求对齐,从而真正实现缩短开发周期、降低成本的目标。

weixin_29234423的博客 569

Qt 使用摄像头通过openCV进行人脸识别

安装cpenCV 从官网获取到安装程序: 本文选择了一个历史版本(提醒一下不同版本使用方法会存在差异,如果读者想要按照下面的方式尝试,第一次建议选择和笔者同样的版本,成功以后再尝试新版本): 如果官网下载太慢可以选择再优快云里面搜索下载: 下载下来过后运行安装,请选择纯英文路径: 等待安装完成: 安装CMake 官方下载CMake:https://cmake.org/download/...

会飞的蜗牛 2万+

【Unity3D渲染】Unity3d实现Photoshop的各种图层混合模式

Adobe Photoshop图层混合原理、Unity ShaderLab图层混合实现

a310989583的专栏 2434

基于qt和opencv实现人脸识别打卡系统

最近在学习opencv,因此就想着和QT结合起来实现一个人脸识别的系统来。下面我来给大家讲讲这个项目怎么实现的 1、项目源码https://github.com/SagapoZ/FaceRecognition 2、由于github传太大的文件下载太慢因此opecv的库我放在csdn上了。 https://download.youkuaiyun.com/download/weixin_42127499...

weixin_42127499的博客 7562

windows server 2012 AD 活动目录部署系列(十一)安装证书服务器(ADCS)

本篇博文介绍如何在AD域控上安装证书服务器,本实验域环境:yun.com。 步骤如下: 1、打开“服务器管理器”,点击“添加角色和功能”,如下图: 2、点击下一步, 3、点击下一步, 4、点击下一步, 5、点击“Active Directory证书服务”,弹出功能选择,点击"添加功能",如下图,

白昼的技术专栏 2万+

【系统分析师】高分论文:论软件需求验证方法及应用

本文以某清算平台建设项目为例,探讨了软件需求验证方法的应用。该项目旨在隔离银行与支付公司的直接通信,满足央行监管要求。作为系统分析师,作者通过需求测试和需求评审两种方法确保需求质量。需求测试采用概念测试用例提前发现问题;需求评审通过正式与非正式形式多方确认需求。项目结合邮件评审、专家会议等方式,最终形成完善的需求文档。平台上线后运行良好,验证了需求管理的重要性。该案例表明,科学的需求验证是项目成功的关键保障。

数据知道的博客 8124

基于QT,C++和opencv 的人脸识别项目(一)

1.引言 近期按照师傅的要求做了一个基于opencv实现的人脸检测和人脸识别的项目,并且用QT做了一个界面。 由于长时间没有用C++,也是第一次接触opencv和qt,做起来有点慢,但也因此遇到的问题比较多,写下一篇文章作为项目的总结。 因为涉及的原理及代码较多,我把本次项目分为多篇文章来介绍,在之后我会添加到github上。 2.实验环境 本项目主要是基于ubuntu - linux系统,所以介绍的相关的环境配置会大部分基于linux,我也尽可能把windows上的操作也加以介绍。 本文的电脑配置为: c

aazqy1234的博客 7734

Lammps实现Ar的沸腾过程(包含in文件)

Lammps实现简单的沸腾过程

Rockyoung 3503

基于OpenCV3和QT实现人脸识别

基于OpenCV3和QT实现人脸识别 【下载地址】基于OpenCV3和QT实现人脸识别 本资源文件提供了一个基于OpenCV3和QT实现人脸识别的完整项目。该项目详细介绍了如何使用OpenCV库和QT框架来构建一个简单的人脸识别模型。通过本项目,您可以学习到人脸识别的基本流程,包括图片采集、预处理、模型训练和人脸识别等步...

gitblog_06551的博客 858

非结构化数据在大数据湖中的应用实践

想象一下,你正在整理一个杂乱的书房。有些书整整齐齐地放在书架上,每本书都有明确的标题、作者和出版日期——这些就是结构化数据,它们像数据库中的表格,有固定的格式和字段。但书房里还有更多东西:散落的照片、手写的笔记、录音带、视频光盘、甚至还有画作。这些物品没有固定的格式,每件都独一无二——这就是非结构化数据。在技术术语中,非结构化数据是指没有预定义数据模型或组织形式的信息。文本文档(Word、PDF、TXT)电子邮件和社交媒体内容图像和照片(JPG、PNG)音频文件(MP3、WAV)

软件工程实践的博客 361

2024年11月架构设计师案例分析真题回顾,附参考答案、解析及所涉知识点(二)

软考高级系统架构设计师考试包含三个科目:信息系统综合知识、案例分析和系统架构设计论文。考试形式为机考。本文主要回顾2024年下半年(2024-11-10)系统架构设计师考试上午第二科案例分析的题目,同时附带参考解答、解析和所涉知识点。

一几文的编程学习笔记。 1659

【基于OpenCV、Qt的人脸识别及硬件控制】

本篇文章主要介绍使用Qt编程进行串口调试,并且基于 OpenCV实现人脸识别、以及模型训练及预测。我也是一个初学者,借此文章记录学习过程,并且进行自我总结,在写文章的过程中可以使得自己的思路更加清晰,也可以大家互相学习。

a1379292747的博客 3582

【QCA6174】QCA6174 DFS认证的时候会有概率信道不会跳转的情况,通常跳转成功概率只有25%问题分析及解决方案

Master设备需要测试的项目。

wgl307293845的博客 752

Qt+openCV实现人脸识别

对于Qt或者C++新手来说,一个有趣且易上手的练习项目非常关键,这里介绍一个基于Qt和openCV的人脸识别程序,亲测有效! 测试环境: Win10 64位 Qt 5.14.0 Qt Creator 4.11.0 openCV 4.4.0 cmake 3.19.8 win64 x64 具体步骤请参考这位博主的内容: Qt 使用摄像头通过openCV进行人脸识别 运行效果图: 这里我就介绍一些注意事项: 使用Cmake构建OpenCV如果出错,要注意Cmake版本; Qt的.pro文件加上Open.

发呆健将的博客 5324

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目

此项目是基于人脸识别的考勤系统开发的QT实际应用。

你要拥有一个你喜欢并且热爱的人生 4823

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

qt利用opencv3.4进行人脸识别和特征点提取

qt利用opencv3.4进行人脸识别和特征点提取 1 本文是用qt5.6.3和opencv3.4、opencv_contrib3.4在windows平台下实现人脸识别以及特征值提取 ** 2 ** qt调用opencv可以自己编译也可以使用别人利用mingw编译好的库,现在常用的方法就是利用VS编译,也可以利用qt自己进行编译。但是两者都要下载cmake,安装的时候要选择第二个自动加入环...

weixin_38605619的博客 6541

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【qt+opencv】实现人脸识别打卡系统2.0

一、简介 人脸识别1.0版本: 【QT】基于人脸识别的打卡系统(QT+Opencv + SQLite)--设计过程_Jason~shen的博客-优快云博客_qt人脸识别目录使用平台设计目标功能描述设计方案数据库设计使用说明使用平台https://blog.youkuaiyun.com/qq_40602000/article/details/99674066?spm=1001.2014.3001.5502 人脸识别2.0版本:在粉丝们的建议下在1.0的基础上做了一定的修改 1、减少了opencv繁琐的配置,打开

Jason的技术探索与分享 1万+

Qt上的openCV应用(人脸识别)

Qt上的openCV应用(人脸识别):openCV中提供的人脸识别的内容主要是基于Haar特征和LBP特征训练的xml格式的分类器,利用这个分类器可以实现简单的人脸识别的功能

大草坪 2463

基于QT和opencv的人脸识别

人脸识别是一直以来的热门行业,简单的人脸识别可以说是烂大街的了,现在还在不断进步优化人脸识别的,一般都是涉及到深度学习或者设计算法的。当然,这些后面是要有一定水平的人去弄的。 本人简单的设计了一个基于QT和opencv的人脸识别 前提先说明一下,因为是直接调用到cv的FaceRecognizer,因此精确方面可能是有些欠缺的,不过不妨碍作为想QT和opencv一起学习的同学作为练手项目或者作业。 ...

qq_41620128的博客 3301

基于Qt的OpenCV人脸识别(一)

        OpenCV对图像处理非常专业,具有很多模块。但是其GUI模块(即highgui),交互性非常差,就连按钮也得用滑动条来实现。而Qt这个强大的c++图形库很好的避免了这个缺点,因此笔者基于Qt平台,调用OpenCV库,来进行OpenCV的人脸识别开发。        工欲善其事,必先利其器,要想完成开发,先得在Qt上搭建OpenCV的开发环境,如何编译OpenCV得到动态链接库这...

huhuandk的博客 8171

QT连接OpenCV库完成人脸识别

根据提供的图片模型通过算法生成数据模型,从而在其它图片中查找相关的目 标。是用来人脸识别。在判断之前,我们要先进行学习,生成人脸的模型以便后续识别使用。判断是谁的面部。FaceRecognizer类是opencv提供的人脸识别器基类,LBPHFaceRecognizer是根据LBPH算法实 现的识别器类,其中LBPHFaceRecognizer识别器支持在原有模型基础上继续学习(模型数据可以累 计)。

m0_68542867的博客 3291
上一篇: ARM day1总结
下一篇: ARM day2练习 求1~100内的和
风铃响了
博客等级 码龄4年 76粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值