一、项目结构如下
二、程序主流程
主流程代码,通过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”即可领取