# -*- coding: utf-8 -*-
import time
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from facerec import recognize, train
from facerec import face
from camera import Video, VideoStream
from configure import config, userManager
from soft_keyboard import *
import os
import cv2
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart #导入MIMEMultipart类
from email.mime.image import MIMEImage #导入MIMEImage类
QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8"))
receivers = config.RECEIVERS_EMAIL
mail_host = config.MAIL_HOST
mail_user = config.MAIL_USER
mail_pass = config.MAIL_PASS
mail_postfix = config.MAIL_POSTFIX
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
# Qt css样式文件
style = QString(open('./ui/css/style.css').read())
# 显示视频的Qt控件
# setRect当前一帧图像上画出方框,用于标记人脸的位置
# setRectColor设置方框的颜色
# setUserLabel在方框旁边添加识别信息,比如识别到的用户名
class VideoFrame(QtGui.QLabel):
userName = None
pen_faceRect = QtGui.QPen()
pen_faceRect.setColor(QtGui.QColor(255, 0, 0))
x = 0;
y = 0;
w = 0;
h = 0
def __init__(self, parent):
QtGui.QLabel.__init__(self, parent)
def setRect(self, x, y, w, h):
self.x, self.y, self.w, self.h = x, y, w, h
def setRectColor(self, r, g, b):
self.pen_faceRect.setColor(QtGui.QColor(r, g, b))
def setUserLabel(self, userName):
self.userName = userName
def paintEvent(self, event):
QtGui.QLabel.paintEvent(self, event)
painter = QtGui.QPainter(self)
painter.setPen(self.pen_faceRect)
painter.drawRect(self.x, self.y, self.w, self.h)
if self.userName != None:
painter.drawText(self.x, self.y + 15, self.userName)
# 人脸识别界面
class FaceRec(QWidget):
model = None
confidence = -1
label = ''
faceRect = None
captureFlag = 0
confidences = []
def __init__(self, mainWindow):
super(FaceRec, self).__init__()
self.mainWindow = mainWindow
self.manager = userManager.UserManager()
self.setupUi(self)
self._timer = QtCore.QTimer(self)
self._timer.timeout.connect(self.playVideo)
self._timer.start(10)
self.update()
def setModel(self, model):
self.model = model
def setupUi(self, FaceRec):
FaceRec.setObjectName(_fromUtf8("FaceRec"))
FaceRec.resize(480, 800)
font = QtGui.QFont()
font.setPointSize(16)
self.video_frame = VideoFrame(FaceRec)
self.video_frame.setGeometry(QtCore.QRect(0, 100, 480, 360))
self.pushButton_back = QtGui.QPushButton(FaceRec)
self.pushButton_back.setGeometry(QtCore.QRect(190, 600, 80, 50))
self.pushButton_back.setFont(font)
self.pushButton_back.clicked.connect(self.pushButton_back_clicked)
self.label_title = QtGui.QLabel(FaceRec)
self.label_title.setGeometry(QtCore.QRect(10, 10, 460, 50))
self.label_title.setFont(font)
self.label_info = QtGui.QLabel(FaceRec)
self.label_info.setGeometry(QtCore.QRect(0, 500, 480, 50))
self.label_info.setFont(font)
self.label_info2 = QtGui.QLabel(FaceRec)
self.label_info2.setGeometry(QtCore.QRect(0, 550, 500, 50))
self.label_info2.setFont(font)
self.retranslateUi(FaceRec)
QtCore.QMetaObject.connectSlotsByName(FaceRec)
def pushButton_capture_clicked(self):
print 'capture clicked'
self.captureFlag = 10
def pushButton_back_clicked(self):
self._timer.stop()
self.vs.stop()
self.video.release()
self.mainWindow.setupUi(self.mainWindow)
def pushButton_capture_clicked(self):
self.startRec()
def pushButton_capture_clicked_inpsw(self):
self.startRec()
def setVideo(self, video):
self.video = video
self.vs = VideoStream.VideoStream(self.video, '192.168.1.113', 8888)
# self.vs.startStream()
self.startRec()
def playVideo(self):
try:
pixMap_frame = QtGui.QPixmap.fromImage(self.video.getQImageFrame())
x = 0;
y = 0;
w = 0;
h = 0
if self.faceRect != None:
# 640x480 to 480x360
x, y, w, h = self.faceRect[0] * 0.75, self.faceRect[1] * 0.75, self.faceRect[2] * 0.75, self.faceRect[
3] * 0.75
self.video_frame.setRect(x, y, w, h)
self.video_frame.setPixmap(pixMap_frame)
self.video_frame.setScaledContents(True)
except TypeError:
print "No frame"
def startRec(self):
self.recognizer = recognize.Recognizer()
self.recognizer.finished.connect(self.reciveRecognizeResult)
image = self.video.getGrayCVImage()
self.recognizer.startRec(image, self.model)
def pushButton_capture_clicked_inpsw(self):
self.inputDialog.setInfo(u'请输入用户密码')
self.inputDialog.show()
self.inputDialog.clear()
def reciveRecognizeResult(self):
self.faceRect = self.recognizer.result
userName = None
if not self.video.is_release:
if self.recognizer.result != None:
self.confidences.append(self.recognizer.confidence)
mean = sum(self.confidences) / float(len(self.confidences))
print 'label:', self.recognizer.label
print 'confidence: %.4f' % self.recognizer.confidence, 'mean:%.4f' % mean
user = self.manager.getUserById(self.recognizer.label)
# user = self.manager.getUserById(1)
self.video_frame.setUserLabel(userName)
if user != None:
userName = user['userName']
if self.recognizer.confidence <= 60:
self.video_frame.setRectColor(0, 255, 0)
else:
self.video_frame.setRectColor(255, 0, 0)
info = 'user: ' + str(userName) + ' | confidence: ' + str(self.recognizer.confidence)
self.label_info.setText(info)
# self.startRec()
# if self.recognizer.confidence > 60 and userName != None:
if self.recognizer.confidence < 60:
self.startRec()
else:
self.grabPhotos(userName, receivers, info)
# s = photomailService()
# if s.send_mail(receivers, "Face reconition notice!", info):
# print "人脸认证成功邮件通知发送成功"
# else:
# print "人脸认证成功邮件通知发送失败"
self.passwordAuthentication(info, userName)
def grabPhotos(self, userName, receivers, info):
frame = self.video.read()
grabpersonDir = os.path.join(config.GRAB_FACES_DIR, userName)
if not os.path.exists(grabpersonDir):
os.makedirs(grabpersonDir)
nowtime = time.strftime("%Y-%m-%d-%H_%M_%S", time.localtime(time.time()))
fileName = os.path.join(grabpersonDir, "{}.png".format(nowtime))
cv2.imwrite(fileName, frame)
s = photomailService()
if s.send_mail(receivers, "Face reconition notice!", info, fileName):
print "人脸认证成功邮件通知发送成功"
else:
print "人脸认证成功邮件通知发送失败"
# break
def passwordAuthentication(self, info, userName):
s = ma