I have been using the following script for face recognition as a security feature:
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()
As you can see i have provide all the code to ensure that my face recognition program works.
I feel that the above code is not very efficient. Is there a better way to use face recognition as a security measure using python?