我们继续用 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)

ifnot
 os.path.exists(dirName):

    os.makedirs(dirName)

    print(
"Klasör oluştruldu"
)

else
:

    print(
"İsim önceden kullanılmış"
)

    sys.exit()


count = 
1
whileTrue
:


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)


ifnot
 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

whileTrue
:

    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(
"\n [INFO] Exiting Program and cleanup stuff"
)

camera.release()

cv2.destroyAllWindows()

GPIO 引脚 电磁锁开关
import
 RPi.GPIO 
as
 GPIO

import
 time


defunlock(pin=26):#kilitleme fonksiyonu
    GPIO.setmode(GPIO.BCM)

    GPIO.setup(pin,GPIO.OUT)

    GPIO.output(pin,
True
)



deflock(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()



defmails():
 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(
"[email protected] mail adresiniz"
,
"******* sifreniz"
)

 mail.sendmail(
"[email protected]"
,
"--------"
,msg.as_string())



mails()

发送 SMTP 邮件时的拍照功能
import
 cv2

deftakepic():
    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()

把人脸识别门锁项目的流程和代码分享给大家,希望对大家有用。
☆ END ☆
如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 woshicver」,每日朋友圈更新一篇高质量博文
扫描二维码添加小编↓
继续阅读
阅读原文