# 基于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摄像头模块](./%E6%91%84%E5%83%8F%E5%A4%B4.jpg) USB摄像头模块 [淘宝链接]( https://e.tb.cn/h.TOQIzgcfTYjPo8Z?tk=EynseeF2FhU ) ![IMX6ULL开发板<](./%E5%BC%80%E5%8F%91%E6%9D%BF.png) IMX6ULL开发板 ![输入图片说明](./%E5%9B%BE%E7%89%872.jpg) #### **环境搭建** ##### 服务器     服务器为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设计界面如下图所示。 ![输入图片说明](./%E5%BC%80%E5%8F%91%E6%9D%BFui.png) 客户端软件设计流程图 ![输入图片说明](./%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%B5%81%E7%A8%8B%E5%9B%BE.png) ##### 服务器端 服务器端的Qt UI设计界面如下图所示。 员工注册界面 ![输入图片说明](./%E6%B3%A8%E5%86%8C%E7%95%8C%E9%9D%A2.png) 员工信息查询界面 ![输入图片说明](./%E5%91%98%E5%B7%A5%E4%BF%A1%E6%81%AF%E6%9F%A5%E8%AF%A2%E7%95%8C%E9%9D%A2.png) 考勤信息查询界面 ![输入图片说明](./%E8%80%83%E5%8B%A4%E4%BF%A1%E6%81%AF%E6%9F%A5%E8%AF%A2%E7%95%8C%E9%9D%A2.png) 服务器端软件设计流程图 ![输入图片说明](./%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%B5%81%E7%A8%8B%E5%9B%BE.png) 传输的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)