python人脸识别
main.py# -*- coding: utf-8 -*-from tkinter.messagebox import *#python弹窗from tkinter import *#gui编程import numpy as npfrom PIL import Image, ImageTk, ImageDraw, ImageFont#图像处理库import os#多种操作系统接口import w
·
# -*- coding: utf-8 -*-
from tkinter.messagebox import *
#python弹窗
from tkinter import *
#gui编程
import numpy as np
from PIL import Image, ImageTk, ImageDraw, ImageFont
#图像处理库
import os
#多种操作系统接口
import win32ui
#创建菜单,打开文件
import cv2
#图像处理
import dlib
#人脸识别模块
import face_feature
#人脸特征点定位
import shibie
import _thread
import time
import face_recognition as fr
p =None
name = None
times = 1
# X = tf.placeholder(tf.float32, [1, 57*47])
# conv = test.convolution(X)
# saver = tf.compat.v1.train.Saver()
# session = tf.Session()
# saver.restore(session, './mod/best.ckpt')
#frame=Tk()
def createForm():#登录面板
Button(frame,text='登陆', command=lambda:start(1)).grid(column=1)
#Button(label, text='退出', command=_quit).grid(row=3, column=1, stick=E)
def do1():
print("hello")
def loginCheck():#登录检测
if name == 'zhouyi':
frame.destroy()#销毁页面
root.title("人脸识别")
createWidgets()
def createWidgets():
menu_bar = Menu(root)
root.config(menu=menu_bar)
file_menu1 = Menu(menu_bar)
file_menu1.add_command(label="已录入", command=open_photos)
file_menu1.add_separator()
file_menu1.add_command(label="退出", command=_quit)
file_menu2 = Menu(menu_bar)
file_menu2.add_command(label="开始检测", command=start)
file_menu2.add_command(label="停止检测", command=stop)
file_menu2.add_command(label="录入人像", command=add)
menu_bar.add_cascade(label="文件", menu=file_menu1)
menu_bar.add_cascade(label="运行", menu=file_menu2)
def _quit():#退出
root.quit()
root.destroy()
exit()
def start(mod=0): #开始检测
if not camera.isOpened():
camera.open(0)
panel.pack()
# print(mod)
video_loop(mod)
def stop(): #关闭人脸识别
if camera.isOpened():
camera.release()
cv2.destroyAllWindows()
panel.pack_forget()
def add(): #录取人脸特征
cap = cv2.VideoCapture(0) # 创建内置摄像头变量
while cap.isOpened(): # 如果摄像头打开
try:
ret, img = cap.read()
if ret == True:
cv2.imshow("Image", img)
k = cv2.waitKey(100) # 每0.1秒读一次键盘
if k == ord("z") or k == ord("Z"): # 如果输入z
imgSave = img
dlog = win32ui.CreateFileDialog(0)
dlog.DoModal()
filename = dlog.GetPathName().split("\\")[-1]
if '.' not in filename:
filename = filename + '.jpg'
cv2.imwrite('photos/' + filename, imgSave)
cap.release()
imgpath = 'photos/' + filename
image = cv2.imread(imgpath)
f = fr.face_encodings(image, known_face_locations=None)
with open('xuehao.txt', 'r') as fp:
lines = len(fp.readlines())
fp.close()
ft = open("图片库/特征库/" + str(lines + 1) + ".txt", "w")
ft.write(str(list(f[0])))
ft.close()
fc = open("xuehao.txt", "a+")
mz=input("请输入你的名字\n")
fc.write(str(lines + 1) + " "+mz+"\n")
fc.close()
except:
print("错误")
continue
def open_photos(): #打开照片
dlog = win32ui.CreateFileDialog(1)
dlog.SetOFNInitialDir(path+'.\\photos')
dlog.DoModal()
filename = dlog.GetPathName()
def video_loop(mod=0): #摄像头人脸检测
# print(mod)
# global img
# global X
# global conv
# global session
# global name, p
global names
global times
success, img = camera.read() # 从摄像头读取照片
if success: #如果成功读取到人脸
faces = detector(img) #框出人脸
#print(faces)
times+=1 #时间加一
i = 0
if times%20 ==0:
names = [] #创建names列表
#imgWrite = img
for d in faces:
# 使用opencv在原图上画出人脸位置
left_top=(dlib.rectangle.left(d),dlib.rectangle.top(d))
right_bottom=(dlib.rectangle.right(d),dlib.rectangle.bottom(d))
#if mod!=1:
imgWrite = cv2.rectangle(img,left_top,right_bottom,(0,255,0),2,cv2.LINE_AA)
location = [0,0,0,0]
location[0], location[1] =left_top[1], right_bottom[0]
location[2], location[3] = right_bottom[1], left_top[0]
location = tuple(location)
loc = []
loc.append(location)
if times%20 ==0:
p = face_feature.get_feature(img,loc)
name = shibie.shibie(p)
print(name)
if mod==1 and name == "zhouyi":
#frame.destroy()
# print(1111)
root.title("人脸识别")
camera.release()
panel.pack_forget()
# imgWrite = img
showinfo("","登录成功!")
return createWidgets()#功能面板
names.append(name)
# t = _thread.start_new_thread(getname,(img,loc))
if names and len(names)==len(faces) and mod==0:#图像添加文字
imgWrite = cv2.putText(imgWrite, names[i], left_top, font, 1.0, (0,255,0),2,cv2.LINE_AA)
# cv2image = cv2.cvtColor(imgWrite, cv2.COLOR_BGR2RGB) # 转换颜色从BGR到RGB
# imgWrite = Image.fromarray(cv2image)
# print(type(imgWrite))
# #PIL图片上打印汉字
# draw = ImageDraw.Draw(imgWrite)
# draw.text((left_top[0], left_top[1]-20), names[i], (255, 0, 0), font=font1)
# print(type(imgWrite))
# print(names[i])
# imgtk = ImageTk.PhotoImage(image=imgWrite)
# panel.imgtk = imgtk
# panel.config(image=imgtk)
i += 1
if not faces:
imgWrite = img
# cv2image = cv2.cvtColor(imgWrite, cv2.COLOR_BGR2RGBA) # 转换颜色从BGR到RGBA
# imgWrite = Image.fromarray(cv2image) # 将图像转换成Image对象
# print(type(imgWrite),'-'*50)
# imgtk = ImageTk.PhotoImage(image=img)
# panel.imgtk = imgtk
# panel.config(image=imgtk)
# print(type(imgWrite),'-'*50)
cv2image = cv2.cvtColor(imgWrite, cv2.COLOR_BGR2RGBA) # 转换颜色从BGR到RGBA
imgWrite = Image.fromarray(cv2image) # 将图像转换成Image对象
imgtk = ImageTk.PhotoImage(image=imgWrite)
panel.imgtk = imgtk
panel.config(image=imgtk)
root.after(1, lambda:video_loop(mod))
names = []
root = Tk()
root.title("登录")
width = 600
height = 400
screenwidth = root.winfo_screenwidth()
screenheight = root.winfo_screenheight()
alignstr = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2)
root.geometry(alignstr) # 居中对齐
font = cv2.FONT_HERSHEY_SIMPLEX
font1 = ImageFont.truetype("simhei.ttf", 20, encoding="utf-8")
camera = cv2.VideoCapture(0) # 摄像头
camera.release()
path = os.getcwd()
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + \
'haarcascade_frontalface_default.xml')
# 使用特征提取器detector
detector = dlib.get_frontal_face_detector()
username = StringVar()
password = StringVar()
#frame = Frame(root, width=600, height=400)
#frame.pack()
panel = Label(root) # initialize image panel
panel.pack()
start(1)
root.mainloop()
- face_feature.py
import numpy as np
import face_recognition as fr
#人脸识别
import cv2
#人脸识别
import os
#系统接口
def get_features():
ld = 'pic/pics/'
ldr = '图片库/特征库/'
dr = os.listdir(ld)
num = len(dr)
i = 0
for file in range(num):
filename = ld+str(file+1)+'.jpg'
image = cv2.imread(filename)
f = fr.face_encodings(image,known_face_locations=None)
if i<9:
ff = open(ldr+'0'+str(i+1)+'.txt','w')
else:
ff = open(ldr+str(i+1)+'.txt', 'w')
print(str(file+1)+'.jpg')
ff.write(str(list(f[0])))
ff.close()
i += 1
# get_features()
def get_feature(img,location):
ft = fr.face_encodings(img,known_face_locations=location)
if not ft:
return False
return list(ft[0])
#提取图片的特征向量并写入特征库
3.shibie.py
import os
import test
#path="测试/" #待读取的文件夹
# X = tf.placeholder(tf.float32, [1, 57*47])
# conv = test.convolution(X)
# saver = tf.compat.v1.train.Saver()
# session = tf.Session()
# saver.restore(session, './mod/best.ckpt')
# p = test.get('a.jpg', X, conv, session, 0)
#path_list=os.listdir(path)
#path_list.sort() #对读取的路径进行排序
b=[]
#学号列表
g=open('xuehao.txt','r')
#读取xuehao.txt
with open('xuehao.txt', 'r') as fp:
lines = len(fp.readlines())
fp.close()
for i in range(lines):
#循环索引列表
e=g.readline()
#读取g的数据,以字符串的形式返回
e=e.split()
#把字符串分割成字符数组
# ex = []
# ex.append(e[0])
# ex.append(''.join(e[1:]))
b.append(e)
#将字符数组加入b列表中
path1="图片库/特征库/"
#特征库地址
path_list1=os.listdir(path1)
#返回脸部特征向量列表
d=[]
#人脸特征列表
for fname in path_list1:
#当fname在脸部特征列表
c=open(path1+fname,"r")
#读取这个脸部特征向量
ff=c.read()
ff=ff.rstrip(']')
#删除 string 字符串末尾的']'
ff=ff.lstrip('[')
#删除 string 字符串开头的'['
ff=ff.split(', ')
#以“,”分割字符串
d.append(ff)
#将字符串数组加入d列表
c.close()
#关闭学号文件
g.close()
#关闭特征库文件
def shibie(file):
# 识别图片人脸
x=0
# print('真实:',i+1)
min=9000000000000000000000000000000000000
#参数
#a=open(path+filename,"r")
#f=a.read()
#f=f.rstrip(']')
#f=f.lstrip('[')
#f=f.split(',')
#print(f)
#for i in range(len(f)):
#b.append(float(f[i]))
for i in range(len(d)):
#KNN(K- Nearest Neighbor)法即K最邻近法,如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别
# print(len(ff))
# return
s=0
for j in range(len(d[i])):
# print(file[j],j)
#print(d[i][j],i)
s+=(float(file[j])-float(d[i][j]))**2
if s<min:
min=s
y=i+1
# if int(y)==i+1:
# x+=1
#if int(y)==i+1:
# x+=1
y = int(y)
# print('-'*50)
for item in b:
if y==int(item[0]):
#print(item[1])
return item[1]
#返回匹配的名字
# print('正确率:',str(x/38*100)+'%')
# if __name__=='__main__':
# shibie(path_list)
# shibie(p)
4.trans.py
import face_recognition as fr
import cv2
imgpath = "img/zy.jpg"
image = cv2.imread(imgpath)
f = fr.face_encodings(image, known_face_locations=None)
ft = open("图片库/特征库/39.txt", "w")
ft.write(str(list(f[0])))
ft.close()
xuehao.txt
1 wangjun
2 zhouling
3 lixinyi
4 liyouyu
5 zhangxin
6 zhengshanshan
7 luanxueying
8 niuqingqing
9 daizixuan
10 xudecui
11 lujingjing
12 gaobin
13 lizhengke
14 wangqiyuan
15 huangjunan
16 wangyiyao
17 qianjianchen
18 zhuyunan
19 yejunchao
20 gongguangze
21 malei
22 huzhilin
23 liyuechuan
24 zhaohaixu
25 zhangyan
26 shixiaoxaun
27 zhougang
28 wangyuanlve
29 liurenjie
30 xuweilong
31 zhanglinwei
32 shiguangchuan
33 zhangxiao
34 caiming
35 wangchao
36 zhanglulu
37 yuqiang
38 yaoyuhao
39 zhouyi
40 zhouyi
41 sonhuancheng
42 dawa
43 lixianzhou
44 zhouyi
45 zhouyi
46 huangjun
47 lizhiwei
48 zhouyi
特征库
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)