OpenCV+Ubuntu+QT实现人脸检测/识别(考勤管理)

这篇具有很好参考价值的文章主要介绍了OpenCV+Ubuntu+QT实现人脸检测/识别(考勤管理)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 开发环境

		Ubuntu18 + OpenCV3 + qt5

2.环境配置

1. 虚拟机安装Ubuntu

2. 安装qt5

OpenCV+Ubuntu+QT实现人脸检测/识别(考勤管理),opencv,ubuntu,qt,物联网下载完成后在下载目录打开终端,赋予可执行权限,再执行即可安装qt
sudo chmod +x qt-opensource-linux-x64-5.12.8.run
OpenCV+Ubuntu+QT实现人脸检测/识别(考勤管理),opencv,ubuntu,qt,物联网

3. 安装OpenCV库

可参考文章

4. 在QT中引用OpenCV库

若按照上述方法安装好opencv,创建测试项目,在pro文件中加入:

INCLUDEPATH += /usr/local/include //opencv头文件安装路径
LIBS += /usr/local/lib/libopencv_* //opencv库文件路径

测试:

#include <QWidget>
#include <opencv2/core.hpp>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <QMessageBox>
#include <QDebug>

using namespace std;
using namespace cv;

//widget.cpp的析构函数
{
VideoCapture cap(0);
    if(!cap.isOpened())
        QMessageBox::warning(this,"error","open camera faild!");
    cout << "open camera success" << endl;
    Mat frame;
    cap.set(cv::CAP_PROP_FRAME_WIDTH, 640);
    cap.set(cv::CAP_PROP_FRAME_HEIGHT, 480);
    cap.set(cv::CAP_PROP_FPS, 30);


    for(;;){
        cap >> frame;
        if (frame.empty()) {
            qDebug() << "错误:无法捕获帧";
            break;  // 退出循环或根据需要处理错误
        }
        imshow("video", frame);
        waitKey(27);
    }

}

(若出现警告 “VIDEOIO(V4L2:/dev/video0): select() timeout”,在虚拟机->设置->USB控制器,更改一下兼容性,更改为3.1即可解决问题)

启动程序若正常出现摄像头画面则表明安装配置成功。

ps:一般配置完成后你会发现摄像头是反镜像的(实际使用一般是镜像-前置摄像头)这是可以用flip函数来调整画面流frame:

flip(image, flippedImage, 1): 水平翻转
flip(image, flippedImage, 0): 垂直翻转
flip(image, flippedImage, -1): 水平和垂直同时翻转

flip 函数有三个参数,分别是:

**image:**输入图像,即需要进行翻转的原始图像。

**flippedImage:**输出图像,即翻转后的图像将存储在这里。

这里使用 flip(frame, frame, 1);即可改变原图形

3. 人脸检测

1.图像处理

  1. 将摄像头画面由rgb(彩色)转换为gray(灰度图)
    #include <opencv2/imgproc.hpp>		//所需头文件
    #include <opencv2/objdetect.hpp>
    cvtColor(frame,Grayimage,CV_BGR2GRAY);//将彩色图转换从灰度图 其中frame是初始Mat容器所存放的画面流,
                                          //Grayimage是转换后的图像 CV_BGR2GRAY是参数
  1. 图形均衡化(调整亮度,对比度)
equalizeHist(InputArray src,OutputArray dst); //函数参数说明
equalizeHist(Grayimage,Grayimage);      //进行均衡化处理,将处理后的图形进行覆盖(节约内存)

2.人脸轮廓检测

  1. 加载级联分类器(CascadeClassifier)(关于级联分类器相关可参考)
Ubuntu:/usr/share/opencv/haarcascades$ ls
haarcascade_eye_tree_eyeglasses.xml
haarcascade_eye.xml
haarcascade_frontalcatface_extended.xml
haarcascade_frontalcatface.xml
haarcascade_frontalface_alt2.xml
haarcascade_frontalface_alt_tree.xml
haarcascade_frontalface_alt.xml
haarcascade_frontalface_default.xml
haarcascade_fullbody.xml
haarcascade_lefteye_2splits.xml
haarcascade_licence_plate_rus_16stages.xml
haarcascade_lowerbody.xml
haarcascade_profileface.xml
haarcascade_righteye_2splits.xml
haarcascade_russian_plate_number.xml
haarcascade_smile.xml
haarcascade_upperbody.xml

//这里我们使用OpenCV训练好的级联分类器进行人脸轮廓检测,可在构造函数中声明即可
    classifier.load("/usr/share/opencv/haarcascades/haarcascade_frontalface_alt.xml");

    if (classifier.empty()) {
        qDebug() << "错误:无法加载级联分类器文件";
    }

/* 
detectMultiScale(InputArray image,vector<Rect>& objects)	检测函数说明
rectangle (InputOutputArray img,Point pt1,Point pt2,constScalar& color)	将检测到的人脸矩形框绘制在图形上的函数说明
*/

//具体使用:
	vector<Rect> Allface;           //矩形存放容器
//这里我们使用OpenCV库中已经训练好的级联分类器进行人脸轮廓的识别
    classifier.detectMultiScale(Grayimage,Allface);      //检测人脸矩形存放到vector容器中
     if(Allface.size()){ //是否存在人脸
        rectangle(Grayimage,Allface[0],Scalar(255,0,0));   //Allce中存放多个矩形(多张人脸,按照数组形式排列 Scalar改变颜色(rgb)
    }


上述仅为关键代码
OpenCV+Ubuntu+QT实现人脸检测/识别(考勤管理),opencv,ubuntu,qt,物联网

  1. 将检测的人脸矩形框保存
//先创建一个Mat容器用于存放截取到的矩形人脸框
 Mat Matface;   //存放检测的人脸矩形框
 vector<uchar> JpgFace;   //存放jpg格式的图形

 if(Allface.size()){ //是否存在人脸
        rectangle(Grayimage,Allface[0],Scalar(255,0,0));    //Allce中存放多个矩形(多张人脸,按照数组形式排列 Scalar改变颜色(rgb)
        Matface = Grayimage(Allface[0]);                    //将截取的人脸存放到Matface中
        imencode(".jpg",Matface,JpgFace);                   //将Matface中的图片转化成jpg格式
    }
    
//imencode函数说明:
imencode(const String &ext,InputArray img,vector<uchar> &buf)

3.百度智能云平台注册

  1. 注册百度智能云平台
    进入官网>产品>人脸识别>人脸搜索 官网链接
    OpenCV+Ubuntu+QT实现人脸检测/识别(考勤管理),opencv,ubuntu,qt,物联网OpenCV+Ubuntu+QT实现人脸检测/识别(考勤管理),opencv,ubuntu,qt,物联网

立即创建即可

OpenCV+Ubuntu+QT实现人脸检测/识别(考勤管理),opencv,ubuntu,qt,物联网

即可在应用列表查看到自己的接口信息

  1. 创建人脸库
    OpenCV+Ubuntu+QT实现人脸检测/识别(考勤管理),opencv,ubuntu,qt,物联网

选择查看人脸库即可自定义添加组和人员,上传清晰人脸照即可

4.SDK环境搭建

  1. 技术文档 > SDK文档 > C++文档 > 按照流程下载人脸识别SDK到Ubuntu中(具体流程可参考文档)
    OpenCV+Ubuntu+QT实现人脸检测/识别(考勤管理),opencv,ubuntu,qt,物联网
  2. 安装依赖库libcurl(需要支持https)openssl(加密) jsoncpp
sudo apt-get install libcurl4-openssl-dev
sudo apt-get install openssl
sudo apt-get install libjsoncpp-dev
  1. 将下载好的SDK解压,并将其base文件夹以及face.h(人脸检测只需这两个文件)文件复制到你的项目中参考文档
    OpenCV+Ubuntu+QT实现人脸检测/识别(考勤管理),opencv,ubuntu,qt,物联网

这里编译可能会出现报错找不到json和openssl路径,点击错误代码行,将其改为
#include <jsoncpp/json/json.h>
#include "jsoncpp/json/json.h"
(即改变路径,在前面加上jsoncpp)
并安装libssl库
sudo apt-get install libssl-dev

LIBS += -lcurl -lcrypto -ljsoncpp	//在pro文件中加入

