做一个人脸识别考勤机项目(利用OpenCV)

这篇具有很好参考价值的文章主要介绍了做一个人脸识别考勤机项目(利用OpenCV)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0.前言

重要说明:此项目直接跟进操作的话只能在Ubuntu16.04上面编译成功!目前已经补上18.04上的编译操作。

        本文主要跟随B站Up主【物联网小学妹】上传的【从0到1做一个物联网人脸识别考勤机项目!】视频教程做一个简要笔记

视频地址:【大厂敲门砖】从0到1做一个物联网人脸识别考勤机项目!(附源码)_哔哩哔哩_bilibili

 视频对应资源(没必要下载,帮助不大): 

链接:https://pan.baidu.com/s/1rEhfDg_Yc1SMD40fGdVqhw?pwd=yjgn 
提取码:yjgn

学习所需前置条件:

        1.Linux系统安装  2.Linux操作基础  3.C++编程

我的Linux学习笔记:Linux学习笔记_Jenlibein的博客-CSDN博客

C++学习跟进可以看这个:【2023最新版C++】实战项目教程,清华武老师带你零基础一套快速学会c++_哔哩哔哩_bilibili


目录

1.安装与配置

1.1下载

1.2安装

1.3中文配置

2.C++程序编写

3.OpenCV 初次认识 / 安装

3.1介绍

3.2安装

3.3更多学习

4.OpenCV编程

4.0确保摄像头打开

4.1图像采集

4.2图像处理

4.3人脸检测

4.4图像截图/图片解码和编码

5.百度智能云平台

5.1人脸库创建

5.2 SDK环境搭建

5.3百度智能云平台接入

6.数据处理

6.1Json数据解析

6.2记录考勤时间

6.3考勤信息记录及显示

7.最终实现

8.文章结束


1.安装与配置

1.1下载

视频中使用的Linux发行版为Ubuntu16.04,可以在我给出的 视频对应资源 中下载得到。

        但是,百度网盘的必须要VIP才能下载这么大的文件,不然就不知道要下载到猴年马月了。

        所以,我建议在国内镜像源中下载:ubuntu 16.04 镜像下载(国内开源镜像站)_ubuntu16.04-CSDN博客

        按常理说,下载选择的文件后缀应该是【desktop-amd64.iso】,选择好下载即可。

1.2安装

        可以参考Linux学习笔记那的三个方法

1.3中文配置

        在左栏菜单选中【System Settings】

        进入设置菜单选中【Language Support】

        第一次进入会有个提示安装的窗口,点确认。

        然后点【Install / Remove Languages...】选项,进入窗口后下拉找到Chinese(simplified)并勾选,然后点Apply,进入下载。

        回到【Language Support】窗口,然后在上列菜单中,将下面的 [  汉语(中国)] 拖动到最上面位置,确保该文字由灰色 变为黑色 并处于第一位 ,然后重启电脑。

        进到中文语言的系统。

        拼音设置:可以查看Linux下使用拼音的相关教程

        

2.C++程序编写

        B站教程中用gedit进行创建文本,然后在文本里写C++代码。

        然后用

g++ file.cpp -o 输出名称

        来输出可执行文件

        

        用到第三方库时,编译时要加上链接(例如OpenCv的highgui库)

g++ main.cpp -o main -lopencv_highgui

        我认为:还是用vscode等专业的IDE来编写代码更好,有利于编写时候的视觉观看和找bug。

        编写时候主要用OpenCV

#include "opencv2/opencv.hpp"

        并使用命名空间

using namespace cv;

3.OpenCV 初次认识 / 安装

3.1介绍

        OpenCV是一个开源的计算机视觉和机器学习软件库其使用一系列C语言函数和少量C++类实现,内部实现了很多图像处理和计算机视觉的通用算法。

        OpenCV可以运行在Linux系统上,且其轻量、高效所以在嵌入式领域得到广泛的应用。

3.2安装

终端中输入命令:

sudo apt-get install libopencv-dev

3.3更多学习

官方在线文档(深入学习使用):OpenCV - Open Computer Vision Library

网上OpenCV的教程大多数是以python作为编程语言,C++作为编程语言的教程较少。

我在B站上发现一个OpenCV的C++教程:2023年度最佳 Open Cv 学习教程,C++向!_哔哩哔哩_bilibili

当然之后也可以通过Python学习其他的OpenCV教程。

4.OpenCV编程

4.0确保摄像头打开

         如何确认Linux下有无摄像头接入:进入dev文件夹查看有无vedio文件。

        虚拟机内没有识别,需要另外设置:虚拟机设置 - USB控制器 - USB兼容性 ---> 改为USB3.0或3.1并点确定基于opencv的人脸识别考勤,人工智能,c++,linux,ubuntu,opencv,百度云

然后在虚拟机主窗口 左上角菜单 - 虚拟机(M) - 可移动设备 - 找到摄像头设备 ---> 点击链接

如果还是不行,观察虚拟机主窗口右下角有无对应摄像头的USB图标--->有则右键 - 选择连接

基于opencv的人脸识别考勤,人工智能,c++,linux,ubuntu,opencv,百度云

4.1图像采集

:highgui

函数:VideoCapture(摄像头开启)

摄像头设置参数:

VideoCapture cap(0);

 cap.set(CV_CAP_PROP_FRAME_WIDTH, 1080);//宽度 
 cap.set(CV_CAP_PROP_FRAME_HEIGHT, 960);//高度
 cap.set(CV_CAP_PROP_FPS, 30);//帧率 帧/秒
 cap.set(CV_CAP_PROP_BRIGHTNESS, 1);//亮度 1
 cap.set(CV_CAP_PROP_CONTRAST,40);//对比度 40
 cap.set(CV_CAP_PROP_SATURATION, 50);//饱和度 50
 cap.set(CV_CAP_PROP_HUE, 50);//色调 50
 cap.set(CV_CAP_PROP_EXPOSURE, 50);//曝光 50


获取参数:

cap.get(CV_CAP_PROP_FRAME_WIDTH);
cap.get(CV_CAP_PROP_FRAME_HEIGHT);
cap.get(CV_CAP_PROP_FPS);
cap.get(CV_CAP_PROP_BRIGHTNESS);
cap.get(CV_CAP_PROP_CONTRAST);
cap.get(CV_CAP_PROP_SATURATION);
cap.get(CV_CAP_PROP_HUE);
cap.get(CV_CAP_PROP_EXPOSURE);

:core

函数:Mat(定义图像容器)

具体可通过代码注释了解:

#include <iostream>
#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;

int main(){
    VideoCapture cap(0); //括号内数字代表摄像头编号,一般为0 -> 打开编号为0的摄像头并命名为cap

    if(!cap.isOpened()){ //检测是否成功打开摄像头
        cout<< "Camera open failed" <<endl;
        return -1;
    }else{
        cout<< "Camera open success" <<endl;
    }

    Mat ColorImage; //实例化一个Mat类型数据(类似于 int a)

    for(;;){
        cap >> ColorImage; //从相机获取一个新的框架(拍照)

        imshow("video",ColorImage);  //图片展示,引号内为终端窗口名称,第二个参数为显示的具体照片
    
        waitKey(100); //暂停100ms
    }//想退出循环直接在终端中按Ctrl+C
    
    return 0;
}

编译要加上库,不然会报错 

VideoCapture位于highgui
Mat位于core

g++ main.cpp -o main -lopencv_highgui -lopencv_core

opencv读取视频有延迟解决方法:

        opencv在摄像机每次获取的新帧时候总是先把上一次读取的帧拿出来先用,再把新帧加入缓存.

        所以要想获取最新的帧,一定要连续读两次才是当前最新的。

        也就是把 cap >> ColorImage; 重复两行。

4.2图像处理

:imgproc - Image Processing

函数1:cvtColor(色彩转换):void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0)

第一个参数 src - source输入容器;输入图像:8位无符号,16位无符号(CV_16UC…),或单精度浮点。

第二个参数 dst - Destination输出容器,输出目标与原图像具有同样的大小与类型。

第三个参数 code

        转换方式::CV_BGR2GRAY,CV RGB2GRAY,CY GRAY2BGR, CY GRAY2RGB

        分别对应:1,2对应彩转灰 ,3,4对应灰转彩。

函数2:equalizeHist(直方图均衡):void equalizeHist (InputArray src, OutputArray dst)

第一个参数,输入8位单通道的图像;

第二个参数,输出目标图像,与原图像具有同样的大小与类型;

上面两个函数处理图像后可以利于人脸检测运行。

