基于OpenCV的人脸识别考勤机

目录

一、什么是OpenCV--官网

二、OpenCV库的应用

三、 环境准备

四、OpenCV库安装

五、帮助文档

六、OpenCV--图像采集

 七、人脸检测

 八、百度云平台接入

九、数据处理-考勤信息记录


一、什么是OpenCV--官网

        OpenCV是一个开源的计算机视觉和机器学习软件库,它可以广泛的在Windos、Linux、Mac等多种操作系统下自由使用,是一种高拓展性、轻量级的库。OpenCV基于C语言和少量C++类函数,并且提供了Matlab、Python等丰富的接口。

二、OpenCV库的应用

        

自从1999年1月第一个OpenCV的beta版本发布开始,它就被广泛应用于许多领域,例如卫星地图和电子地图的拼接,扫描图像、医学影像分析、安全和入侵系统分析等多个方面,同时在质量检测系统、摄像头标定、无人驾驶方面,也大量的使用了OpenCV库。

        OpenCV提供的视觉处理算法非常丰富,由于它部分以高效的C语言编写,加上其开源的特性,处理得当,不需要添加新的外部支持也可以完整地编译链接生成执行程序,所以很多研究者用它来做算法的移植。

OpenCV可用于解决如下领域的问题:

  • 人机交互
  • 物体识别
  • 图像分区
  • 人脸识别
  • 动作识别
  • 运动跟踪
  • 机器人
  • 无人驾驶

三、 环境准备

1、 系统信息

2、发布版本信息

四、OpenCV库安装

//这里使用在线安装的方式安装(确保系统可以正常访问internet)

sudo apt-get install libopencv-dev
查看安装状态:dpkg -s libopencv-dev

五、帮助文档

这里对应自己安装的版本,就去下载那个版本的压缩包,解压之后有个index.html的文件打开查看手册

六、OpenCV--图像采集

1、将摄像头添加到ubuntu系统中,在/dev目录下查看


2、程序测试

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
    VideoCapture cap(0);  // 默认方式打开摄像头0
    if (!cap.isOpened()) {
        cout << "ERROR! Camera open failed!\n";
        return -1;
    }
    cout << "Camera open success!"  << endl;
    return 0;
}


3、使用摄像头拍照(这里使用USB摄像头)

Mat ColorImage;
cap >> ColorImage;   // 拍照
imshow("vodeo", ColorImage);  // 显示照片
waitKey(3000);

 七、人脸检测

1、图像处理
灰度处理:提高识别准确度与处理速度
    Mat GrayImage;  // 用与存放处理后的照片
    cvtColor(ColorImage, GrayImage, COLOR_BGR2GRAY);

 
均衡化处理:提高对比度
    Mat ContrastImage;
    equalizeHist(GrayImage, ContrastImage);


2、人脸检测
// 实例化级联分类器,添加模型(通过训练具有一定能力的模型): 
CascadeClassifier Classifier("/usr/share/opencv4/haarcascades/haarcascade_frontalface_alt2.xml");
// 检测人脸,并使用矩形框起来
vector<Rect> AllFace;  // 用来存放圈人脸的框
Classifier.detectMultiScale(ContrastImage, AllFace);  // 使用矩形将人脸圈起来
rectangle(GrayImage, AllFace[0], Scalar(255,0,0));  // 在图片上显示矩形

3、人脸截取(用来做对比)
Mat MatFace;
vector<uchar> jpgFace;
MatFace = GrayImage(AllFace[0]);
imencode(".jpg", MatFace, jpgFace); // 将图像转化成jpg格式

 八、百度云平台接入

1、人脸库的创建与管理

        这里使用百度云的人脸搜索功能,点击立即使用,创建应用

先新建组,在组中添加人脸信息(这里自己添加)

 2、人脸识别SDK环境搭建

        ①、这里使用官方提供的技术手册进行搭建

        ②、SDK下载解压并上传到ubuntu系统

        ③、安装依赖库,添加第三方链接库       

               安装curl库:sudo apt install libcurl4-openssl-dev

               安装openssl库:sudo apt install openssl

               安装jsoncpp库:sudo apt install libjsoncpp-dev

               安装ssl库:sudo apt install libssl-dev

               查看安装状态:dpkg -s xxxxxxx(库)

        ④、在源码中添加下面两行,对应手册中第五条

               #include "face.h"

               using namespace aip;

        ⑤、链接库进行编译

               将自己写的代码mv到SDK库中
 

编译:
     g++ main.cpp -I /usr/include/opencv4  -lopencv_core -lopencv_highgui -lopencv_videoio -lopencv_imgproc -lopencv_objdetect -lopencv_imgcodecs -std=c++11 -lcurl -lcrypto -ljsoncpp

这里编译时出现错误:No such file or directory

修改对应文件中引入头文件的路径:jsoncpp/json/json.h
 

  3、云平台接入----新建client:这里参考手册中的示例代码

根据手册将下面代码添加到自己写的代码中

先将我们截取的jpg格式的图片转化成base64格式,用于数据对比
string base64Face;  // 存放base64数据格式图片
Json::Value result;  //用于存放识别结果
base64Face = base64_encode((char *)jpgFace.data(), jpgFace.size()); 
result = client.search(base64Face, "BASE64", "shibie", aip::null);
cout << result << endl;

九、数据处理-考勤信息记录

1、对result中数据进行处理:

if(!result["result"].isNull())  //判断result结果是否为空
{  
    if(result["result"]["user_list"][0]["score"].asInt() > 80)   // 判断相似度
    {
        cout << result["result"]["user_list"][0]["user_id"] << endl;  // 打印id
    }
}

2、获取系统时间

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

3、将id与时间写在图片上

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

4、将识别信息存储到文件中

5、查看日志信息

到这里考勤机功能基本实现,可以在打卡日志中查看记录。

针对百度云平台接入系统后比较卡顿,这里可以考虑用多线程的方式对数据进行处理。

  • 20
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值