简易版人脸识别qt opencv

这篇具有很好参考价值的文章主要介绍了简易版人脸识别qt opencv。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、配置文件.pro

#-------------------------------------------------
#
# Project created by QtCreator 2023-09-05T19:00:36
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = 01_face
TEMPLATE = app


SOURCES += main.cpp\
        widget.cpp

HEADERS  += widget.h

FORMS    += widget.ui

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

2、头文件

#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;

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    void timerEvent(QTimerEvent *event);         //定时器事件处理函数


private slots:
    void on_open_camera_Btn_clicked();

    void on_close_camera_Btn_clicked();

    void on_input_face_Btn_clicked();

private:
    Ui::Widget *ui;

    /************************第一模块:关于摄像头的组件***********************/
    VideoCapture v; //定义一个视频流对象

    Mat src;   //原图像
    Mat rgb;   //由于qt不识别grb图像,所以需要转化为rgb图像
    Mat gray;  //灰度图
    Mat dst;  //均衡化图像

    CascadeClassifier c;  //级联分类器,用来获取人像的矩形框
    vector<Rect> faces;  //定义一个存储人像矩形的容器

    int camera_timer_id;  //定时器

    /************************第二模块:录入人脸的组件***********************/
    Ptr<FaceRecognizer> recognizer;  //人脸识别器

    vector<Mat> study_face;   //要录入的人脸容器
    vector<int> Study_lab;    //要录入的人脸标签

    int input_timer_id;     //录入人脸的定时器

    int flag;    //判断是否正在录入中
    int count;   //记录收集到的人脸的次数



    /************************第三模块:人脸检测的组件***********************/
    int check_timer_id;   //定义一个人脸检测的定时器


};

#endif // WIDGET_H

3、源文件

main.app

#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"

int face_count = 1;  //录入对应的标签号
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    //打开摄像头
    if(!v.open(0))
    {
        QMessageBox::information(this, "提示", "摄像头打开失败");
        return;

    }
    //将级联分类器加载进来
    if(!c.load("D:/opencv/resource/haarcascade_frontalface_alt2.xml"))
    {
        QMessageBox::information(this, "提示", "练级分类器加载失败");
        return;
    }

    //配置人脸识别器
    QFile file("D:/opencv/resource/Face.xml");

    //判断是否存在,存在将其下载下来,不存在创建人脸模型
    if(file.exists())
    {
        //存在人脸模型,下载进来
        recognizer = FaceRecognizer::load<LBPHFaceRecognizer>("D:/opencv/resource/Face.xml");
    }
    else
    {
        //不存在,创建LBPHFaceRecognizer::create()
        recognizer = LBPHFaceRecognizer::create();
    }

    //启动人脸检测定时器
    check_timer_id = startTimer(3000);
    flag = 0;

    //设置可信度
    recognizer->setThreshold(100);

}

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

//打开摄像头按钮的槽函数
void Widget::on_open_camera_Btn_clicked()
{
    //开启定时器
    camera_timer_id = this->startTimer(20);

}

void Widget::on_close_camera_Btn_clicked()
{
    //关闭定时器
    this->killTimer(camera_timer_id);
}

//定时器事件的函数
void Widget::timerEvent(QTimerEvent *event)
{
    //判断是否是打开摄像头定时器到位
    if(event->timerId() == camera_timer_id)
    {
        //获取图像
        //函数原型:virtual bool read(OutputArray image);
        //参数:存储读取到的图像容器
        //成功返回真,失败/读取完毕返回假
        v.read(src);

        //翻转图像
        //函数原型:oid flip(InputArray src, OutputArray dst, int flipCode);
        flip(src, src, 1);

        //将图像转为rgb模式
        cvtColor(src, rgb, CV_BGR2RGB);

        //重新设置图像大小
        cv::resize(rgb, rgb, Size(300,300));

        //灰度化处理
        cvtColor(rgb, gray, CV_RGB2GRAY);

        //均衡化处理
        equalizeHist(gray, dst);

        //使用级联分类器获取人脸图像的矩形框,并存入参数2中(人像矩形框容器中)
        //函数原型:void detectMultiScale( InputArray image,
          //                        CV_OUT std::vector<Rect>& objects,
            //                      double scaleFactor = 1.1,
              //                    int minNeighbors = 3, int flags = 0,
                //                  Size minSize = Size(),
                  //                Size maxSize = Size() );
        c.detectMultiScale(dst, faces);

        //将矩形框绘制到rgb图像中去
        for(int i=0; i<faces.size(); i++)
        {
            //使用全局函数rectangle函数,进行绘制
            rectangle(rgb, faces[i], Scalar(255, 0, 0), 1);
        }

        //将图像显示到ui界面上,ui界面的图像为QPixmap
        //需要将rgb图转为QImage的图像,再转为QPIXmap
        QImage img(rgb.data, rgb.cols, rgb.rows, rgb.cols*rgb.channels(), QImage::Format_RGB888);
        //功能:通过其他图像构造一个QImage图像
        //参数1:其他图像的数据
        //参数2:图像的宽度(列)
        //参数3:图像的高度(4)
        //参数4:每一行的字节数(列*通道)
        //参数5:图像格式,24位图,每一中颜色使用1字节8位表示

        //将其设置到ui界面的组件上
        ui->camera_Lab->setPixmap(QPixmap::fromImage(img));   //QPixmap::fromImage(img);  将QImage图像转为QPixmap图像

    }

    //判断是否是录入人脸定时器到位
    if(input_timer_id == event->timerId())
    {
        qDebug() << "正在录入....";
        //判断ui界面是否有矩形框
        if(faces.empty()) return;

        //判断人脸识别器是否存在
        if(recognizer.empty()) return;

        //获取矩形框中的图像
        Mat face = src(faces[0]);

        //重新设置大小
        cv::resize(face, face, Size(100, 100));

        //灰度化处理
        cvtColor(face, face, CV_BGR2GRAY);

        //均衡化处理
        equalizeHist(face, face);
        qDebug() << face_count;
        //将图像放入学习容器中
        study_face.push_back(face);
        Study_lab.push_back(face_count);
        count++;


        //当收集50张后更新学习模型
        if(50 == count)
        {
            qDebug() << "hahhah";
            //将图像模型转为数据模型
            //函数原型:virtual void update(InputArrayOfArrays src, InputArray labels);
            //参数1:要进行更新的人脸图像容器
            //参数2:要进行封信的人脸标签容器
            recognizer->update(study_face, Study_lab);

            //将数据模型存入到本地磁盘中去
            recognizer->save("D:/opencv/resource/Face.xml");
            QMessageBox::information(this, "提示", "人脸录入成功");

            flag = 0;
            count = 0;
            killTimer(input_timer_id);
            study_face.clear();
            Study_lab.clear();
            face_count++;
        }

    }

    //判断是否是人脸检测定时器到位
    if(event->timerId() == check_timer_id)
    {
        if(0 == flag)
        {
            QFile file("D:/opencv/resource/Face.xml");
            //判断文件是否存在
            if(file.exists())
            {
                //判断ui->界面是否有矩形框和人脸识别器是否有
                if(faces.empty() || recognizer.empty()) return;

                //到此说明开始检测
                //获取ui界面上的矩形框中的图像
                Mat face = src(faces[0]);

                //重新设置图像大小, 与录入人脸时的大小一致
                cv::resize(face, face, Size(100, 100));

                //灰度化处理
                cvtColor(face, face, CV_BGR2GRAY);

                //均衡化处理
                equalizeHist(face, face);

                //定义记录,检测后的结果
                int lab = -1;
                double conf = 0.0;

                //将人脸进行检测
                recognizer->predict(face, lab, conf);

                //判断是否匹配
                if(lab != -1)
                {
                    qDebug() <<"匹配成功";
                }
                qDebug() << lab;
            }
        }
    }
}

//录入人脸对应的参函数
void Widget::on_input_face_Btn_clicked()
{
    //启动定时器
    input_timer_id = startTimer(60);

    //将flag设置为1, 表明正在录入
    flag = 1;
    count = 0;

}

4、ui界面

简易版人脸识别qt opencv,计算机视觉文章来源地址https://www.toymoban.com/news/detail-703586.html

到了这里,关于简易版人脸识别qt opencv的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机视觉实验:人脸识别系统设计

    设计 计算机视觉目标识别系统,与实际应用有关(建议:最终展示形式为带界面可运行的系统),以下内容选择其中一个做。 1. 人脸识别系统设计 (1) 人脸识别系统设计(必做):根据课堂上学习的理论知识(包括特征提取、分类器设计),设计一个人脸识别系统,该系统具

    2024年02月14日
    浏览(51)
  • 目标人脸检测与识别(计算机视觉)

    通过python 语言编程设计人脸检测算法,以此人脸作为训练样本,训练目标人脸模型,进一步实现目标人脸的识别。通过上述编程促进学生理解并掌握人脸检测及识别的相关原理,同时培养学生的编程能力。 笔记本电脑,windows10系统,Visual Studio Code编辑器,opencv视觉库,nump

    2024年02月08日
    浏览(52)
  • 计算机视觉设计如何应用于人脸识别技术?

           计算机视觉设计在人脸识别技术中起着重要的作用。它通过使用图像处理和模式识别技术,对人脸图像进行分析和比对,从而实现人脸的检测、定位和识别。下面是计算机视觉设计在人脸识别技术中的应用方法: 人脸检测:计算机视觉设计可以通过使用人脸检测算法

    2024年01月19日
    浏览(48)
  • 【计算机视觉40例】案例29:LBPH人脸识别

    【 导读 】本文是专栏《计算机视觉 40 例简介》的第 29 个案例《 LBPH 人脸识别 》。该专栏简要介绍李立宗主编《计算机视觉 40 例——从入门到深度学习( OpenCV-Python )》一书的 40 个案例。 目前,该书已经在电子工业出版社出版,大家可以在京东、淘宝、当当等平台购买。

    2024年02月06日
    浏览(40)
  • 【计算机视觉·OpenCV】使用Haar+Cascade实现人脸检测

    人脸检测的目标是找出图像中所有的人脸对应的位置,算法的输出是人脸的外接矩形在图像中的坐标。使用 haar 特征和 cascade 检测器进行人脸检测是一种传统的方式,下面将给出利用 OpenCV 中的 haarcascade 进行人脸检测的代码。 可选的人脸检测模型(区别是检测速度和精度不同

    2023年04月12日
    浏览(61)
  • 【计算机视觉|人脸识别】 facenet-pytorch 项目中文说明文档

    下文搬运自GitHub,很多超链接都是相对路径所以点不了,属正常现象。 点击查看原文档 。转载请注明出处。 Click here to return to the English document 译者注: 本项目 facenet-pytorch 是一个十分方便的人脸识别库,可以通过 pip 直接安装。 库中包含了两个重要功能 人脸检测:使用MT

    2024年02月04日
    浏览(48)
  • 计算机竞赛 图像识别-人脸识别与疲劳检测 - python opencv

    🔥 优质竞赛项目系列,今天要分享的是 🚩 基于图像识别的人脸识别与疲劳检测系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:5分 🧿 更多资料, 项目分享: https://gitee.co

    2024年02月12日
    浏览(70)
  • 计算机竞赛 基于深度学习的人脸性别年龄识别 - 图像识别 opencv

    🔥 优质竞赛项目系列,今天要分享的是 🚩 毕业设计 人脸性别年龄识别系统 - 图像识别 opencv 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:3分 🧿 更多资料, 项目分享: https

    2024年02月10日
    浏览(95)
  • 基于深度学习的人脸性别年龄识别 - 图像识别 opencv 计算机竞赛

    🔥 优质竞赛项目系列,今天要分享的是 🚩 毕业设计 人脸性别年龄识别系统 - 图像识别 opencv 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:3分 🧿 更多资料, 项目分享: https

    2024年02月06日
    浏览(67)
  • 计算机设计大赛 图像识别-人脸识别与疲劳检测 - python opencv

    🔥 优质竞赛项目系列,今天要分享的是 🚩 基于图像识别的人脸识别与疲劳检测系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:5分 🧿 更多资料, 项目分享: https://gitee.co

    2024年02月20日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包