一、項目結構如下
二、程序主流程
主流程代碼,通過sqlite3保存人臉數據和信息,然後通過遍歷數據庫與之對比找出識別者信息,若識別不到,則會提示添加人臉信息至數據庫。
<code>import
sqlite3from
testCameraimport
getFaceID,imgToBase64,reconized,getModelFace,saveFaceDataimport
timedef
checkAll
()
: conn = sqlite3.connect("face.db"
) cursor = conn.cursor() sql ="select * from person_info"
cursor.execute(sql) values = cursor.fetchall() getModelFace.getModel() flag=False
for
iin
values:if
(reconized.face_check(reconized.get_token(),i[2
])): print("您是"
+i[1
]) flag=True
break
return
flag cursor.close() conn.commit() conn.close()if
__name__ =='__main__'
: time1=time.time();if
(checkAll()): time2 = time.time(); useTime = time2 - time1; print("識別耗時"
+ str(useTime) +"秒"
)else
: print("人臉庫無您的信息,請錄入"
) saveFaceData.save()/<code>
三、通過筆記本相機獲取人臉圖片存為Face_id.jpg
getModelFace.py主要是用於對比時獲取人臉與庫中Face_ID對比
<code>import
cv2import
numpyas
npdef
getModel
()
: face_cascade = cv2.CascadeClassifier("D:\Python\haarcascade_frontalface_default.xml"
) cap = cv2.VideoCapture(0
)while
True
: ret, img = cap.read() gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray,1.1
,5
)if
len(faces) >0
: cv2.imwrite("model.jpg"
,img)break
/<code>
人臉特徵識別配置文件
haarcascade_frontalface_default.xml可通過我的雲盤分享獲取。
雲盤分享
提取碼:w5ql
四、通過筆記本相機獲取人臉圖片存為Face_id.jpg
getFaceID.py主要是保存庫內無Face_ID的人臉信息
<code>import
cv2import
numpyas
npdef
getFaceImg
()
: face_cascade = cv2.CascadeClassifier("D:\Python\haarcascade_frontalface_default.xml"
) eye_cascade = cv2.CascadeClassifier("D:\Python\haarcascade_eye.xml"
) cap = cv2.VideoCapture(0
)while
True
: ret, img = cap.read() gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray,1.1
,5
)if
len(faces) >0
: cv2.imwrite("face_id.jpg"
,img)break
return
True
;/<code>
五、將獲取的圖片轉成Base64碼
imgToBase64.py通過python的base64庫將圖片轉成base64碼存入sqlite3數據庫
<code>import
base64def
ImgToBase64
(imgPath)
:with
open(imgPath,'rb'
)as
f: base64_data = base64.b64encode(f.read()) s = base64_data.decode()return
s/<code>
六、將獲取的人臉信息存入數據庫
saveFaceData.py將人臉圖片轉化的base64碼作為Face_id存入數據庫,並錄入人名,可按需增加其他信息。
<code>import
sqlite3from
testCameraimport
getFaceID,imgToBase64import
timedef
save
()
: conn = sqlite3.connect("face.db"
) cursor = conn.cursor() print("請看著攝像頭!!!"
) time.sleep(5
)if
(getFaceID.getFaceImg()): face_id = imgToBase64.ImgToBase64('face_id.jpg'
) print("請輸入您的姓名:"
) name = input() sql ="insert into person_info(name, face_id) values(\'"
+name+"\',\'"
+face_id+"\')"
print(sql) cursor.execute(sql) print("信息錄入成功"
) cursor.execute("delete from person_info where name = '郭志強'"
) print("delete successful"
) cursor.close() conn.commit() conn.close()if
__name__ =='__main__'
: save();/<code>
七、通過百度人臉對比API實現識別功能
reconized.py分兩個方法,先通過註冊百度平臺賬號建立應用獲取百度官網獲取的AK(client_id)以及百度官網獲取的SK(client_secret)來獲取請求的token,再調用百度的人臉識別API請求人臉對比後的返回json數據。
<code>import
urllib.requestimport
jsonimport
base64import
astimport
urllibimport
re,timefrom
testCameraimport
getModelFacedef
face_check
(access_token,face_id)
:''' 調用百度人臉對比API '''
request_url ="https://aip.baidubce.com/rest/2.0/face/v3/match"
filename1 ='model.jpg'
f = open(filename1,'rb'
) img_test1 = base64.b64encode(f.read()) params = json.dumps( [{"image"
:''
+ str(img_test1,'utf-8'
) +''
,"image_type"
:"BASE64"
,"face_type"
:"LIVE"
,"quality_control"
:"LOW"
}, {"image"
:''
+ face_id +''
,"image_type"
:"BASE64"
,"face_type"
:"IDCARD"
,"quality_control"
:"LOW"
}]) request_url = request_url +"?access_token="
+ access_token request = urllib.request.Request(url=request_url, data=params.encode("utf-8"
)) request.add_header('Content-Type'
,'application/json'
) response = urllib.request.urlopen(request) content = response.read() content = content.decode("utf-8"
) content = ast.literal_eval(content)if
(content['result'
]['score'
]>=80
):return
True
else
:return
False
def
get_token
()
:''' 獲取百度token '''
host ='https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=***********&client_secret=************'
request = urllib.request.Request(host) request.add_header('Content-Type'
,'application/json; charset=UTF-8'
) response = urllib.request.urlopen(request) content = response.read()if
(content): p1 = re.compile(r'"access_token":"(.*?)","scope":"'
, re.S) result = re.findall(p1, str(content)).__str__()return
result[2
:-2
]if
__name__ =='__main__'
: getModelFace.getModel() token = get_token() face_check(token)/<code>
運行效果
最後多說一句,小編是一名python開發工程師,這裡有我自己整理了一套最新的python系統學習教程,包括從基礎的python腳本到web開發、爬蟲、數據分析、數據可視化、機器學習等。想要這些資料的可以關注小編,並在後臺私信小編:“01”即可領取