STM32+OpenMV+AS608实现人脸识别

STM32+openmv(M7)+As608指纹模块----人脸指纹识别–串口显示

/
/
/
/

前述:本实验基于上一个实验STM32+AS608串口,本文加之前的基础上修改,思路如下:本实验全部操作通过串口以及按键实现(方便无LCD),接下来会移植到LCD屏上。将openmv+STM32+AS608,通过硬件连接图所接。

/
/
实现步骤:上电,首先实现的功能是人脸识别,同时也可以进入人脸录取后在进行识别,该部分代码基于Openmv(Python),
通过按键Key0 进入录取人脸,按键Key1进入人脸识别,如若识别成功,通过串口返回识别人的名称。接下来是指纹模块的功能,这里不做简述,有关过程,请看链接。(该功能目前比较单一,还有待改进)

第一部分:硬件连接

STM32+AS608的连接还是参考上面的连接,主要讲Openmv+Stm32
Openmv Rx — stm32 TX
Openmv TX — stm32 RX
Openmv GND — stm32 GND
Openmv VIN ---- stm32 5V (注意这里连接的是5V),因为Openmv的供电由该引脚提供。
在这里插入图片描述

第二部分:程序设计

STM32与Openmv连接 人脸识别代码

void Face_recognition(void)
{
	u8 key;
	u8 t3;
	u8 number=0;
	//printf("/*********************************************人脸识别*********************************************/\r\n");
	//printf("/**************************************************************************************************/\r\n");
	//printf("/**************************************************************************************************/\r\n");

	while(1)
	{
		key=KEY_Scan(0);
		if(key==KEY0_PRES)
		{
			printf("1");
		}
		if(key==KEY1_PRES)
		{	
			printf("2");
			break;
		}
		/*
		if(key==WKUP_PRES)
		{
			break;
		
		}
		*/
	}

		while(1)
	{
		
		if(USART_RX_STA&0x8000)
		{					   
			number=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
			for(t3=0;t3<number;t3++)
			{
				USART1->DR=USART_RX_BUF[t3];
				while((USART1->SR&0X40)==0);//等待发送结束
			}
			printf("\r\n\r\n");//插入换行
			USART_RX_STA=0;
		}
		if(number>0)
			{
				break;
			}
		

	}
}

Openmv代码-人脸识别及人脸录取代码

"""
作者: SYM
时间: 2019年10月19日22:00
代码功能:与STM32使用,进行stm32通过串口发送消息给openmv,openmv收到信息后
进行人脸识别操作,并将结果传送回STM32单片机进行应答!
个人博客:https://blog.csdn.net/sssyyymm
V1.0版本(有待改进)

"""
import sensor, time, image, pyb
from pyb import UART

RED_LED_PIN = 1
BLUE_LED_PIN = 3

uart = UART(1,115200,timeout_char=1000)
data=bytes([0x0d,0x0a])

#uart.write("Now begin Face_recognition!\r\n")
#uart.write(data)



def face_recognition():
    sensor.reset() # Initialize the camera sensor.
    sensor.set_pixformat(sensor.GRAYSCALE) # or sensor.GRAYSCALE
    sensor.set_framesize(sensor.B128X128) # or sensor.QQVGA (or others)
    sensor.set_windowing((92,112))
    sensor.skip_frames(10) # Let new settings take affect.
    sensor.skip_frames(time = 5000) #等待5s
    #SUB = "s1"
    NUM_SUBJECTS = 3 #图像库中不同人数,一共6人
    NUM_SUBJECTS_IMGS = 10 #每人有20张样本图片

    # 拍摄当前人脸。
    img = sensor.snapshot()
    #img = image.Image("face/%s/1.pgm"%(SUB))
    d0 = img.find_lbp((0, 0, img.width(), img.height()))
    #d0为当前人脸的lbp特征
    img = None
    pmin = 999999
    num=0


    for s in range(1, NUM_SUBJECTS+1):
        dist = 0
        for i in range(2, NUM_SUBJECTS_IMGS+1):
            img = image.Image("face/s%d/%d.pgm"%(s, i))
            d1 = img.find_lbp((0, 0, img.width(), img.height()))
            #d1为第s文件夹中的第i张图片的lbp特征
            dist += image.match_descriptor(d0, d1)#计算d0 d1即样本图像与被检测人脸的特征差异度。
        print("Average dist for subject %d: %d"%(s, dist/NUM_SUBJECTS_IMGS))
        #pmin = min(pmin, dist/NUM_SUBJECTS_IMGS, s)#特征差异度越小,被检测人脸与此样本更相似更匹配。
        if (dist/NUM_SUBJECTS_IMGS)<pmin:
            pmin=(dist/NUM_SUBJECTS_IMGS)
            num=s
        print(pmin)
    print(num) # num为当前最匹配的人的编号。
    #uart.write(str(num))
    if num==1:
        uart.write("You are SYM!")
        uart.write(data)
    elif num==2:
        uart.write("You are gt!")
        uart.write(data)
    elif num==3:
        uart.write("You are LWZ!")
        uart.write(data)
