基于OpenMV的人脸识别,支持人脸注册、人脸检测、人脸识别

2024-03-03 01:32

本文主要是介绍基于OpenMV的人脸识别,支持人脸注册、人脸检测、人脸识别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://github.com/1061700625/OpenMV_Face_Recognition

'''
>> author: SXF
>> email: songxf1024@163.com
>> description:用LBP特征进行人脸识别,可进行人脸注册、人脸检测与人脸识别Pin7高电平一次,触发人脸注册;默认低电平UART1(Pin1)输出调试信息UART3(Pin4)输出识别结果,当识别成功后,返回“Find It”(可自定义修改),可连接IoT平台注:需配备SD卡,最大3支持2G,将main.py等文件放至SD卡根目录后上电
'''import sensor, time, image
import os, time
import pyb
from pyb import Pinred   = pyb.LED(1)
green = pyb.LED(2)
blue  = pyb.LED(3)
infrared = pyb.LED(4)
usart1 = pyb.UART(1, 115200)
usart3 = pyb.UART(3, 115200)
REGISTER_MODE = 0sensor.reset()
sensor.set_contrast(1)
sensor.set_gainceiling(16)
sensor.set_framesize(sensor.HQVGA)
sensor.set_pixformat(sensor.GRAYSCALE)
sensor.skip_frames(10)Path_Backup = {'path':'', 'id':0}
rootpath = "/orl_faces"
DIST_THRESHOLD = 15000  # 差异度阈值def debug(strings):print(strings)usart1.write(str(strings)+"\r\n")def find(face_cascade, img):objects = img.find_features(face_cascade, threshold=0.75, scale_factor=1.25)  # 人脸检测if objects:green.on()time.sleep(500)green.off()width_old = 0height_old = 0index = 0for r in objects:  # 寻找最大的faceif r[2] > width_old and r[3] > height_old:width_old = r[2]height_old = r[3]index += 1index -= 1#print("index:", index)img.draw_rectangle(objects[index])d0 = img.find_lbp((0, 0, img.width(), img.height()))res = match(d0)if res != 0:debug(res)return 1def match(d0):  # 人脸识别dir_lists = os.listdir(rootpath)  # 路径下文件夹dir_num = len(dir_lists)          # 文件夹数量debug("*" * 60)debug("Total %d Folders -> %s"%(dir_num, str(dir_lists)))for i in range(0, dir_num):item_lists = os.listdir(rootpath+'/'+dir_lists[i])  # 路径下文件item_num = len(item_lists)                          # 文件数量debug("The %d Folder[%s], Total %d Files -> %s" %(i+1, dir_lists[i], item_num, str(item_lists)))Path_Backup['path'] = rootpath+'/'+dir_lists[i]  # 马上记录当前路径Path_Backup['id'] = item_num                     # 马上记录当前文件数量for j in range(0, item_num):  # 文件依次对比debug(">> Current File: " + item_lists[j])try:img = image.Image("/orl_faces/%s/%s" % (dir_lists[i], item_lists[j]), copy_to_fb=True)except Exception as e:debug(e)breakd1 = img.find_lbp((0, 0, img.width(), img.height()))  # 提取特征值dist = image.match_descriptor(d0, d1)                 # 计算差异度debug(">> Difference Degree: " + str(dist))if dist < DIST_THRESHOLD:debug(">> ** Find It! **")green.on()time.sleep(1000)green.off()return item_lists[j]debug(">> ** No Match! **")return 0def register(face_cascade, img):global REGISTER_MODEif find(face_cascade, img) == 1:debug(">> Existing without registration!")REGISTER_MODE = 0return 0dir_lists = os.listdir(rootpath)  # 路径下文件夹dir_num = len(dir_lists)          # 文件夹数量new_dir = ("%s/%d") % (rootpath, int(dir_num)+1)os.mkdir(new_dir)                 # 创建文件夹cnt = 5  # 拍摄5次图片while cnt:img = sensor.snapshot()objects = img.find_features(face_cascade, threshold=0.75, scale_factor=1.25)  # 人脸检测if objects:width_old = 0height_old = 0index = 0for r in objects:  # 寻找最大的faceif r[2] > width_old and r[3] > height_old:width_old = r[2]height_old = r[3]index += 1index -= 1#print("index:", index)item_lists = os.listdir(new_dir)  # 新路径下文件item_num = len(item_lists)        # 文件数量img.save("%s/%d.pgm" % (new_dir, item_num))  # 写入文件debug(">> [%d]Regist OK!" % cnt)img.draw_rectangle(objects[index])green.on()time.sleep(50)green.off()cnt -= 1if cnt==0:green.on()time.sleep(1000)green.off()REGISTER_MODE = 0def main():global REGISTER_MODEtry:os.mkdir(rootpath)except:passpin7 = Pin('P7', Pin.IN, Pin.PULL_DOWN)  # 1为注册模式,即拍照存入face_cascade = image.HaarCascade("frontalface", stages=25)#try:#face_cascade = image.HaarCascade("/haarcascade_frontalcatface.cascade", stages=25)  # "frontalface"#except:#face_cascade = image.HaarCascade("frontalface", stages=25)print(face_cascade)clock = time.clock()img = Nonewhile (True):clock.tick()img = sensor.snapshot()if pin7.value() == 1:REGISTER_MODE = 1if REGISTER_MODE == 1:debug("REGISTER_MODE\r\n")register(face_cascade, img)else:res = find(face_cascade, img)if res==1:usart3.write("Find It\r\n")# 程序开始
#debug(os.listdir())
main()

 

过摄像头可进行人脸检测,但由于SD卡内无文件,无法匹配人脸

按下F1按键,进入人脸注册模式,连续拍5张照存入SD卡(拍摄时绿灯快闪50ms,拍摄完绿灯闪1000ms)

再识别,可完成人脸识别(红灯闪1000ms)。摄像头向IoT平台发送消息,以示匹配成功

Oceanconnect后台收到数据

Oceanconnect后台可下发指令至IoT平台

这篇关于基于OpenMV的人脸识别,支持人脸注册、人脸检测、人脸识别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/768037

相关文章

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

[数据集][目标检测]血细胞检测数据集VOC+YOLO格式2757张4类别

数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2757 标注数量(xml文件个数):2757 标注数量(txt文件个数):2757 标注类别数:4 标注类别名称:["Platelets","RBC","WBC","sickle cell"] 每个类别标注的框数:

Golang支持平滑升级的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。 使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。 一、平滑升级(优雅重启)的一般思路 一般情况下,要实现平滑

深度学习实战:如何利用CNN实现人脸识别考勤系统

1. 何为CNN及其在人脸识别中的应用 卷积神经网络(CNN)是深度学习中的核心技术之一,擅长处理图像数据。CNN通过卷积层提取图像的局部特征,在人脸识别领域尤其适用。CNN的多个层次可以逐步提取面部的特征,最终实现精确的身份识别。对于考勤系统而言,CNN可以自动从摄像头捕捉的视频流中检测并识别出员工的面部。 我们在该项目中采用了 RetinaFace 模型,它基于CNN的结构实现高效、精准的

sqlite不支持中文排序,采用java排序

方式一 不支持含有重复字段进行排序 /*** sqlite不支持中文排序,改用java排序* 根据指定的对象属性字段,排序对象集合,顺序* @param list* @param field* @return*/public static List sortListByField(List<?> list,String field){List temp = new ArrayList(