函数3:调整大小(此步骤非必要):

resize( InputArray src, OutputArray dst, Size(width, height), code );

code:

INTER_AREA 使用像素面积关系进行重采样。这最适合减小图像的大小(缩小)。当用于放大图像时,它使用INTER_NEAREST方法。

INTER_CUBIC 这使用双三次插值来调整图像大小。在调整大小和插入新像素时,此方法作用于图像的4x4相邻像素。然后取16个像素的权重平均值来创建新的插值像素。

INTER LINEAR:这个方法有点类似于INTER CUBI插值。与不同INTER CUBIC的是这使用2x2相像素来获得插值像素的加权平均值。

INTER_NEAREST:该INTER_NEAREST方法使用最近邻概念进行插值。这是最简单的方法之一,仅使用图像中的一个相邻像素进行插值。

代码实现(4.1原有代码为基础):

#include <iostream>
#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;

int main(){
    VideoCapture cap(0);

    if(!cap.isOpened()){
        cout<< "Camera open failed" <<endl;
        return -1;
    }else{
        cout<< "Camera open success" <<endl;
    }

    Mat ColorImage;
    Mat GrayImage;   //创建灰度图容器

    for(;;){
        cap >> ColorImage;

        cvtColor(ColorImage, GrayImage, CV_BGR2GRAY);  //转为灰度图
        equalizeHist(GrayImage, GrayImage);            //均衡化;输入输出容器一致,可以省一些内存。
        
        imshow("video",GrayImage);
        waitKey(100);
    }
    
    return 0;
}

编译:

g++ main.cpp -o main -lopencv_highgui -lopencv_core -lopencv_imgproc

4.3人脸检测

:objdetect - Object Detection

:CascadeClassifier(级联分类器) 需要先导入一个后缀名为.xml的分类器文件,它是前人已经创建好的分类器,我们可以直接使用

OpenCV安装时自带的一些训练好的模型文件位置:/usr/share/opencv/haarcascades/

函数1:CascadeClassifier :: detectMultiScale

功能:从输入的图片中检测不同尺寸的物体(载入人脸识别模型后这个物体就是人脸),并返回一个矩形组成的列表(矩形框起来的就是脸)。

void CascadeClassifier:: detectlultiScale(const Mat& image, vector<Rect>& objects, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size())

第一个参数:输入目标,要检测的图像

第二个参数:输出目标,存储矩形框的容器

其他参数:有默认值,使用默认值即可

:core

方法:rectangle(在图形上画矩形)

void rectangle(Mat& img, Rect rec, const Scalar& color, int thickness=1, int lineType=8, int shift=0 ) 

第一个参数:要画的图像

第二个参数:输入的矩形

第三个参数:矩形颜色

其他参数:默认值即可

代码实现(基于以前代码增加):

#include <iostream>
#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;

int main(){
    VideoCapture cap(0);

    if(!cap.isOpened()){
        cout<< "Camera open failed" <<endl;
        return -1;
    }else{
        cout<< "Camera open success" <<endl;
    }

    实例化一个级联分类器,此处加载opencv现成的模型
    CascadeClassifier Classifier("/usr/share/opencv/haarcascades/haarcascade_frontalface_alt2.xml");
    定义一个储存所输出矩形的容器
    vector<Rect> AllFace;

    Mat ColorImage;
    Mat GrayImage;

    for(;;){
        cap >> ColorImage;
        cvtColor(ColorImage, GrayImage, CV_BGR2GRAY);
        equalizeHist(GrayImage, GrayImage);

        人脸检测并输出;
        Classifier.detectMultiScale(GrayImage, AllFace); 
	
	if( AllFace.size()!=0 ){   //判断是否有脸,避免程序出错
	    图像上画出矩形
	    rectangle(GrayImage, AllFace[0], Scalar(255,0,0));
        }

        imshow("video",GrayImage);
        waitKey(100);
    }
    
    return 0;
}

编译:

g++ main.cpp -o main -lopencv_highgui -lopencv_core -lopencv_imgproc -lopencv_objdetect

4.4图像截图/图片解码和编码

:highgui

函数1:imdecode(函数解码)

函数2:imencode(函数编码)

bool imencode(const string& ext, InputArray img, vectoreuchar>& buf, const vector<int> & params=vector <int>0)

