前面blog中已经向大家介绍了如何构建用于智能魔镜的获取人脸getFac.py和检测人脸detectedIdentification.py两个模块,借助着两个模块我们可以方便的进行人脸检测保存人脸图像,和根据检测到的人脸图像读取人脸身份ID,但是在智能魔镜中,我们还需要根据超声波的状态来决定是否启动摄像头模块进行人脸检测,并且在有人来的时候还需要将检测结果告知到UI程序,启动UI程序执行相应的消息推送命令,这期blog将向大家介绍如何将这些程序模块组织起来,形成一个完整的人脸检测及身份识别模块。
这里我们通过设计一个startPeopleDetect.py模块来实现整个功能,具体设计如下:
1)超声波读取函数
这里通过构建两个函数来实现,第一个函数实现对超声波设备驱动数据的读取获取超声波数据,第二个函数对第一个函数进行了封装,根据获取的超声波数据来判断人是否在镜子前面,
def getUltrasonicData():
ult=open("/sys/devices/platform/soc/soc:sonar/value")
return(int(ult.read()))
#return(random.uniform(20,120))
def isPeopleFrontMirro(dist):
d=getUltrasonicData()
print(d)
if dist<d:
return False
else:
return True
然后我们就可以构建主函数了,在主函数直接完成所有的启动和人脸检测及识别动作,通过这个函数启动维护人脸检测,并且将检测结果实时的写入到数据库中,为UI程序提供人脸检测结果数据,UI程序就可以根据该数据执行相应的显示命令,具体的主函数实现如下:
if __name__=="__main__":
sf=1
if sys.argv[0]<1000 and sys.argv[0]>200:
dist=sys.argv[0]
else:
dist=600
isPeopleFront=0
GF=getFace()
#GF.getface(0)
PD=peopleDetected("./usrImg")
#PD.getPeopleID("./usrImg/002/2.jpg")
while(True):
if isPeopleFront==0:
sf=1
print("no people")
MMDB=MagicMirrorDB("./db.sqlite3")
MMDB.updateSystemStatus('peopleInfront',-1,0,'no people in front')
time.sleep(sf)
isPeopleFront=isPeopleFrontMirro(dist)
else:
# start getface
rs=GF.getface(0)
# start detectPeopleID
if rs!=False:
peopleID=PD.getPeopleID('./temp.jpg')
MMDB=MagicMirrorDB("./db.sqlite3")
else:
peopleID=-1
#is people in front mirro but no find user ID
if(peopleID==-1):
MMDB.updateSystemStatus('peopleInfront',1,0,'have people in front but no ID')
else:
MMDB.updateSystemStatus('peopleInfront',2,peopleID,'find user ID')
while True:
#isPeopleFront=isPeopleFrontMirro(dist)
if isPeopleFront==1:
sf=1
time.sleep(sf)
else:
#save in database
break
isPeopleFront=isPeopleFrontMirro(dist)
sys.exit(0)
保存这个文件,然后搭建好超声波设备和插入USB摄像头,运行该文件就可以每隔1s实现人脸的检测和识别,并且将识别结果保存到数据库中,这样我们就完成了整个魔镜的人脸检测和识别功能的设计。