该项目为实时系统,仅允许通过授权/受邀人员,使用人脸识别或NFC卡。
工作步骤:
人脸接近对讲机
看着相机
系统将脸与授权人进行比较
如果找到对应的数据,那么门就会打开,允许一个人可以进入
还有另一种通过方式;
持有通行卡的人将其放置到RFID位置,如果在其数据库中找到此卡的代码,门就会打开
准备
继电器连接
将继电器连接到RPI3。在我的例子中,我使用GPIO12引脚作为数据,5v作为电源,你可以选择任何GND。
您可以使用shell脚本测试中继,只需创建一个简单的sh脚本:
粘贴下面的代码并运行它。
脚本代码:
相机连接
连接相机模块并在raspi-config中启用它:
从终端打开工具:raspi-config
选择Enablecamera并点击Enter,然后转到,系统Finish将提示您重新启动。
要测试系统是否已安装并正常工作,请尝试以下命令:
LED连接
将您的LED连接到您想要的任何GPIO+GND。在我的例子中,我将GPIO16用于绿色LED,将GPIO26用于红色。完成后,测试:
为绿色和红色LED创建2个简单的Python脚本,内容如下:
绿灯.py
红色led2.py
接着就可以进行测试了。如果LED发光,则一切正常。
人脸识别脚本
pip3使用(或用于Python2)从pypi安装此模块:pip2
例如,在 Documents 中创建目录“pic”和“unknown”,并在其中放置一些您认识的人的面部照片。就我而言,它是(“/home/pi/Documents/pic/”)和(“/home/pi/Documents/unknown/”)。
使用以下代码创建一个 python 脚本:
import face_recognition
import picamera
import numpy as np
import os
camera = picamera.PiCamera()
camera.resolution = (320, 240)
output = np.empty((240, 320, 3), dtype=np.uint8)
print("Loading known face image(s)")
ep_image = face_recognition.load_image_file("/home/pi/Documents/pic/ep.jpg")
ep_face_encoding = face_recognition.face_encodings(ep_image)[0]
vl_image = face_recognition.load_image_file("/home/pi/Documents/pic/vl.jpg")
vl_face_encoding = face_recognition.face_encodings(vl_image)[0]
face_locations = []
face_encodings = []
while True:
print("Capturing image.")
camera.capture(output, format="rgb")
face_locations = face_recognition.face_locations(output)
print("Found {} faces in image.".format(len(face_locations)))
face_encodings = face_recognition.face_encodings(output, face_locations)
for face_encoding in face_encodings:
match = face_recognition.compare_faces([ep_face_encoding,vl_face_encoding], face_encoding)
name = ""
os.system("python /home/pi/led2.py &")
import time
date_string = time.strftime("%Y-%m-%d-%H:%M:%S")
camera.capture("/home/pi/Documents/unknown/image-" + date_string + ".jpg")
测试
RFID连接
引脚:
我们需要这个以将我们的RFID模块连接到RaspberryPi1。
ready:
read.py :当脚本找到授权卡时,它在远程 RPI 3 上打开用户图片(运行 LED 脚本),然后开门。
import MFRC522
import signal
import os
continue_reading = True
MIFAREReader = MFRC522.MFRC522()
cardA = [46,44,187,26,163]
cardB = [176,203,130,124,133]
cardC = [20,38,121,207,132]
def end_read(signal, frame):
global continue_reading
continue_reading = False
print "Ctrl+C captured, ending read."
MIFAREReader.GPIO_CLEEN()
signal.signal(signal.SIGINT, end_read)
while continue_reading:
(status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)
if status == MIFAREReader.MI_OK:
print "Card detected"
(status,backData) = MIFAREReader.MFRC522_Anticoll()
if status == MIFAREReader.MI_OK:
print "Card read UID: "+str(backData[0])+","+str(backData[1])+","+str(backData[2])+","+str(backData[3])+","+str(backData[4])
if backData == cardA:
print "Evghenii"
os.system("sshpass -p *password* ssh root@10.0.0.60 fbi -T 1 -d /dev/fb1 -noverbose /home/pi/Documents/pic/ep.jpg")
os.system("sshpass -p *password* ssh root@10.0.0.60 /home/pi/Documents/open.sh 2>/dev/null")
# os.system("sshpass -p *password* ssh root@10.0.0.60 sleep 2")
os.system("sshpass -p *password* ssh root@10.0.0.60 killall fbi")
elif backData == cardB:
print "Vlad"
os.system("sshpass -p *password* ssh root@10.0.0.60 fbi -T 1 -d /dev/fb1 -noverbose /home/pi/Documents/pic/vl.jpg")
os.system("sshpass -p *password* ssh root@10.0.0.60 /home/pi/Documents/open.sh 2>/dev/null")
# os.system("sshpass -p *password* ssh root@10.0.0.60 sleep 2")
os.system("sshpass -p *password* ssh root@10.0.0.60 killall fbi")
elif backData == cardC:
print "is Card C"
else:
print "wrong Card"
os.system("sshpass -p *password* ssh root@10.0.0.60 /home/pi/led2.py 2>/dev/null")
按钮 + 通讯
#!/usr/bin/python
import RPi.GPIO as GPIO
from subprocess import call
from datetime import datetime
import time
import os
shutdownPin = 29
shutdownMinSeconds = 5
# button debounce time in seconds
debounceSeconds = 0.01
GPIO.setmode(GPIO.BOARD)
GPIO.setup(shutdownPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
buttonPressedTime = None
def buttonStateChanged(pin):
global buttonPressedTime
if not (GPIO.input(pin)):
# button is down
if buttonPressedTime is None:
buttonPressedTime = datetime.now()
else:
# button is up
if buttonPressedTime is not None:
elapsed = (datetime.now() - buttonPressedTime).total_seconds()
buttonPressedTime = None
if elapsed >= shutdownMinSeconds:
call(['shutdown', '-r', 'now'], shell=True)
elif elapsed >= debounceSeconds:
os.system("bash /home/pi/timed.sh")
# subscribe to button presses
GPIO.add_event_detect(shutdownPin, GPIO.BOTH, callback=buttonStateChanged)
while True:
# sleep to reduce unnecessary CPU usage
time.sleep(5)
功能.sh
#!/bin/bash
sshpass -p password ssh epogonii@ipadress -p1337 notify-send -i /usr/share/icons/gnome/32x32/actions/ring2.png Smart-Intercom Guest_at_the_door
DISPLAY=:0.0 XAUTHORITY=/home/pi/.Xauthority /usr/bin/feh --hide-pointer -x -q -D 5 -B black -F /home/pi/doorway.png &
sh /home/pi/Documents/open.sh > log.out 2> /dev/null
DISPLAY=:0.0 XAUTHORITY=/home/pi/.Xauthority xdotool key "x"
sh /home/pi/tgphoto.sh FaceRec /var/www/html/last.jpg > log.out 2> /dev/null
此处为智能对讲增加了按钮。它会将您的最后一张照片发送给通讯机器人,并向Ubuntu桌面PC发送通知。
为按钮添加计时
为了通过按钮在特定时间禁用入口,我制作了以下bash脚本:
action.sh-早上7点到晚上19点开门
error.sh-在晚上19点到早上7点之间停止使用,显示限制图像error.sh脚本
全部0条评论
快来发表一下你的评论吧 !