第一个参数:输出后所希望获得的格式

第二个参数:输入的图像

第三个参数:存储编码完图像的容器

其他参数:保持默认

代码实现(基于以前代码增加):

#include <iostream>
#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;

int main(){
    VideoCapture cap(0);

    if(!cap.isOpened()){
        cout<< "Camera open failed" <<endl;
        return -1;
    }else{
        cout<< "Camera open success" <<endl;
    }

    CascadeClassifier Classifier("/usr/share/opencv/haarcascades/haarcascade_frontalface_alt2.xml");
    vector<Rect> AllFace;

    Mat ColorImage;
    Mat GrayImage;
    创建人脸截图容器
    Mat MatFace;
    创建用于存储编码完图像的容器
    vector<uchar> JpgFace;

    for(;;){
        cap >> ColorImage;
        cvtColor(ColorImage, GrayImage, CV_BGR2GRAY);
        equalizeHist(GrayImage, GrayImage);

        Classifier.detectMultiScale(GrayImage, AllFace); 
	
	if( AllFace.size()!=0 ){
	    rectangle(GrayImage, AllFace[0], Scalar(255,0,0));

            用矩形截出人脸(相当于截图)
            MatFace = GrayImage(AllFace[0]); 
            编码
            imencode(".jpg", MatFace, JpgFace);
        }

        imshow("video",GrayImage);
        waitKey(100);
    }
    
    return 0;
}

5.百度智能云平台

5.1人脸库创建

人脸识别区:人脸识别_人脸识别_准确率99.99%_免费试用-百度AI开放平台 (baidu.com)

进入网站点立即使用,之后先登录,登录完后进入默认界面。

此时退出该登录主页,重新进入人脸识别区主页,再次点击立即使用。 

之后点如图处基于opencv的人脸识别考勤,人工智能,c++,linux,ubuntu,opencv,百度云

进入页面后,领取人脸识别接口免费资源

下一步如图进入-可视化人脸库

基于opencv的人脸识别考勤,人工智能,c++,linux,ubuntu,opencv,百度云

点【新建组】基于opencv的人脸识别考勤,人工智能,c++,linux,ubuntu,opencv,百度云

点击用户组ID

基于opencv的人脸识别考勤,人工智能,c++,linux,ubuntu,opencv,百度云

点击新建用户,添加你自己的照片和其他人的照片,比如某些明星的正脸照。

5.2 SDK环境搭建

SDK开发包下载:C++-SDK - 人脸识别_人脸检测_人脸对比_人脸搜索_活体检测_百度智能云 (baidu.com)

基于opencv的人脸识别考勤,人工智能,c++,linux,ubuntu,opencv,百度云

基于opencv的人脸识别考勤,人工智能,c++,linux,ubuntu,opencv,百度云

将SDK压缩包解压缩后的文件夹放到Ubuntu里面

SDK包相关依赖下载:安装依赖库libcurl(需要支持https), openssl,jsoncpp(>1.6.2版本,0.x版本将不被支持)。

libcurl(网络通信的协议库)

openssl(网络通信加密)

jsoncpp(提取信息)

安装

sudo apt-get install libcurl4-openssl-dev

sudo apt-get install openssl

sudo apt-get install libjsoncpp-dev

sudo apt-get install libssl-dev

检测是否安装成功(install ok字样,同时观察版本是否合适)

dpkg -s libcurl4-openssl-dev

dpkg -s openssl

dpkg -s libjsoncpp-dev

sudo apt-get install libssl-dev

编译(文件库支持C++11版本,同时需要加上第三方库)

将cpp文件放置于SDK文件夹里面,方便编译时找到头文件

编译文件时候在最后加入 ( -std=c++11 -lcurl -lcrypto -ljsoncpp)

g++ main.cpp -o main -lopencv_highgui -lopencv_core -lopencv_imgproc -lopencv_objdetect -std=c++11 -lcurl -lcrypto -ljsoncpp

修改 base.h 和 http.h 文件中json头文件的目录位置

        #include <jsoncpp/json/json.h>

(未解决)评论区反应face.h的search函数出现问题

编写

加入相关头文件和命名空间

        #include "face.h"

        using namespace aip;

5.3百度智能云平台接入

百度提供代码:

  // 设置APPID/AK/SK
    std::string app_id = "你的 App ID";
    std::string api_key = "你的 Api key";
    std::string secret_key = "你的 Secret Key";

    aip::Face client(app_id, api_key, secret_key);

 回到 百度智能云平台-应用列表

基于opencv的人脸识别考勤,人工智能,c++,linux,ubuntu,opencv,百度云

查看相应参数,写到所给代码对应位置

函数:(注意,视频所给的函数是search,但官方文档已经更新成search_v3):

// 调用人脸搜索
result = client.face_search_v3(image, image_type, group_id_list, aip::null);
// 带参数调用人脸搜索
result = client.face_search_v3(image, image_type, group_id_list, options);

//此处options填你最终储存容器

// 如果有可选参数
std::map<std::string, std::string> options;
options["match_threshold"] = "70";
options["quality_control"] = "NORMAL";
options["liveness_control"] = "LOW";
options["user_id"] = "233451";
options["max_user_num"] = "3";

image :图片信息(总数据大小应小于10M)

image_type:图片类型 BASE64:(图片大小不超过2M),URL:图片的 URL地址,FACE_TOKEN: 人脸图片的唯一标识。

group_id_list:从指定的group中进行查找 用逗号分隔,上限10个

这里我们使用base64编码:

base64_encode(const char* bytes_to_encode, unsigned int int_len);

接收返回数据:

百度提供代码(最终获取的容器):

Json::Value result;

 返回数据示例:

{
  "face_token": "fid",
  "user_list": [
     {
        "group_id" : "test1",
        "user_id": "u333333",
        "user_info": "Test User",
        "score": 99.3
    }
  ]
}

代码实现(基于前面写的代码修改):

#include <iostream>
#include "opencv2/opencv.hpp"
#include "face.h"        //库

using namespace std;
using namespace cv;
using namespace aip;     //命名空间

int main(){
    VideoCapture cap(0);

    if(!cap.isOpened()){
        cout<< "Camera open failed" <<endl;
        return -1;
    }else{
        cout<< "Camera open success" <<endl;
    }

    CascadeClassifier Classifier("/usr/share/opencv/haarcascades/haarcascade_frontalface_alt2.xml");
	
    //写上对参数到所给代码
    aip::Face client("******", "******", "******");

    vector<Rect> AllFace;

    Mat ColorImage;
    Mat GrayImage;
    Mat MatFace;

    vector<uchar> JpgFace;

    //定义转换完成base64格式的图片
    string Base64Face;
    //定义获取返回结果的容器
    Json::Value result;

    for(;;){
        cap >> ColorImage;
        cvtColor(ColorImage, GrayImage, CV_BGR2GRAY);
        equalizeHist(GrayImage, GrayImage);

        Classifier.detectMultiScale(GrayImage, AllFace); 
	
	if( AllFace.size()!=0 ){
	    rectangle(GrayImage, AllFace[0], Scalar(255,0,0));

            MatFace = GrayImage(AllFace[0]); 
            imencode(".jpg", MatFace, JpgFace);
            //编码成base64
            Base64Face = base64_encode((char *)JpgFace.data(), JpgFace.size());
            //传输到百度,获取返回结果
            result = client.face_search_v3(Base64Face, "BASE64", "Teaching", result);
            //打印结果
            cout<<result<<endl;
        }

        imshow("video",GrayImage);
        waitKey(100);
    }
    
    return 0;
}

编译:

g++ main.cpp -o main -lopencv_highgui -lopencv_core -lopencv_imgproc -lopencv_objdetect  -std=c++11 -lcurl -lcrypto -ljsoncpp

运行后成功获取返回信息:

基于opencv的人脸识别考勤,人工智能,c++,linux,ubuntu,opencv,百度云

6.数据处理

6.1Json数据解析

        观察百度所给的返回数据形式

        我们要获取的目标是人脸所对应的人的信息,所以我们只需要从数据中提取特定信息

        1.判断是否检测到人脸

                opencv所给模型不太精确,会将疑似为人脸的物体也上传。百度会进行第二次检测是否有人脸。如果返回为空则不打印信息

        2.判断人脸匹配得分

                如果匹配得分很低说明只是有人脸,百度会返回得分最高的人,即使得分很低,所以结果会不准确。所以我们要控制得分在80以上

        3.只返回人脸所匹配的人的名字

                其他信息对我们获取人的身份信息没有什么作用,我们只需要获取匹配人的名字。

代码实现(基于前面写的代码修改):

#include <iostream>
#include "opencv2/opencv.hpp"
#include "face.h"

using namespace std;
using namespace cv;
using namespace aip;

int main(){
    VideoCapture cap(0);

    if(!cap.isOpened()){
        cout<< "Camera open failed" <<endl;
        return -1;
    }else{
        cout<< "Camera open success" <<endl;
    }

    CascadeClassifier Classifier("/usr/share/opencv/haarcascades/haarcascade_frontalface_alt2.xml");

    aip::Face client("******", "lNW******5EF", "XItO******FzS");

    vector<Rect> AllFace;

    Mat ColorImage;
    Mat GrayImage;
    Mat MatFace;

    vector<uchar> JpgFace;

    string Base64Face;

    Json::Value result;

    for(;;){
        cap >> ColorImage;
        cvtColor(ColorImage, GrayImage, CV_BGR2GRAY);
        equalizeHist(GrayImage, GrayImage);

        Classifier.detectMultiScale(GrayImage, AllFace); 
	
	if( AllFace.size()!=0 ){
	    rectangle(GrayImage, AllFace[0], Scalar(255,0,0));

            MatFace = GrayImage(AllFace[0]); 
            imencode(".jpg", MatFace, JpgFace);

            Base64Face = base64_encode((char *)JpgFace.data(), JpgFace.size());
            result = client.face_search_v3(Base64Face, "BASE64", "Teaching", result);
            if( !result["result"].isNull() )//判断是否检测到人脸(opencv所给模型不一定准确,百度会进行第二次检测是否有人脸)
            {
                if( result["result"]["user_list"][0]["score"].asInt() > 80 )//判断人脸匹配得分是否大于80
		        {
                    cout<<result["result"]["user_list"][0]["user_id"]<<endl;//输出人名
		        }
            }
        }

        imshow("video",GrayImage);
        waitKey(500);
    }
    
    return 0;
}

编译运行,成功获取打印对应信息。

基于opencv的人脸识别考勤,人工智能,c++,linux,ubuntu,opencv,百度云

6.2记录考勤时间

时间容器:time_sec 

时间获取 (从1970.1.1 0:0:0到现在的秒数)   time(NULL);

时间转换(转换为正常时间) ctime()

代码实现:

#include <iostream>
#include "opencv2/opencv.hpp"
#include "face.h"

using namespace std;
using namespace cv;
using namespace aip;

int main(){
    VideoCapture cap(0);

    if(!cap.isOpened()){
        cout<< "Camera open failed" <<endl;
        return -1;
    }else{
        cout<< "Camera open success" <<endl;
    }

    CascadeClassifier Classifier("/usr/share/opencv/haarcascades/haarcascade_frontalface_alt2.xml");

    aip::Face client("******", "lNW******5EF", "XItO******FzS");

    vector<Rect> AllFace;

    Mat ColorImage;
    Mat GrayImage;
    Mat MatFace;

    vector<uchar> JpgFace;

    string Base64Face;

    Json::Value result;

    //时间容器
    time_t sec;

    for(;;){
        cap >> ColorImage;
        cvtColor(ColorImage, GrayImage, CV_BGR2GRAY);
        equalizeHist(GrayImage, GrayImage);

        Classifier.detectMultiScale(GrayImage, AllFace); 
	
	if( AllFace.size()!=0 ){
	    rectangle(GrayImage, AllFace[0], Scalar(255,0,0));

            MatFace = GrayImage(AllFace[0]); 
            imencode(".jpg", MatFace, JpgFace);

            Base64Face = base64_encode((char *)JpgFace.data(), JpgFace.size());
            result = client.face_search_v3(Base64Face, "BASE64", "Teaching", result);
            if( !result["result"].isNull() )
            {
                if( result["result"]["user_list"][0]["score"].asInt() > 80 )
                {
                    cout<<result["result"]["user_list"][0]["user_id"]<<endl;
                    //时间获取(从1970.1.1 0:0:0到现在的秒数)
                    sec = time(NULL);
                    //ctime()时间转换(转换为正常时间)
                    //输出时间信息
                    cout<<ctime(&sec)<<endl;
                }
            }
        }

        imshow("video",GrayImage);
        waitKey(500);
    }
    
    return 0;
}

编译运行,成功返回时间信息

基于opencv的人脸识别考勤,人工智能,c++,linux,ubuntu,opencv,百度云

6.3考勤信息记录及显示

记录考勤信息:运行程序时将信息定向到文本文件中

./main >> log.txt

问题:这样执行就只会将信息存在log.txt中,不再从终端窗口显示.

解决:我们可以从摄像头窗口的人脸识别框上直接显示人名和时间

库:core

函数:putText (图像上写字)

void putText(Mat& img, const string& text, Point org, int fontFace, double fontScale, Scalar color, int thickness=1, int lineType=8, bool bottomLeftOrigin=false ) 

第一个参数:要写字的图像

第二个参数:要写的字

第三个参数:字在图像上的坐标

第四个参数:图像的字体(具体看官方文档)

第五个参数:字的大小

第六个参数:字的颜色

代码实现(在原有代码下加入)

基于opencv的人脸识别考勤,人工智能,c++,linux,ubuntu,opencv,百度云

编译运行:

基于opencv的人脸识别考勤,人工智能,c++,linux,ubuntu,opencv,百度云

左上角出现字

7.最终实现

虚拟机记得改摄像头兼容性!!!!!!

文件:

基于opencv的人脸识别考勤,人工智能,c++,linux,ubuntu,opencv,百度云

代码:

#include <iostream>
#include "opencv2/opencv.hpp"
#include "face.h"

using namespace std;
using namespace cv;
using namespace aip;

int main(){
    VideoCapture cap(0);

    if(!cap.isOpened()){
        cout<< "Camera open failed" <<endl;
        return -1;
    }else{
        cout<< "Camera open success" <<endl;
    }

    CascadeClassifier Classifier("/usr/share/opencv/haarcascades/haarcascade_frontalface_alt2.xml");

    aip::Face client("4******8", "lN************EF", "XIt******8FzS");

    vector<Rect> AllFace;

    Mat ColorImage;
    Mat GrayImage;
    Mat MatFace;

    vector<uchar> JpgFace;

    string Base64Face;

    Json::Value result;

    time_t sec;

    for(;;){
        cap >> ColorImage;
        cvtColor(ColorImage, GrayImage, CV_BGR2GRAY);
        equalizeHist(GrayImage, GrayImage);

        Classifier.detectMultiScale(GrayImage, AllFace); 
	
	if( AllFace.size()!=0 ){
	    rectangle(GrayImage, AllFace[0], Scalar(255,0,0));

            MatFace = GrayImage(AllFace[0]); 
            imencode(".jpg", MatFace, JpgFace);

            Base64Face = base64_encode((char *)JpgFace.data(), JpgFace.size());
            result = client.face_search_v3(Base64Face, "BASE64", "Teaching", result);
            if( !result["result"].isNull() )
            {
                if( result["result"]["user_list"][0]["score"].asInt() > 80 )
                {
                    cout<<result["result"]["user_list"][0]["user_id"]<<endl;

                    sec = time(NULL);
                    cout<<ctime(&sec)<<endl;


                    putText(GrayImage, result["result"]["user_list"][0]["user_id"].asString(), Point(0,50), FONT_HERSHEY_SIMPLEX, 1, Scalar(255,255,255));
                    putText(GrayImage,ctime(&sec), Point(0,100), FONT_HERSHEY_SIMPLEX, 1, Scalar(255,255,255));
                }
            }
        }

        imshow("video",GrayImage);
        waitKey(2);
    }
    
    return 0;
}

安装:

opencv:

sudo apt-get install libopencv-dev

百度云相关支持:

sudo apt-get install libcurl4-openssl-dev

sudo apt-get install openssl

sudo apt-get install libjsoncpp-dev

sudo apt-get install libssl-dev

编译:

g++ main.cpp -o main -lopencv_highgui -lopencv_core -lopencv_imgproc -lopencv_objdetect  -std=c++11 -lcurl -lcrypto -ljsoncpp

18.04:
g++ main.cpp -o main -lopencv_highgui -lopencv_core -lopencv_imgproc -lopencv_objdetect  -std=c++11 -lcurl -lcrypto -ljsoncpp -lopencv_imgcodecs -lopencv_videoio

运行:

./main >> log.txt

一切正常(我把我的API隐藏了,所以文章中的代码无法直接运行,需要加上你的API)

