基于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

相关文章

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

C++ 检测文件大小和文件传输的方法示例详解

《C++检测文件大小和文件传输的方法示例详解》文章介绍了在C/C++中获取文件大小的三种方法,推荐使用stat()函数,并详细说明了如何设计一次性发送压缩包的结构体及传输流程,包含CRC校验和自动解... 目录检测文件的大小✅ 方法一:使用 stat() 函数(推荐)✅ 用法示例:✅ 方法二:使用 fsee

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

华为鸿蒙HarmonyOS 5.1官宣7月开启升级! 首批支持名单公布

《华为鸿蒙HarmonyOS5.1官宣7月开启升级!首批支持名单公布》在刚刚结束的华为Pura80系列及全场景新品发布会上,除了众多新品的发布,还有一个消息也点燃了所有鸿蒙用户的期待,那就是Ha... 在今日的华为 Pura 80 系列及全场景新品发布会上,华为宣布鸿蒙 HarmonyOS 5.1 将于 7

Nacos注册中心和配置中心的底层原理全面解读

《Nacos注册中心和配置中心的底层原理全面解读》:本文主要介绍Nacos注册中心和配置中心的底层原理的全面解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录临时实例和永久实例为什么 Nacos 要将服务实例分为临时实例和永久实例?1.x 版本和2.x版本的区别

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

Spring Cloud之注册中心Nacos的使用详解

《SpringCloud之注册中心Nacos的使用详解》本文介绍SpringCloudAlibaba中的Nacos组件,对比了Nacos与Eureka的区别,展示了如何在项目中引入SpringClo... 目录Naacos服务注册/服务发现引⼊Spring Cloud Alibaba依赖引入Naco编程s依

一文教你解决Python不支持中文路径的问题

《一文教你解决Python不支持中文路径的问题》Python是一种广泛使用的高级编程语言,然而在处理包含中文字符的文件路径时,Python有时会表现出一些不友好的行为,下面小编就来为大家介绍一下具体的... 目录问题背景解决方案1. 设置正确的文件编码2. 使用pathlib模块3. 转换路径为Unicod