这一篇基于上一篇的人脸识别系统:https://blog.csdn.net/qq_41938259/article/details/104587091
这是这个学习项目的gitee地址:https://gitee.com/timtian139/WEBfaceRecognitionTest/tree/master/faceWeb
这次主要是按照老师的要求增加了抽签的功能,一次抽两个人,抽到签的人前往打卡页,主要功能是显示抽中人的姓名和图片。由于功能简单所以就不再另设APP了,直接放在名为faceRecognitionManagement的APP的views.py文件中。以下是全部新增的代码:
def chouqian(request):
red = redis.StrictRedis(host='localhost', port=6379, db=1)
facesName = red.keys()
facesName = list(set(facesName))
facesResult =random.sample(facesName, 2)
facesResult2 = []
for face in facesResult:
facesResult2.append(str(face, 'utf-8'))
routes = []
for face in facesResult:
routes.append(red.get(face).decode('utf-8'))
result = dict(zip(facesResult2, routes))
context = {
'result': result,
}
return render(request, 'chouqian.html', context=context)
由于使用了Redis存放姓名和图片地址的键值对,所以得先链接上Redis数据库,并取出所有的key,即所有人的姓名。要考虑到有重复的姓名,因为一个人可能有多张图片在库中,所以还有一个去重的步骤,具体实现内容如下:
# 打开数据库
red = redis.StrictRedis(host='localhost', port=6379, db=1)
# 取出所有的键/姓名
facesName = red.keys()
# 去重
facesName = list(set(facesName))
# 抽取两个人,数字可以改动
facesResult =random.sample(facesName, 2)
# 定义一个新的列表用于存放人名(键)
# 由于Redis使用的字节流,所以要转化成utf-8编码
facesResult2 = []
for face in facesResult:
facesResult2.append(str(face, 'utf-8'))
# 定义一个routes列表,用于存放图片路径,使用utf-8解码
routes = []
for face in facesResult:
routes.append(red.get(face).decode('utf-8'))
# 结果用字典打包
result = dict(zip(facesResult2, routes))
这是对应的html页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
{% load static %}
<title>抽签签到</title>
</head>
<body>
<li>抽签结果</li>
{% for k, v in result.items %}
<a href="{{ v }}">姓名:{{ k }}</a>
{% endfor %}
</body>
</html>
要注意的是返回的图片路径是在原有的路径后面加上图片路径,所以在urls.py中要映射俩个url,一个是html页面的url,另一个是图片地址转化的url,如下所示:
url(r'^chouqian/facePhoto/(?P<path>.*)$', serve, {'document_root': 'facePhoto'}),
url(r'^chouqian/', chouqian),
这是最后的结果,打开页面可以看到两个人名,点击链接就是对应库里的照片了: