基于OpenCV的人脸识别考勤系统(四)

这是该项目的最后一部分

九、json数据解析

如果我们打印返回的result,则会发现返回了cached,log_id等不必要的信息,我们需要将返回的json数据进行筛选和解析,并获取系统时间。该部分涉及json相关知识,在此不再赘述,直接贴上代码:

time_t sec;

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

十、信息的记录和显示

最后,我们需要将信息显示到视频窗口上。我们使用OpenCV的putText方法,该方法的官方接口为:C++: void putText(Mat& img, const string& text, Point org, int fontFace, double fontScale, Scalar color, int thickness=1, int lineType=8, bool bottomLeftOrigin=false )

参数信息为:

Parameters:

  • img – Image.
  • text – Text string to be drawn.
  • org – Bottom-left corner of the text string in the image.
  • font – CvFont structure initialized using InitFont().
  • fontFace – Font type. One of FONT_HERSHEY_SIMPLEX, FONT_HERSHEY_PLAIN, FONT_HERSHEY_DUPLEX, FONT_HERSHEY_COMPLEX, FONT_HERSHEY_TRIPLEX, FONT_HERSHEY_COMPLEX_SMALL, FONT_HERSHEY_SCRIPT_SIMPLEX, or FONT_HERSHEY_SCRIPT_COMPLEX, where each of the font ID’s can be combined with FONT_HERSHEY_ITALIC to get the slanted letters.
  • fontScale – Font scale factor that is multiplied by the font-specific base size.
  • color – Text color.
  • thickness – Thickness of the lines used to draw a text.
  • lineType – Line type. See the line for details.
  • bottomLeftOrigin – When true, the image data origin is at the bottom-left corner. Otherwise, it is at the top-left corner.

相关代码为:

putText(equalizeImg,result["result"]["user_list"][0]["user_id"].asString(),Point(0,50),FONT_HERSHEY_SIMPLEX,0.8,Scalar(255,255,255));

putText(equalizeImg,result["result"]["user_list"][0]["score"].asString().substr(0,5),Point(0,80),FONT_HERSHEY_SIMPLEX,0.7,Scalar(255,255,255));

putText(equalizeImg,ctime(&sec),Point(0,100),FONT_HERSHEY_SIMPLEX,0.6,Scalar(255,255,255));

至此,项目已经实现其基本功能,编译运行即可成功。

 

最终全部代码为:

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

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

int main()
{
    VideoCapture cap(0); // open the default camera
    if(!cap.isOpened())  // check if we succeeded
    {
        cout<<"Camera open failed!"<<endl;
        return -1;
    }
    cout<<"Camera open successfully!"<<endl;

    // 设置APPID/AK/SK
    std::string app_id = "31638174";
    std::string api_key = "F4wQbQbG26VL3Ls9R0gRbk2n";
    std::string secret_key = "fSrA01khOwEeg8rLo2yQ8AgfM8RNUM71";

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

    Mat img;
    Mat grayImg;
    Mat equalizeImg;
    vector<Rect> faces;
    Mat faceImg;
    vector<uchar> jpgBuf;
    std::string base64Img;
    Json::Value result;

    time_t sec;

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

    for(;;)
    {
        cap >> img; // get a new img from camera
        cvtColor(img, grayImg, CV_BGR2GRAY); //灰度处理
        equalizeHist(grayImg,equalizeImg); //均衡化处理
        classifier.detectMultiScale(equalizeImg, faces); //检测人脸并返回在facas中
        if(faces.size())
        {
            rectangle(equalizeImg, faces[0], Scalar(255,255,255)); //绘制矩形框
            faceImg = equalizeImg(faces[0]);
            imencode(".jpg", faceImg, jpgBuf);    //将图片编码为jpg格式后存到jpgBuf中
            base64Img = base64_encode((char *)jpgBuf.data(), jpgBuf.size());    //格式转换为base64
            result = client.search(base64Img, "BASE64", "Student", aip::null);    //这里的"Student"是你之前新建的人脸分组的名称
            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(equalizeImg,result["result"]["user_list"][0]["user_id"].asString(),Point(0,50),FONT_HERSHEY_SIMPLEX,0.8,Scalar(255,255,255));
                        putText(equalizeImg,result["result"]["user_list"][0]["score"].asString().substr(0,5),Point(0,80),FONT_HERSHEY_SIMPLEX,0.7,Scalar(255,255,255));
                        putText(equalizeImg,ctime(&sec),Point(0,100),FONT_HERSHEY_SIMPLEX,0.6,Scalar(255,255,255));

                }
            }

        }
        else
            cout<<"No face detected!"<<endl;

        imshow("video", equalizeImg); //在video窗口中展示图片 
        waitKey(40); //设置帧率(40ms读取一帧)
    }

    return 0;
}

感谢您的观看!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
人脸识别考勤系统是近年来新的一种考勤方式。通过人工智能技术将教职工和学生的面部信息与数据库中的信息进行匹配来实现考勤工作。基于opencv人脸识别考勤系统利用计算机视觉技术实现人脸检测、人脸识别人脸识别算法等功能,将人脸图像与人脸数据库进行比对,检测到存在可供匹配的人脸后,系统将匹配到的人脸信息标注或记录下来。 在实际应用中,基于opencv人脸识别考勤系统有一些优势。首先,它可以极大程度地提高考勤的准确度,避免了考勤人员的主观性和人为操作差异导致的考勤记录不准确的问题。其次,基于opencv人脸识别考勤系统可以大大减轻教育工作者和学生的考勤强度,节约时间和精力,从而进一步提高工作效率。此外,它具有实时操作的特征,及时反馈考勤信息。最后,基于opencv人脸识别考勤系统具有高可拓扑性和高可靠性,不受人为干扰和风险,有助于维护校园安全和提高学校管理水平。 虽然基于opencv人脸识别考勤系统有许多优点,但也存在着一些局限性。例如,当人脸受到过多的干扰因素,如光线、表情、遮挡等时,识别的准确度可能会降低;当面部特征发生变化或者人脸数据库更新频率不高时,使用该系统进行考勤有一定的局限性。综上所述,基于opencv人脸识别考勤系统是一个全面、高效、准确和可靠的考勤系统,可以广泛应用在校园里,同时也需要不断完善和优化,以更好地提高它的实用性和可靠性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值