人脸识别考勤机

环境:Ubuntu 22.04、Opencv 4.5.4、C++、百度智能云人脸识别SDK(aip-cpp-sdk-0.8.1)https://pan.baidu.com/s/1_nE_TUyeFGvRtoflbQja5A(密码:hx5m)

一、OpenCV计算机视觉开发

1、打开摄像头

#include <iostream> //创建命名空间
#include <opencv2/opencv.hpp> //导入opencv库

using namespace std;
using namespace cv;

int main()
{
	VideoCapture cap(0); // 打开摄像头
    	if(!cap.isOpened())  // 检查摄像头是否成功打开
        	{
        	cout << "failed" << endl;
        	return 0;
        	}
	cout << "success" << endl;
}

在终端编译:g++ a.cpp -o a -lopencv_highgui -lopencv_core -lopencv_videoio

执行代码:./a

2、将摄像头获取到的图像灰度、高亮并显示出来

#include <iostream> //创建命名空间
#include <opencv2/opencv.hpp> //导入opencv库

using namespace std;
using namespace cv;

int main()
{
	VideoCapture cap(0); // 打开摄像头
    	if(!cap.isOpened())  // 检查摄像头是否成功打开
        	{
        	cout << "failed" << endl;
        	return 0;
        	}
	cout << "success" << endl;
	
	Mat Image; //存储图像
	Mat GaryImage; //存储灰度图像
	Mat HImage; //存储高亮的灰度图像
	
	for(;;)
	{
        cap >> Image; // 从摄像头获取图像
        cvtColor(Image, GaryImage, COLOR_BGR2GRAY); // 将图像转变为灰度
        equalizeHist(GaryImage, HImage); // 将灰度图高亮
        
        imshow("video", HImage); // 在窗口显示高亮图像
        waitKey(50); // 50ms显示一次
        }
        return 0;
	
}

在终端编译:g++ a.cpp -o a -lopencv_highgui -lopencv_core -lopencv_videoio -lopencv_imgproc

执行代码:./a

3、人脸检测、截取

#include <iostream> //创建命名空间
#include <opencv2/opencv.hpp> //导入opencv库

using namespace std;
using namespace cv;

int main()
{
	VideoCapture cap(0); // 打开摄像头
    	if(!cap.isOpened())  // 检查摄像头是否成功打开
        	{
        	cout << "failed" << endl;
        	return 0;
        	}
	cout << "success" << endl;
	
	CascadeClassifier Classifier("/usr/share/opencv4/haarcascades/haarcascade_frontalface_alt2.xml"); // 导入检测人脸的模型文件
	
	Mat Image; //存储图像
	Mat GaryImage; //存储灰度图像
	Mat HImage; //存储高亮的灰度图像
	vector<Rect> Face; 
	Mat MatFace;
	vector<uchar> JpgFace;
	
	for(;;)
	{
        cap >> Image; // 从摄像头获取图像
        cvtColor(Image, GaryImage, COLOR_BGR2GRAY); // 将图像转变为灰度
        equalizeHist(GaryImage, HImage); // 将灰度图高亮
        Classifier.detectMultiScale(HImage, Face); // 从高亮图截取人脸
            if( Face.size() ) // 如果截取到人脸
            {
                rectangle(HImage, Face[0], Scalar(255,255,255)); // 在高亮图上用矩形框出第一张人脸
                MatFace = HImage(Face[0]); // 存储第一张人脸
            
            }
        imshow("video", HImage); // 在窗口显示高亮图像
        waitKey(50); // 50ms显示一次
        }
        return 0;
	
}

在终端编译:g++ a.cpp -o a -lopencv_highgui -lopencv_core -lopencv_videoio -lopencv_imgproc -lopencv_objdetect
执行代码:./a

二、百度智能云平台接入

1、注册百度智能云账号

使用人脸与人体中的人脸搜索功能

2、导入人脸库

将需要识别的人脸导入人脸库

3、链接百度智能云

