這一篇基於上一篇的人臉識別系統: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),
這是最後的結果,打開頁面可以看到兩個人名,點擊鏈接就是對應庫裏的照片了: