我一直使用以下脚本进行人脸识别,作为安全功能:
main.py
from itertools import izip
from PIL import Image
def compare(self,pic):
i1 = Image.open("pic1.jpg")
i2 = Image.open(pic)
size = i1.size
i2 = i2.resize(size)
assert i1.mode == i2.mode, "Different kinds of images."
assert i1.size == i2.size, "Different sizes."
pairs = izip(i1.getdata(), i2.getdata())
if len(i1.getbands()) == 1:
# for gray-scale jpegs
dif = sum(abs(p1-p2) for p1,p2 in pairs)
else:
dif = sum(abs(c1-c2) for p1,p2 in pairs for c1,c2 in zip(p1,p2))
ncomponents = i1.size[0] * i1.size[1] * 3
print ((dif / 255.0 * 100) / ncomponents)
return (dif / 255.0 * 100) / ncomponents
def password(self):
import passw
y=str(self.password_input.text)
x=passw.verify(y)
if x == True:
try:
os.startfile("recog.py")
import time
time.sleep(6)
x = self.compare("security.jpg")
if x <= 30:
os.remove("pic1.jpg")
os.rename("security.jpg","pic1.jpg")
return True
else:
raise ValueError
except ValueError, e:
print(e)
sf=open('secure.txt','w')
sf.write("")
sf.close()
if os.path.exists("securitylog.jpg"):
from datetime import datetime, date, time
dt = datetime.today()
t=dt.strftime("%A, %d. %B %Y %H:%M %p")
t='{0:%H:%M }'.format(dt)
f='{0:%A}, {0:%d} of {0:%B}, {0:%Y}.'.format(dt)
timed=(("Date: ",f,"\nTime: ",t))
timed=''.join(timed)
sf=open('secure.txt','a')
sf.write(timed)
sf.close()
kl=Thread(target=self.say, args="You are not authorized to access this program.")
kl.start()
p = Wrong()
p.open()
else:
os.rename("security.jpg","securitylog.jpg")
else:
sf=open('secure.txt','w')
sf.write("")
sf.close()
if os.path.exists("securitylog.jpg"):
from datetime import datetime, date, time
dt = datetime.today()
t=dt.strftime("%A, %d. %B %Y %H:%M %p")
t='{0:%H:%M }'.format(dt)
f='{0:%A}, {0:%d} of {0:%B}, {0:%Y}.'.format(dt)
timed=(("Date: ",f,"\nTime: ",t))
timed=''.join(timed)
sf=open('secure.txt','a')
sf.write(timed)
sf.close()
kl=Thread(target=self.say, args="You are not authorized to access this program.")
kl.start()
p = Wrong()
p.open()
else:
os.rename("security.jpg","securitylog.jpg")passw.py:
from passlib.hash import sha256_crypt
import onetimepad
def verify(string):
y=string
key=y[-2:]
enc=onetimepad.encrypt(y,key)
x=sha256_crypt.verify(enc,'<hash>')
return x
def main():
x=raw_input("Enter Password: ")
print verify(x)
if __name__ =="__main__":
main()recog.py
#!/usr/bin/env python
# Python 2/3 compatibility
from __future__ import print_function
import sys
import numpy as np
import cv2
# local modules
from video import create_capture
from common import clock, draw_str
def detect(img, cascade):
rects = cascade.detectMultiScale(img, scaleFactor=1.3, minNeighbors=4, minSize=(30, 30),
flags=cv2.CASCADE_SCALE_IMAGE)
if len(rects) == 0:
return []
rects[:,2:] += rects[:,:2]
return rects
def draw_rects(img, rects, color):
for x1, y1, x2, y2 in rects:
cv2.rectangle(img, (x1, y1), (x2, y2), color, 2)
if __name__ == '__main__':
import sys, getopt
print("Face Recognition using Haar Cascades")
args, video_src = getopt.getopt(sys.argv[1:], '', ['cascade=', 'nested-cascade='])
try:
video_src = video_src[0]
except:
video_src = 0
args = dict(args)
cascade_fn = args.get('--cascade', "E:\\Python27\\My programs\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml")
nested_fn = args.get('--nested-cascade', "E:\\Python27\\My programs\\opencv\\sources\\data\\haarcascades\\haarcascade_eye.xml")
cascade = cv2.CascadeClassifier(cascade_fn)
nested = cv2.CascadeClassifier(nested_fn)
cam = create_capture(video_src, fallback='synth:bg=../data/lena.jpg:noise=0.05')
while True:
ret, img = cam.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.equalizeHist(gray)
t = clock()
rects = detect(gray, cascade)
vis = img.copy()
draw_rects(vis, rects, (0, 255, 0))
if not nested.empty():
for x1, y1, x2, y2 in rects:
roi = gray[y1:y2, x1:x2]
vis_roi = vis[y1:y2, x1:x2]
subrects = detect(roi.copy(), nested)
print("Face detected")
image = vis_roi
cv2.imwrite('security.jpg', image)
cv2.destroyWindow('facedetect')
sys.exit()
dt = clock() - t
draw_str(vis, (20, 20), 'time: %.1f ms' % (dt*1000))
cv2.imshow('facedetect', vis)
if 0xFF & cv2.waitKey(5) == 27:
break
cv2.destroyAllWindows()如您所见,我提供了所有的代码,以确保我的面部识别程序工作。
我觉得上面的代码不是很有效率。有没有更好的方法使用人脸识别作为使用python的安全措施?
发布于 2016-09-06 08:49:50
你应该阅读并跟随PEP8。这意味着:
这是因为它使您的代码更易于阅读。为了增加可读性,我们在英语单词周围加了空格,在编程语言中也是这样做的。
你应该:
with。 --这可以确保文件被关闭,即使程序错误。假设用户强制退出程序,KeyboardInterrupt。assert。 assert用于调试,而不是用于实时代码。如果我使用-O标志运行您的代码,它将删除所有这些,然后您的代码就会中断。pic1.jpg更改为image.jpg并同时使用pic1.jpeg时。这意味着您需要重新编写代码才能做到这一点。try块。 --这会导致错误的掩蔽。这是因为你可能有两个函数,ValueErrors说,但是你不知道哪个函数引发了ValueError,现在你正在处理未知的状态。main.py中做的那样,您从未导入os,但您正在使用它。password中的main.py为例,您复制了大量的函数块,您可以在其中将它连接在一起,或者至少为它创建一个函数。我所知道的最大的改变是如何对main.py进行修改。除此之外,我将您的代码更改为使用更少的变量,并删除了死代码。采取:
dt = datetime.today()
t=dt.strftime("%A, %d. %B %Y %H:%M %p")
t='{0:%H:%M }'.format(dt)
f='{0:%A}, {0:%d} of {0:%B}, {0:%Y}.'.format(dt)
timed=(("Date: ",f,"\nTime: ",t))
timed=''.join(timed)第一个t是死代码,您可以立即将t覆盖到其他东西,这样就可以删除它。在此之后,您有两个timed变量,您可以将其更改为单个str.format,Date: {}\nTime: {}。由此您应该注意到,您可以将所有str.formats合并为一个,并最终得到如下结果:
timed = 'Date: {0:%A}, {0:%d} of {0:%B}, {0:%Y}.\nTime: {0:%H:%M }'.format(datetime.today())我将只显示对main.py的更改,因为其他文件没有那么多要更改:
from itertools import izip
import time
from datetime import datetime, date, time
from PIL import Image
import passw
def compare(self, picture1, picture2):
image1 = Image.open(picture1)
image2 = Image.open(picture2).resize(image1.size)
if image1.mode != image2.mode:
raise ValueError("Different kinds of images.")
if image1.size != image2.size:
raise ValueError("Different sizes.")
pairs = izip(image1.getdata(), image2.getdata())
if len(image1.getbands()) == 1:
dif = sum(abs(p1-p2) for p1, p2 in pairs)
else:
dif = sum(abs(c1-c2) for p1, p2 in pairs for c1, c2 in zip(p1,p2))
ret = (dif / 255.0 * 100) / image1.size[0] * image1.size[1] * 3
print ret
return ret
def password(self):
y = str(self.password_input.text)
x = passw.verify(y)
if x:
try:
os.startfile("recog.py")
time.sleep(6)
if self.compare("pic1.jpg", "security.jpg") <= 30:
os.remove("pic1.jpg")
os.rename("security.jpg", "pic1.jpg")
return True
else:
raise ValueError
except ValueError, e:
print(e)
# If not x or ValueError.
with open('secure.txt', 'w') as sf:
sf.write('')
if os.path.exists("securitylog.jpg"):
with open('secure.txt', 'a') as sf:
sf.write('Date: {0:%A}, {0:%d} of {0:%B}, {0:%Y}.\nTime: {0:%H:%M }'
.format(datetime.today()))
kl = Thread(target=self.say, args="You are not authorized to access this program.")
kl.start()
p = Wrong()
p.open()
else:
os.rename("security.jpg", "securitylog.jpg")https://codereview.stackexchange.com/questions/140604
复制相似问题