前言
本系统主要以STM32C8T6作为微控制器,以LCD屏为人机交互窗口,以openMV4摄像头为图像采集设备。利用STM32C8T6通过串口通信发送数据给Openmv,让Openmv进行人脸识别,并且将识别结果返回给STM32,并且发送数据给语音模块,进行语音播报;同时STM32IO口控制继电器,给电磁锁通入电压打开门。
一、Openmv程序源码
这部分代码包括Openmv与STM32的串口通信,人脸识别,人脸特征存储。
串口通信
uart = UART(3, 115200)
uart.init(115200, bits=8, parity=None, stop=1) #8位数据位,无校验位,1位停止位
num1 = 6
#============串口发送======================
def send_data_packet(c):
temp = struct.pack("<bb", #格式为俩个字符俩个整型
0xAA, #帧头1
c) #人脸识别 01
# x, # up sample by 4 #数据1
# y) # up sample by 4 #数据2
uart.write(temp) #串口发送
人脸识别
#==============人脸识别====================
def face_recognition():
sensor.reset() # Initialize the camera sensor.
sensor.set_pixformat(sensor.GRAYSCALE) # or sensor.GRAYSCALE
sensor.set_framesize(sensor.LCD) # or sensor.QQVGA (or others)
sensor.skip_frames(10) # Let new settings take affect.
sensor.skip_frames(time = 1000) #等待5s
lcd.init() # Initialize the lcd screen.
NUM_SUBJECTS = 1 #图像库中不同人数,一共6人
NUM_SUBJECTS_IMGS = 10 #每人有20张样本图片
# 拍摄当前人脸。
img = sensor.snapshot()
#img = image.Image("face/%s/1.pgm"%(SUB))
lcd.display(img)
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() #拍照指示灯
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("singtown/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)
lcd.display(img)
if(pmin > 10000):
print("未能识别,请再次尝试")
send_data_packet(0x02)
else:
send_data_packet(0x01)
print("欢迎")
# if(num == 2):
# send_data_packet(0x03)
# print("识别成功")
print("发送成功")
人脸拍照特征存储
#========拍照并保存到识别库的程序代码=====================
def take_photos():
sensor.reset() # Initialize the camera sensor.
sensor.set_pixformat(sensor.GRAYSCALE) # or sensor.GRAYSCALE
sensor.set_framesize(sensor.LCD) # or sensor.QQVGA (or others)
sensor.skip_frames(10) # Let new settings take affect.
sensor.skip_frames(time = 2000)
lcd.init() # Initialize the lcd screen.
num2 = 1 #设置被拍摄者序号,第一个人的图片保存到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("singtown/s%s/%s.pgm" % (num2, n) ) # or "example.bmp" (or others)
lcd.display(sensor.snapshot())
n -= 1
pyb.LED(BLUE_LED_PIN).off()
print("拍照并保存成功!进行下一张")
if n==0:
send_data_packet(0x03) #发送完成
二、STM32程序
1.判断openmv发送的数据
直接使用串口判断Openmv发送的数据,若数据为成功,则控制另一个串口发送指令给语音播报模块,进行说明。
2.作品实物图
照的时候还没有进行包装,看着有点乱。
总结
整体功能能实现,后续可进行优化设计,可加入指纹和密码解锁等。
版权声明:本文为weixin_51801818原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。