1. main.py

# -*- 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()
  1. 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

特征库

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