# 基于imx6ull人脸识别考勤系统
**Repository Path**: aff544/face_recognition
## Basic Information
- **Project Name**: 基于imx6ull人脸识别考勤系统
- **Description**: 基于imx6ull人脸识别考勤系统
- **Primary Language**: Unknown
- **License**: MulanPSL-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 19
- **Forks**: 3
- **Created**: 2025-01-20
- **Last Updated**: 2026-02-27
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
#### **基于IMX6ULL的人脸识别考勤系统**
#### **简介**
- 考勤系统主要分为服务器端和客户端两部分,通过TCP协议进行通信。
- 客户端为嵌入式Linux设备IMX6ULL开发板,采用QT设计显示界面。主要功能包括:通过USB摄像头模块采集图像数据,并上传至PC服务器,接收服务器通过人脸数据解析到的考勤数据并进行显示。
- 服务器端为PC机上虚拟机搭建的Ubuntu系统,采用QT设计显示界面。功能界面主要功能包括:考勤图像显示;员工信息注册,以及员工信息数据库和考勤信息数据库的查询。
- 由于IMX6ULL的性能十分有限,将人脸识别算法部署在客户端的效果十分有限,故将算法部署在PC端。算法以OpenCV库为基础进行图像处理,采用harrcascade级联分类器对摄像头采集的图像进行筛选标记出包含人脸的图像,在将该图像传输至SeetaFace的人脸识别算法模块。通过该模块,可以实现,在考勤人员注册阶段对人脸特征进行提取分析,并生成对应的人脸ID保存至数据库中;在考勤人脸识别阶段,对harrcascade级联分类器传输过来的人脸数据进行分析,通过将待识别的人脸特征与已注册的人脸特征数据库进行比对,计算相似度得分,判断是否为同一个人。
#### **演示视频效果**
[B站演示视频,点击观看](https://www.bilibili.com/video/BV1XHwseQECk/?vd_source=125f89f4da27bcabbf5de7e7dbdbf972#reply253035468736)
#### **硬件设备**
硬件上主要为正点原子的阿尔法IMX6ULL开发板,以及USB摄像头模块

USB摄像头模块 [淘宝链接]( https://e.tb.cn/h.TOQIzgcfTYjPo8Z?tk=EynseeF2FhU )

IMX6ULL开发板

#### **环境搭建**
##### 服务器
服务器为VMware虚拟机搭建的Ubuntu系统,需要下载Qt Creator开发工具,opencv源码,opencv第三方工具opencv_contrib(包含harrcascade级联分类器),以及Seetaface2源码。
**注意:** opencv和opencv_contrib的版本需要一致。
(本人的版本为opencv-3.4.11[下载网站](https://opencv.org/)/opencv_contrib-3.4[下载网站](https://github.com/opencv/opencv_contrib/tree/3.4)/Seetaface2[下载网站](https://github.com/seetafaceengine/SeetaFace2))
Ubuntu中安装gcc,g++,cmake-gui
在opencv3.4.11源码中建立bulid文件夹,进入文件夹,使用cmake-gui .. 进入cmake配置界面
1. 默认use default native comiles
2. 勾选BUILD_opencv_word
3. OPENCV_EXTRA_MODULES_PATH 指定到opencv_contrib-3.4/modules/face/
4. CMAKE_INSTALL_PREFIX 指定/opt/opencv-pc
Configure/Generate-->make -j16
编译seetaface2
在seetaface2源码中建立bulid文件夹,进入文件夹,使用cmake-gui .. 进入cmake配置界面
CMAKE_INSTALL_PREFIX 指定/opt/opencv-pc
Configure/Generate-->make -j16
服务器代码pro文件需要添加路径
```linux
INCLUDEPATH += /opt/opencv-pc/include
INCLUDEPATH +=/opt/opencv-pc/include/opencv4/opencv2
INCLUDEPATH +=/opt/opencv-pc/include/opencv4
INCLUDEPATH +=/opt/opencv-pc/include/seeta
LIBS += -L/usr/lib/x86_64-linux-gun -L/opt/opencv4-pc/lib -lopencv_world -lSeetaFaceDetector -lSeetaFaceLandmarker -lSeetaFaceRecognizer -lSeetaFaceTracker -lSeetaNet -lSeetaQualityAssessor
```
##### 客户端
客户端为正点原子的阿尔法开发板,主控为IMX6ULL,这是NXP(智浦)公司推出的一款基于ARM Cortex-A7 架构的应用处理器,在嵌入式系统领域应用广泛。
本项目需要在此开发板上移植Linux系统,需要驱动7寸RGB屏幕,屏幕触摸IC,usb摄像头,并运行Qt程序,同时由于需要在Qt程序中应用到opencv的API函数调用到摄像头,故还需要移植opencv。
linux开发四件套:u-boot、linux-kernal(zImage)、设备树(.dtb)、根文件系统(buildroot)
1. 获取u-boot源码,编译,下载到SD卡启动 (具体参考正点原子驱动开发教程)
本项目采用网络挂载根文件系统(nfs)以及linux内核镜像和设备树(tftp)的方式需要配置u-boot环境变量
```linux
bootargs=console=tty1 console=ttymxc0,115200 rw nfsroot=192.168.137.2:/home/yyz/linux/brnfs ip=192.168.137.3:192.168.137.2:192.168.137.1:255.255.255.0::eth0:off
bootcmd=tftp 80800000 zImage;tftp 83000000 imx6ull-alientek-emmc.dtb;bootz 80800000 - 83000000;
```
2. 获取linux-kernal源码,修改配置,具体参考正点原子驱动开发教程,修改设备树(.dts文件),编译生成zImage,.dtb文件,拷贝到tftpboot文件。
```linux
//rgb屏幕设备树
&lcdif {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_lcdif_dat /* 使用到的 IO */
&pinctrl_lcdif_ctrl>;
display = <&display0>;
status = "okay";
display0: display { /* LCD 属性信息 */
bits-per-pixel = <24>; /* 一个像素占用 24bit */
bus-width = <24>; /* 总线宽度 */
display-timings {
native-mode = <&timing0>; /* 时序信息 */
timing0: timing0 {
clock-frequency = <51200000>;/* LCD 像素时钟,单位 Hz */
hactive = <1024>; /* LCD X 轴像素个数 */
vactive = <600>; /* LCD Y 轴像素个数 */
hfront-porch = <160>; /* LCD hfp 参数 */
hback-porch = <140>; /* LCD hbp 参数 */
hsync-len = <20>; /* LCD hspw 参数 */
vback-porch = <20>; /* LCD vbp 参数 */
vfront-porch = <12>; /* LCD vfp 参数 */
vsync-len = <3>; /* LCD vspw 参数 */
hsync-active = <0>; /* hsync 数据线极性 */
vsync-active = <0>; /* vsync 数据线极性 */
de-active = <1>; /* de 数据线极性 */
pixelclk-active = <0>; /* clk 数据线先极性 */
};
};
};
};
```
**有坑:**
正点原子的开发教程触摸IC为FT5426实际新版开发板的触摸IC为GT911,故需要重新修改设备树,才能驱动成功。
```linux
&iomuxc {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_hog_1>;
imx6ul-evk {
/* ......省略中间的内容 */
pinctrl_tsc: tscgrp {
fsl,pins = <
MX6UL_PAD_GPIO1_IO09__GPIO1_IO09 0x79 /* TSC_INT */
>;
};
/* ......省略中间的内容 */
&iomuxc_snvs {
pinctrl-names = "default_snvs";
pinctrl-0 = <&pinctrl_hog_2>;
imx6ul-evk {
/* ......省略中间的内容 */
pinctrl_tsc_reset: tsc_reset {
fsl,pins = <
MX6ULL_PAD_SNVS_TAMPER9__GPIO5_IO09 0x10B0
>;
};
&i2c2 {
clock_frequency = <100000>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c2>;
status = "okay";
/* 省略中间的内容 */
gt9147:gt9147@14 {
compatible = "goodix,gt9147", "goodix,gt9xx";
reg = <0x14>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_tsc
&pinctrl_tsc_reset>;
interrupt-parent = <&gpio1>;
interrupts = <9 0>;
reset-gpios = <&gpio5 9 GPIO_ACTIVE_LOW>;
interrupt-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>;
status = "okay";
};
};
```
make menuconfig 使能USB摄像头驱动
路径:
```Linux
Device Drivers->
<*>Multimedia support -->
[*] Media USB Adapters -->
<*> USB Video Class (UVC)
<*> platform camera support
```
make -j16 生成zImage 和 .dtb文件,拷贝到tftpboot文件夹下
3. 根文件系统搭建,本项目的根文件系统采用buildroot搭建,可以之间在buildroot的源码里配置Qt环境,不用重新移植Qt。
- 在 Ubuntu 编辑为一个 atk_imx6ull_qt_defconfig 文件,然后拷贝到 Buildroot 源码的根目录
configs 下。
- vi configs/atk_imx6ull_qt_defconfig
```linux
# ARM
BR2_arm=y
BR2_BINFMT_ELF=y
BR2_cortex_a7=y
BR2_ARM_EABIHF=y
BR2_ARM_FPU_NEON_VFPV4=y
BR2_ARM_INSTRUCTIONS_ARM=y
# toolchain
BR2_TOOLCHAIN_BUILDROOT=y
BR2_GCC_VERSION_9_X=y
BR2_TOOLCHAIN_BUILDROOT_CXX=y
BR2_USE_MMU=y
BR2_TOOLCHAIN_BUILDROOT_LOCALE=y
# Qt5
BR2_PACKAGE_QT5=y
BR2_PACKAGE_QT5BASE=y
BR2_PACKAGE_QT5BASE_EXAMPLES=y
BR2_PACKAGE_QT5BASE_MYSQL=y
BR2_PACKAGE_QT5BASE_SQLITE_QT=y
BR2_PACKAGE_QT5BASE_GUI=y
BR2_PACKAGE_QT5BASE_WIDGETS=y
BR2_PACKAGE_QT5BASE_LINUXFB=y
BR2_PACKAGE_QT5BASE_TSLIB=y
BR2_PACKAGE_QT5QUICKCONTROLS=y
BR2_PACKAGE_QT5QUICKCONTROLS2=y
BR2_PACKAGE_QT5VIRTUALKEYBOARD=y
BR2_PACKAGE_QT5BASE_GIF=y
BR2_PACKAGE_QT5BASE_JPEG=y
BR2_PACKAGE_QT5BASE_PNG=y
BR2_PACKAGE_QT5CHARTS=y
# System configuration
BR2_TARGET_GENERIC_HOSTNAME="atkbuildrootQtfs"
BR2_TARGET_GENERIC_ISSUE="Welcome to alientek buildroot Qt rootfs"
BR2_INIT_BUSYBOX=y
BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV=y
# filesystem / image
BR2_TARGET_ROOTFS_EXT4=y
BR2_TARGET_ROOTFS_EXT2_SIZE="1GB"
BR2_TARGET_GENERIC_ROOT_PASSWD="root"
# - tiny ssh server and sftp server
BR2_PACKAGE_DROPBEAR=y
BR2_PACKAGE_GESFTPSERVER=y
BR2_TARGET_GENERIC_GETTY_PORT="ttymxc0"
```
- 输入 make atk_imx6ull_qt_defconfig 开始配置
- make -j 16
- 输入 ls output/images/查看生成根文件系统,将该目录下的rootfs.tar拷贝解压到nfs文件夹下,作为网络根文件系统。
- 启动开发板,配置Qt运行变量
在/etc/profile 文件里加入以下内容,插入 export QT_QPA_PLATFORM=linuxfb 环境变量。
末尾添加 export QT_QPA_FONTDIR=/usr/share/fonts。windows下的(路径 C:\Windows\Fonts)下的中文字库放到新建一个/usr/share/fonts/目录下。
- 移植opencv到开发板
下载opencv-3.4.11源码,在opencv3.4.11源码中建立bulid、install文件夹,进入文件夹,使用cmake-gui .. 进入cmake配置界面
1. 选择Specify options for cross-compiling 下一步。
2. Operating System :Linux(有坑:L必须大写,否则后面无法使用摄像头)。
3. 交叉编译器的gcc和g++在之前编译完buildroot的目录下的output/host/bin中,下面的Target Root要选择output/host/arm-buildroot-linux-uclibcgnueabihf/sysroot/usr/bin,这里有很多buildroot的库环境,可以大大减少编译问题。
4. CMAKE_EXE_LINKER_FLAGS = -pthread -lrt -ldl
5. CMAKE_INSTALL_PRTEFIX = /opencv/opencv-3.4.11/install(之前建立的install文件夹)
6. 勾选WITH_V4L(否则无法使用摄像头)
7. Configure/Generate-->make -j16 编译可能会出错,需要修改([修改参考链接](https://blog.csdn.net/flyfish1986/article/details/121340819?ops_request_misc=&request_id=&biz_id=102&utm_term=%22No%20suitable%20threading%20library&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-4-121340819.142^v101^control&spm=1018.2226.3001.4187))
编译完成后,将lib文件夹下的文件拷贝到开发板根文件系统文件下的/usr/lib
- 客户端代码pro文件需要添加路径
```linux
INCLUDEPATH += /home/yyz/opencv/opencv-3.4/opencv-3.4.11/install/include
LIBS += /home/yyz/opencv/opencv-3.4/opencv-3.4.11/install/lib/libopencv_core.so \
/home/yyz/opencv/opencv-3.4/opencv-3.4.11/install/lib/libopencv_highgui.so \
/home/yyz/opencv/opencv-3.4/opencv-3.4.11/install/lib/libopencv_imgproc.so \
/home/yyz/opencv/opencv-3.4/opencv-3.4.11/install/lib/libopencv_videoio.so \
/home/yyz/opencv/opencv-3.4/opencv-3.4.11/install/lib/libopencv_imgcodecs.so \
/home/yyz/opencv/opencv-3.4/opencv-3.4.11/install/lib/libopencv_objdetect.so \
-lpthread
```
- 创建Qt程序,命令行编译Qt程序
/home/buildroot-2022.02.3/output/host/usr/bin/qmake
make -j12
将编译完成后的可执行程序xxx拷贝到开发板,./xxx执行
#### **软件设计**
本项目的软件设计包括客户端和服务器两大部分。
##### 客户端
客户端的Qt UI设计界面如下图所示。

客户端软件设计流程图

##### 服务器端
服务器端的Qt UI设计界面如下图所示。
员工注册界面

员工信息查询界面

考勤信息查询界面

服务器端软件设计流程图

传输的Json数据如下:
```json
{"employeeID":"xxx","name":"xxx","department":"xxx","time","yyyy-MM-dd:mm:ss","rect_x":xxx,"rect_y":xxx}
```
如果觉得这篇博客对你有帮助的话,三联否?-->[B站演示视频,点击观看](https://www.bilibili.com/video/BV1XHwseQECk/?vd_source=125f89f4da27bcabbf5de7e7dbdbf972#reply253035468736)