并在程序中引入头文件和命名空间

#include <face.h>
using namespace aip;

5.平台接入

  1. 建立交互客户端client
	//头文件中先声明client指针类型对象,再在构造函数中实例化赋值(使用完后需要用delete client进行销毁)
	//widget.h
    Face *client;            //创建客户端对象

	//widget.cpp
    //建立百度交互客户端client
    // 设置APPID/AK/SK
    string app_id = "你自己的";
    string api_key = "你自己的";
    string secret_key = "你自己的";

    client = new Face(app_id,api_key,secret_key);
  1. 格式转换

梳理一下我们的摄像头捕捉流程

frame(初始的彩色视频帧流) > Grayimage(灰度化)> Matface(存放截取的人脸矩形)> JpgFace(人脸矩形图片转化为JPG格式)> Base64Fce(转化为base64格式-百度人脸识别要求的格式)>>>>

//widget.h
//先在头文件的private中声明一个容器存放base64格式的图片
string Base64Face;               //用于存放转换成base64格式的照片

//widget.cpp
Base64Face =  base64_encode((char *)JpgFace.data(),JpgFace.size());   //将jpg格式的图片转化为base64格式的
  1. 接收检测结果
//widget.h
 Json::Value result;             //用于接受检测结果的容器


// 带参数调用人脸搜索函数说明
//result = client.face_search_v3(image, image_type, group_id_list, options);

result =  client->face_search_v3(Base64Face,"BASE64","student",Json::nullValue);
cout << result <<endl;	//打印测试结果

这里如果报错multiple definition (多重定义):可以将出现多重定义的函数定义为static(静态函数)

6.验证检测结果

OpenCV+Ubuntu+QT实现人脸检测/识别(考勤管理),opencv,ubuntu,qt,物联网

可以看到控制台已经输出JSON格式的数据,并且检测成功

7.解析数据

  1. json解析
//result返回json数据格式
{
	"cached" : 0,
	"error_code" : 0,
	"error_msg" : "SUCCESS",
	"log_id" : 2660475389,
	"result" : 
	{
		"face_token" : "952d7830427201926483ab1f02f015b8",
		"user_list" : 
		[
			{
				"group_id" : "student",
				"score" : 80.822387695312003,
				"user_id" : "yyqx",
				"user_info" : ""
			}
		]
	},
	"timestamp" : 1705394660
}
        if(!result["result"].isNull())  //发送来的数据中result不为空(检测到人脸)
        {
            if(result["result"]["user_list"][0]["score"].asInt() >= 88)    //提取数据中的score信息(匹配度高才算成功)
            {
                QString name = QString::fromStdString(result["result"]["user_list"][0]["user_id"].asString());  //将姓名转化成Qstring类型以便提示
                QMessageBox::information(this,"欢迎!",name+"打卡成功!");
 
            }

            else  if(result["result"]["user_list"][0]["score"].asInt() < 88) {  //未在人脸库中
                QMessageBox::information(this,"欢迎!","人员未注册,请联系管理员!");
            }
        }

jsoncpp的解析可参考
这里已经实现了人脸检测+识别+数据解析文章来源地址https://www.toymoban.com/news/detail-813312.html

  1. 获取系统时间
//widget.h
#include <QDateTime>
QDateTime currenttime;        //获取时间

//更新后
 if(!result["result"].isNull())  //发送来的数据中result不为空(检测到人脸)
        {
            if(result["result"]["user_list"][0]["score"].asInt() >= 88)    //提取数据中的score信息(匹配度高才算成功)
            {
                currenttime = QDateTime::currentDateTime(); // 获取当前时间
                QString checktime = currenttime.toString("yyyy-MM-dd hh:mm:ss"); // 将时间转换为字符串

                QString name = QString::fromStdString(result["result"]["user_list"][0]["user_id"].asString());  // 将姓名转化成QString类型以便提示
                QMessageBox::information(this, "欢迎!", name + "打卡成功!" + checktime);

            }

            else  if(result["result"]["user_list"][0]["score"].asInt() < 88) {  //未在人脸库中
                QMessageBox::information(this,"欢迎!","人员未注册,请联系管理员!");
            }
        }
  1. 效果
    OpenCV+Ubuntu+QT实现人脸检测/识别(考勤管理),opencv,ubuntu,qt,物联网

