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

本文是跟随B站视频教程做的物联网人脸识别考勤机项目笔记。介绍了在Ubuntu系统上的安装与配置,C++程序编写,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的博客-优快云博客

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-优快云博客

        按常理说,下载选择的文件后缀应该是【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并点确定

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

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

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

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值