def take_photos():
    sensor.reset() # Initialize the camera sensor.
    sensor.set_pixformat(sensor.GRAYSCALE) # or sensor.GRAYSCALE
    sensor.set_framesize(sensor.B128X128) # or sensor.QQVGA (or others)
    sensor.set_windowing((92,112))
    sensor.skip_frames(10) # Let new settings take affect.
    sensor.skip_frames(time = 2000)

    num2 = 3 #设置被拍摄者序号,第一个人的图片保存到s1文件夹,第二个人的图片保存到s2文件夹,以此类推。每次更换拍摄者时,修改num值。

    n = 10 #设置每个人拍摄图片数量。

    #连续拍摄n张照片,每间隔3s拍摄一次。
    while(n):
        #红灯亮
        pyb.LED(RED_LED_PIN).on()
        sensor.skip_frames(time = 2000) # Give the user time to get ready.等待3s,准备一下表情。

        #红灯灭,蓝灯亮
        pyb.LED(RED_LED_PIN).off()
        pyb.LED(BLUE_LED_PIN).on()

        #保存截取到的图片到SD卡
        print(n)
        sensor.snapshot().save("face/s%s/%s.pgm" % (num2, n) ) # or "example.bmp" (or others)

        n -= 1

        pyb.LED(BLUE_LED_PIN).off()
        print("Done! Reset the camera to see the saved image.")


#uart.write(str(num))
if __name__=='__main__':
    while(1):
        if uart.any():
            num1 =uart.readline().decode()
            num1 = int(num1)
            if(num1==1):
                print(num1)
                take_photos()
            elif(num1==2):
                print(num1)
                face_recognition()
                break










主要代码,其他代码不再展示,整个工程上传到下载:

第三部分:实验现象

通过按键1录取人脸。按键2进行人脸对比,输出人脸信息,然后进入指纹部分
在这里插入图片描述
接下来是指纹模块的
在这里插入图片描述

第四部分:总结与改进

1,openmv与stm32直接通讯,通过stm32串口收发,接收openmv以及发送到openmv。
2.as608指纹模块的 驱动程序
3.待改进点:采用中断运行,不占用处理器资源,添加蜂鸣器响应,
4.增加WIFi模块,传送到移动端安卓,进行远程控制
5,上传指纹和人脸数据库信息。
等等。。

欢迎大家在下面评论谈论

为方便没有积分的用户下载,将资源放在百度网盘,有需要自己下载哈!!!感谢支持!
注:V1版本是只有STM32+As608,V2版本是STM32+As608+openmv.大家结合需求自己下载

链接:https://pan.baidu.com/s/16viOu4Uu4r0bOjRD1KTd4g
提取码:cbg1
复制这段内容后打开百度网盘手机App,操作更方便哦

1,开发板提供强大的WEB访问和控制功能,通过浏览器可以实现开发板的控制和操作(包括视频监控,音乐播放和继电器控制等功能) 2,支持android手机app视频监控,提供手机APP源代码。支持VLC/1K播放器(IOS),OPlayer(Android)等软件直接播放开发板MJPG视频,只要在这些软件上输入开发板HTTP地址即可。 3,支持PC软件监控,实测视频参考(支持PC安装VLC播放器直接播放开发板MJPG视频,只要在VLC播放器中输入开发板HTTP地址即可): 4,支持OneNet云平台EDP协议,轻松实现视频监控,所有代码开源,通过网页或者APP可轻松访问公开的摄像头数据。 5,支持阿里云物联网平台,支持TLS方式接入(已经移植了MbedTLS协议栈),实现MQTT消息的订阅与发布,数据更安全。 6,支持百度AI平台人脸识别技术,人脸识别应用实现为一个人脸识别控制继电器开关的功能。测试时,将开发板摄像头对准人脸人脸相隔40~60cm),如果开发板检查到当前人脸人脸库中的匹配,则会使继电器闭合,否则断开继电器。 7,支持百度AI平台语音识别技术语音合成技术,应用的功能为:当按下开发板上的按键后,开发板开始捕捉2秒长度的PCM音频数据,并发送给AI平台识别成文字;同时开发板将识别出来的文字发送给AI语音合成接口,获得一段MP3并播放;同时开发板会检测合成的文字中有没有“开灯”“关灯”字符串,有的话则控制继电器做出相应动作。另一个语音合成功能是,我们可以使用串口发送数据到开发版,开发板将收到的文字请求AI平台,并获得一段MP3并播放 8,支持百度AI平台物体识别技术,物体识别功能为:开发板周期性的利用摄像头捕捉的图像并请求AI平台进行物体识别,同时将识别出来的文字使用百度语音合成功能合成为MP3并播放出来
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值