到了这里,关于OpenCV+Ubuntu+QT实现人脸检测/识别(考勤管理)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 基于OpenCV+Keras+tensorflow 实现的变电站作业管控平台源代码。含人脸识别考勤,移动目标跟踪,越线检测,安全措施检测,姿态识别等功能

    #综述 使用该作业现场安全生产智能管控平台来实现变电站的安全生产的智能化管理,通过人脸识别功能进行人员的考勤; 通过人员、车辆的检测和识别来实现变电站的智能化管理;通过安全行为识别和安全区域报警功能来实现对变电站内人员和设备安全的监督; 完整代码下

    2024年02月10日
    浏览(42)
  • Ubuntu下的Opencv识别人脸#采用百度智能云平台方案#人脸识别考勤机#C++

    #简介:这是在ubuntu22.04里面使用opencv打开摄像头,通过摄像头获取图像并截取人脸图像,再将人脸图像转换成百度智能云平台所能接受的base64格式(当然也有其他格式),将base64格式的人脸图像发送给百度智能云,通过智能云平台的计算得到图像的匹配信息,本机接收到信息

    2024年02月20日
    浏览(77)
  • 做一个人脸识别考勤机项目(利用OpenCV)

    重要说明 :此项目直接跟进操作的话只能在Ubuntu16.04上面编译成功!目前已经补上18.04上的编译操作。         本文主要跟随B站Up主【物联网小学妹】上传的【从0到1做一个物联网人脸识别考勤机项目!】视频教程做一个简要笔记 视频地址:【大厂敲门砖】从0到1做一个物

    2024年04月22日
    浏览(50)
  • python人脸识别考勤系统 考勤签到系统 OpenCV 大数据 毕业设计(源码)✅

    毕业设计:2023-2024年计算机专业毕业设计选题汇总(建议收藏) 毕业设计:2023-2024年最新最全计算机专业毕设选题推荐汇总 🍅 感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。

    2024年02月19日
    浏览(68)
  • C语言实现学生考勤管理系统

    题目要求:

    2024年02月11日
    浏览(46)
  • Java实现的企业员工考勤管理系统

    目录 一、引言 2 编写目的 2 项目背景 2 二、总体设计 3 2.1运行要求 3 2.2接口设计 3 2.3构架设计 3 2.4基本设计概念和处理流程 3 2.5结构 5 2.6功能需求与各模块之间关系 6 2.6.1基本信息管理模块 6 2.6.2个人出勤管理模块 10 2.6.3出勤管理模块 14 三、数据的逻辑描述 17 3.1 静态数据

    2024年02月09日
    浏览(45)
  • 基于SSM的学生考勤管理系统的设计与实现

    项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问题,今天给大家介绍一篇基于SSM的学生考勤管理系

    2024年02月05日
    浏览(44)
  • Python基于 opencv 的人脸识别考勤系统(V1.0),附源码

    博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12W+、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅 文末获取源码联系 🍅 👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟 2022-2024年最全的计算机软件毕业设计选

    2024年03月26日
    浏览(77)
  • java项目分享 - 基于opencv、dilb的员工人脸识别考勤系统

    基于opencv、dilb的员工人脸识别考勤系统 提示:适合用于课程设计或毕业设计,工作量达标,源码开放 选题“员工刷脸考勤”,要求采用python语言开发,可以通过摄像头添加员工面部信息,这里就涉及到两个具体的个问题,一个是应该以什么样的数据来标识每一个员工的面部

    2024年01月17日
    浏览(50)
  • 人工智能-OpenCV+Python实现人脸识别(人脸检测)

    在OpenCV中使用Haar特征检测人脸,那么需要使用OpenCV提供的xml文件(级联表)在haarcascades目录下。这张级联表有一个训练好的AdaBoost训练集。首先要采用样本的Haar特征训练分类器,从而得到一个级联的AdaBoost分类器。Haar特征值反映了图像的灰度变化情况。例如:脸部的一些特征

    2024年02月06日
    浏览(99)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包