前面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實現人臉的檢測和識別,並且將識別結果保存到數據庫中,這樣我們就完成了整個魔鏡的人臉檢測和識別功能的設計。