(1)下载SDK

 百度智能云人脸识别SDK(aip-cpp-sdk-0.8.1)https://pan.baidu.com/s/1_nE_TUyeFGvRtoflbQja5A(密码:hx5m)

(2)查看官方技术文档

1.在官方网站下载C++ SDK压缩包。

2.将下载的aip-cpp-sdk-version.zip解压, 其中文件为包含实现代码的头文件。

3.安装依赖库libcurl(需要支持https) openssl jsoncpp(>1.6.2版本,0.x版本将不被支持)。

4.编译工程时添加 C++11 支持 (gcc/clang 添加编译参数 -std=c++11), 添加第三方库链接参数 lcurl, lcrypto, ljsoncpp。

5.在源码中include face.h ,引入压缩包中的头文件以使用aip命名空间下的类和方法。

(3)根据文档编辑代码

#include <iostream> //创建命名空间
#include <opencv2/opencv.hpp> //导入opencv库
#include <opencv2/imgcodecs.hpp>
#include "face.h" //导入百度人脸检测库

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

int main()
{
	VideoCapture cap(0); // 打开摄像头
    	if(!cap.isOpened())  // 检查摄像头是否成功打开
        	{
        	cout << "failed" << endl;
        	return 0;
        	}
	cout << "success" << endl;
	CascadeClassifier Classifier("/usr/share/opencv4/haarcascades/haarcascade_frontalface_alt2.xml"); // 导入检测人脸的模型文件
	Mat Image; //存储图像
	Mat GaryImage; //存储灰度图像
	Mat HImage; //存储高亮的灰度图像
	vector<Rect> Face; 
	Mat MatFace;
	vector<uchar> JpgFace;
	Json::Value result;
	string Base64Face;
	time_t sec;

       
        // 设置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);
	
for(;;){
        cap >> Image; // 从摄像头获取图像
        cvtColor(Image, GaryImage, COLOR_BGR2GRAY); // 将图像转变为灰度
        equalizeHist(GaryImage, HImage); // 将灰度图高亮
        Classifier.detectMultiScale(HImage, Face); // 从高亮图截取人脸
        if( Face.size() ) // 如果截取到人脸
        {
            rectangle(HImage, Face[0], Scalar(255,255,255)); // 在高亮图上用矩形框出第一张人脸
            MatFace = HImage(Face[0]); // 存储第一张人脸
            imencode(".jpg", MatFace, JpgFace); // 将存储的人脸转换为".jpg"格式
        
            Base64Face = base64_encode((char *) JpgFace.data(), JpgFace.size()); // 将".jpg"格式转换为百度可以识别的"Base64"格式
        
            result = client.search(Base64Face, "BASE64", "1", aip::null); // 发送人脸进行检测,并将结果储存在result中
        
            if( !result["result"].isNull() ) // 如果返回结果检测到人脸
            {
                if( result["result"]["user_list"][0]["score"].asInt() > 70 ) // 如果人脸置信度大于70
                {
            	    cout << result["result"]["user_list"][0]["user_id"] << endl; // 输出人脸的名称
            	    sec = time(0); // 从系统获取时间
            	    cout << ctime(&sec) << endl; // 打印时间
            	    putText(HImage, result["result"]["user_list"][0]["user_id"].asString(), Point(0,20), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(255,0,0)); // 在输出的图像上写上人脸的名称
            	    putText(HImage, ctime(&sec), Point(0,50), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(255,0,0)); // // 在输出的图像上写上系统时间
                }
            }
        
        }
        imshow("video", HImage); // 在窗口显示高亮图像
        waitKey(50); // 50ms显示一次
        }
	return 0;
}

(4)将代码放入aip-cpp-sdk-0.8.1文件夹编译

在该文件夹打开终端编译:g++ a.cpp -o main -lopencv_highgui -lopencv_core -lopencv_videoio -lopencv_imgproc -lopencv_objdetect -lopencv_imgcodecs -std=c++11 -lcurl -lcrypto -ljsoncpp

执行代码:./a >> a.txt (将打印结果写入a.txt文件中)

三、运行结果

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值