8.文章结束

        感谢大家观看!基于opencv的人脸识别考勤,人工智能,c++,linux,ubuntu,opencv,百度云

 文章来源地址https://www.toymoban.com/news/detail-855569.html

到了这里,关于做一个人脸识别考勤机项目(利用OpenCV)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Python基于深度学习的人脸识别项目源码+演示视频,利用OpenCV进行人脸检测与识别 preview

    ​ 该人脸识别实例是一个基于深度学习和计算机视觉技术的应用,主要利用OpenCV和Python作为开发工具。系统采用了一系列算法和技术,其中包括以下几个关键步骤: 图像预处理 :首先,对输入图像进行预处理,包括读取图片、将图片灰度转换、修改图片的尺寸、绘制矩形

    2024年04月13日
    浏览(64)
  • OpenCV+ Qt Designer 开发人脸识别考勤系统

    本系统是一个基于OpenCV和 Qt Designer 的人脸识别考勤系统,主要功能是自动识别摄像头中的人脸,并把人脸对应的姓名和打卡时间存储到数据库中,方便管理人员进行考勤管理。本系统使用 face_recognition 库进行人脸识别,使用 PyQt5 开发界面,然后把界面与代码进行整合。 系统

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

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

    2024年02月19日
    浏览(68)
  • OpenCV+Ubuntu+QT实现人脸检测/识别(考勤管理)

    下载完成后在下载目录打开终端,赋予可执行权限,再执行即可安装qt sudo chmod +x qt-opensource-linux-x64-5.12.8.run 可参考文章 若按照上述方法安装好opencv,创建测试项目,在pro文件中加入: 测试: (若出现警告 “VIDEOIO(V4L2:/dev/video0): select() timeout”,在虚拟机-设置-USB控制器,更

    2024年01月22日
    浏览(41)
  • 毕设项目-人脸识别考勤签到系统

    人脸识别小程序、签到小程序,借助百度AI智能识别功能实现。 学生信息管理,考勤管理,人脸识别处理大概这三个模块。 功能模块: 登录与注册(两种身份 老师或学生) 课程发布(老师可以发布课程信息 名称 地点 选课人数) 课程查看(学生查看课程信息) 人脸录入(

    2023年04月08日
    浏览(80)
  • openCV实战项目--人脸考勤

    人脸任务在计算机视觉领域中十分重要,本项目主要使用了两类技术: 人脸检测 + 人脸识别 。 代码分为两部分内容: 人脸注册 和 人脸识别 人脸注册 :将人脸特征存储进数据库,这里用feature.csv代替 人脸识别 :将人脸特征与CSV文件中人脸特征进行比较,如果成功匹配则写

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

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

    2024年03月26日
    浏览(77)
  • 基于 opencv 的人脸识别上课考勤系统,附源码,可作为毕业设计

    这个人脸识别考勤签到系统是基于大佬的人脸识别陌生人报警系统二次开发的。 项目使用Python实现,基于OpenCV框架进行人脸识别和摄像头硬件调用,同时也用OpenCV工具包处理图片。交互界面使用pyqt5实现。 该系统实现了从学生信息输入、人脸数据录入、人脸数据训练,学生信

    2024年02月08日
    浏览(66)
  • Python 毕业设计 - 基于 opencv 的人脸识别上课考勤系统,附源码

    源码下载地址https://download.csdn.net/download/2302_77835532/88237252 这个人脸识别考勤签到系统是基于大佬的人脸识别陌生人报警系统二次开发的。 项目使用Python实现,基于OpenCV框架进行人脸识别和摄像头硬件调用,同时也用OpenCV工具包处理图片。交互界面使用pyqt5实现。 该系统实现

    2024年02月05日
    浏览(67)
  • python人脸识别考勤系统 dlib+OpenCV和Pyqt5、数据库sqlite 人脸识别系统 计算机 毕业设计 源码

    Python语言、dlib、OpenCV、Pyqt5界面设计、sqlite3数据库 本系统使用dlib作为人脸识别工具,dlib提供一个方法可将人脸图片数据映射到128维度的空间向量,如果两张图片来源于同一个人,那么两个图片所映射的空间向量距离就很近,否则就会很远。因此,可以通过提取图片并映射到

    2024年02月08日
    浏览(51)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包