我们继续用 Python 编写人脸识别程序,在本节中,我们现在将进入代码部分。你可以先阅读第 1 部分
首先,让我们编写添加新用户的代码。
在这里,我们从相机中拍摄了 30 张照片,并保存在我们的文件夹中。我们将使用这些图像来训练我们的模型。我们正在创建一个小数据集。
# gerekli kütüphaneleri import ediyoruz
import cv2
import numpy as np
import os
import sys
path = os.path.dirname(os.path.abspath(__file__))
detector=cv2.CascadeClassifier(path+r'/home/pi/Desktop/y2tube/haarcascade_frontalface_default.xml') #cascade classifierı kaydettiğimiz
#dosya yolunu ekliyoruz
#Kameradan fotoğraf çekeceğiz, kamera için ayarlama yapıyoruz
camera = cv2.VideoCapture(0)
camera.set(3,640)
camera.set(4,480)
minW = 0.1*camera.get(3)
minH = 0.1*camera.get(4)
faceCascade = cv2.CascadeClassifier("/home/pi/Desktop/y2tube/haarcascade_frontalface_default.xml")
#İnput olarak ad/soyad sorulacak,kullanıcı adı kayıtlıysa yeni klasör oluşturmaz,
#kayıtlı değilse kullanıcı adının yazdığı bir klasör oluşturur.
name = input("AD/SOYAD? ")
dirName = "/home/pi/Desktop/y2tube/dataset" + name
print(dirName)
if not os.path.exists(dirName):
os.makedirs(dirName)
print("Klasör oluştruldu")
else:
print("İsim önceden kullanılmış")
sys.exit()
count = 1
while True:
if count > 30: #30 adet fotoğrafı çekip oluşturulan klasöre kaydedecek
break
ret, im =camera.read()
gray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(gray, scaleFactor = 1.5, minNeighbors = 5)
for (x, y, w, h) in faces:
roiGray = gray[y:y+h, x:x+w]
fileName = dirName + "/" + name + str(count) + ".jpg"
cv2.imwrite(fileName, roiGray) #cv2.imwrite() ile görüntüyü klasöre kaydediyoruz
cv2.imshow("face", roiGray) #cv2.imshow() ile görüntü pencereye eklenir,pencere görüntü boyutuna göre ayarlanır
cv2.rectangle(im, (x, y), (x+w, y+h), (0, 255, 0), 2) #görüntüye yeşil çerçeve ekliyoruz
count += 1
cv2.imshow('im', im)
key = cv2.waitKey(10) #10 sn bekle
if key == 27: #ESC ye basıldığında kapat
break
cv2.destroyAllWindows()
让我们训练模型。
#kütüphaneleri import edelim
import os
import numpy as np
from PIL import Image
import cv2
import pickle
faceCascade = cv2.CascadeClassifier("/home/pi/Desktop/y2tube/haarcascade_frontalface_default.xml")
# OpenCV paketinde bulunan LBPH (YEREL İKİLİ PATTERNS HISTOGRAMS) yüz tanıyıcı kullanıyoruz.
recognizer = cv2.face.LBPHFaceRecognizer_create()
# Geçerli çalışma dizininin yolunu alınır ve images dizinine gidilir.
baseDir = os.path.dirname(os.path.abspath(__file__))
imageDir = os.path.join(baseDir, "datasetyagmurkahya")
currentId = 1
label_ids={}
y_labels=[]
x_train=[]
#Her görüntü için dizine gider ve görüntüleri arar.
#Görüntü mevcutsa, NumPy dizisine dönüştürüyoruz
for root, dirs, files in os.walk(imageDir):
print(root, dirs, files)
for file in files:
print(file)
if file.endswith("png") or file.endswith("jpg"):
path = os.path.join(root, file)
label = os.path.basename(root)
print(label)
if not label in label_ids:
label_ids[label] = currentId
print(label_ids)
currentId += 1
#Doğru görüntülere sahip olduğumuzdan emin olmak için yüz algılamayı tekrar gerçekleştiriyoruz.
#Ve sonra kıyaslama verilerini hazırlıyoruz
id_ = label_ids[label]
pilImage = Image.open(path).convert("L")
imageArray = np.array(pilImage, "uint8")
faces = faceCascade.detectMultiScale(imageArray, scaleFactor=1.1, minNeighbors=5)
for (x, y, w, h) in faces:
roi = imageArray[y:y+h, x:x+w]
x_train.append(roi)
y_labels.append(id_)
# Dizin adlarını ve etiket kimliklerini içeren sözlüğü saklıyoruz.
with open("labels", "wb") as f:
pickle.dump(label_ids, f)
f.close()
# Verileri eğiterek ve dosyayı kaydediyoruz.
recognizer.train(x_train,np.array(y_labels))
recognizer.save("/home/pi/Desktop/y2tube/trainner.yml")
print(label_ids)
现在我们将编写我们的解锁代码。
如果这个人是已知的,门将被解锁,如果不是,它不会被解锁。
import cv2,os
import numpy as np
import pickle
import RPi.GPIO as GPIO
import time
from PIL import Image
from face_lock import unlock,lock
import smtpmail as m #smtp ile mail göndermek için yazdığımız kodu import ediyoruz
id = 0
names = ['None', 'yagmurkahya']
with open('labels', 'rb') as f:
dicti = pickle.load(f)
f.close()
camera = cv2.VideoCapture(0)
camera.set(3,640)
camera.set(4,480)
minW = 0.1*camera.get(3)
minH = 0.1*camera.get(4)
path = os.path.dirname(os.path.abspath(__file__))
faceCascade = cv2.CascadeClassifier("/home/pi/Desktop/y2tube/haarcascade_frontalface_default.xml")
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read("/home/pi/Desktop/y2tube/trainner.yml")
font = cv2.FONT_HERSHEY_SIMPLEX
prevTime = 0
doorUnlock = False
while True:
ret, im =camera.read()
gray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5, minSize=(100, 100),flags=cv2.CASCADE_SCALE_IMAGE)
for (x, y, w, h) in faces:
cv2.rectangle(im, (x, y), (x + w, y + h), (0, 255, 0), 2)
id, confidence = recognizer.predict(gray[y:y + h, x:x + w])
# güven için 100'den küçük olup olmadığını kontrol et, 0 mükemmel eşleşme
if (confidence < 100):
id = names[id]
confidence = " {0}%".format(round(100 - confidence))
# Ekrana kilidin açıldığı bilgisi verilir,kilit açılır 10 sn sonra tekrar kilitlenir
print("Opening Lock")
unlock(26)
time.sleep(10)
lock(26)
GPIO.cleanup(26)
else:
#bilinmeyen kullanıcı ise kilit açılmaz ve mail gönderilir
id = "unknown"
confidence = " {0}%".format(round(100 - confidence))
lock(26)
m.mails()
cv2.putText(im, str(id), (x + 5, y - 5), font, 1, (255, 255, 255), 2)
cv2.putText(im, str(confidence), (x + 5, y + h - 5), font, 1, (255, 255, 0), 1)
cv2.imshow('camera', im)
k = cv2.waitKey(10) & 0xff # Videodan çıkmak için 'ESC' tuşuna basın
if k == 27:
break
# Do a bit of cleanup
print(" [INFO] Exiting Program and cleanup stuff")
camera.release()
cv2.destroyAllWindows()
GPIO 引脚 电磁锁开关
import RPi.GPIO as GPIO
import time
def unlock(pin=26): #kilitleme fonksiyonu
GPIO.setmode(GPIO.BCM)
GPIO.setup(pin,GPIO.OUT)
GPIO.output(pin,True)
def lock(pin=26): #kilit açma fonksiyonu
'''
Solenoid kilitli pininize taktığınız pin varsayılan olarak 26'dır.
'''
GPIO.setmode(GPIO.BCM)
GPIO.setup(pin,GPIO.OUT)
#GPIO.output(pin,False)
if __name__ == '__main__':
unlock()
time.sleep(10)
lock()
GPIO.cleanup(26)
发送 SMTP 邮件
import smtplib
import datetime
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from email.mime.text import MIMEText
import os
import cv2
import takepic as t
now = datetime.datetime.now()
t.takepic()
def mails():
content="RAPOR"
msg=MIMEMultipart()
k="someone tried to enter the house on time "+str(now.strftime("%Y-%m-%d %H:%M:%S"))
text = MIMEText(k)
msg.attach(text)
img_data = open("/home/pi/Desktop/y2tube/dataset1/NewPicture.jpg", 'rb').read()
image = MIMEImage(img_data, name=os.path.basename("/home/pi/Desktop/y2tube/dataset1/NewPicture.jpg"))
msg.attach(image)
mail=smtplib.SMTP("smtp.gmail.com",587)
mail.ehlo()
mail.starttls()
mail.login("-----@gmail.com mail adresiniz","******* sifreniz")
mail.sendmail("------@gmail.com","--------",msg.as_string())
mails()
发送 SMTP 邮件时的拍照功能
import cv2
def takepic():
videoCaptureObject = cv2.VideoCapture(0)
result = True
while(result):
ret,frame = videoCaptureObject.read(
cv2.imwrite("/home/pi/Desktop/y2tube/dataset1/NewPicture.jpg",frame)
result = False
videoCaptureObject.release()
cv2.destroyAllWindows()
takepic()
把人脸识别门锁项目的流程和代码分享给大家,希望对大家有用。
参与评论
登录后参与讨论 0/1000