Это зеркало было сделано мастером специально для конкурса. Зеркало имеет секретное отделение и когда в него (зеркало) посмотрит определенный человек, то отсек открывается.
Инструменты и материалы:
-Доска;
-Деревянная рамка;
-Баллончик с краской;
-Зеркальная пленка;
-Средство для чистки стекол и ветошь;
-МДФ;
-Raspberry Pi 3 B +;
-Модуль камеры;
-Шаговый двигатель;
-Циркулярная пила;
-Лобзик;
-Наждачная бумага;
-Клейкая лента;
-Рулетка;
-Ножницы;
-3D-принтер;
-Суперклей;
Шаг первый: рама и секретный отсек
Раму мастер приобрел в магазине. Для данной самоделки нужна рама с широкими боковыми стенками. Ширина стенок должна быть не менее 8 сантиметров. В одной из стенок нужно вырезать прямоугольное отверстие для тайника.
Дальше мастер делает ящик-тайник. Ящик должен свободно заходить в прорезь боковой стенки.
Теперь можно собрать раму и покрасить.
Шаг второй: зеркало
Теперь нужно наклеить пленку на стекло. Очищает стекло средством для очистки. Смачивает одну сторону водой. Наклеивает пленку и сгоняет пузырьки воздуха.
Шаг третий: установка и настройка ПО
Дальше нужно установить Raspberry Pi OS и библиотеку OpenCV. Библиотека ориентирована на распознавание лиц.
Теперь нужно протестировать камеру:
Откройте командную строку и введите sudo raspi-config
Выберите «Включить камеру» (это можно найти в параметрах устройств).
Нажмите «Enter»
Зайдите в «Готово» и перегрузите устройство
Затем выполняем следующие действия:
Перейдите в главное меню Raspberry (вверху слева)
Preferences
Raspberry Pi Configuration
Interfaces
Затем выбираем “Enabled”
Подтверждаем
Запускаем скрипт ниже:
import numpy as np
import cv2
cap = cv2.VideoCapture(0)
cap.set(3,640) # set Width
cap.set(4,480) # set Height
while(True):
ret, frame = cap.read()
frame = cv2.flip(frame, -1) # Flip camera vertically
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow(‘frame’, frame)
cv2.imshow(‘gray’, gray)
k = cv2.waitKey(30) & 0xff
if k == 27: # press ‘ESC’ to quit
break
cap.release()
cv2.destroyAllWindows()
После выполнения скрипта на экране должно отобразится два окна. Одно цветное изображение, второе черно-белое.
Нужно запустить еще три сценария, прежде чем все это будет работать. Первый предназначен для сбора данных, второй — для их обучения, а последний — для распознавания. Для сбора данных необходимо сделать реальные снимки лица и сохранить их в определенном месте.
Откройте командную строку и создайте новый каталог и переименуйте его. Мастер назвал свой
mkdir FaceRec
Дальше создаем подкаталог. Его обязательно нужно назвать dataset
cd FaceRec
mkdir dataset
Создаем еще один подкаталог
mkdir trainer
Теперь запускаем первый скрипт, который будет делать снимки пользователя.
import cv2
import os
cam = cv2.VideoCapture(0)
cam.set(3, 640) # set video width
cam.set(4, 480) # set video height
face_detector = cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml’)
# For each person, enter one numeric face id
face_id = input(‘n enter user id end press ==> ‘)
print(«n [INFO] Initializing face capture. Look the camera and wait …»)
# Initialize individual sampling face count
count = 0
while(True):
ret, img = cam.read()
img = cv2.flip(img, -1) # flip video image vertically
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_detector.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2)
count += 1
# Save the captured image into the datasets folder
cv2.imwrite(«dataset/User.» + str(face_id) + ‘.’ + str(count) + «.jpg», gray[y:y+h,x:x+w])
cv2.imshow(‘image’, img)
k = cv2.waitKey(100) & 0xff # Press ‘ESC’ for exiting video
if k == 27:
break
elif count >= 30: # Take 30 face sample and stop video
break
print(«n [INFO] Exiting Program and cleanup stuff»)
cam.release()
cv2.destroyAllWindows()
На этом этапе нужно убедитесь, что установлена pillow на Pi. Если нет, запускаем команду:
pip install pillow
После этого можно запустить обучающий сценарий (второй сценарий), который предоставит файл, который затем будет использоваться в окончательном сценарии.
import cv2
import numpy as np
from PIL import Image
import os
# Path for face image database
path = ‘dataset’
recognizer = cv2.face.LBPHFaceRecognizer_create()
detector = cv2.CascadeClassifier(«haarcascade_frontalface_default.xml»);
# function to get the images and label data
def getImagesAndLabels(path):
imagePaths = [os.path.join(path,f) for f in os.listdir(path)]
faceSamples=[]
ids = []
for imagePath in imagePaths:
PIL_img = Image.open(imagePath).convert(‘L’) # convert it to grayscale
img_numpy = np.array(PIL_img,’uint8′)
id = int(os.path.split(imagePath)[-1].split(«.»)[1])
faces = detector.detectMultiScale(img_numpy)
for (x,y,w,h) in faces:
faceSamples.append(img_numpy[y:y+h,x:x+w])
ids.append(id)
return faceSamples,ids
print («n [INFO] Training faces. It will take a few seconds. Wait …»)
faces,ids = getImagesAndLabels(path)
recognizer.train(faces, np.array(ids))
# Save the model into trainer/trainer.yml
recognizer.write(‘trainer/trainer.yml’) # recognizer.save() worked on Mac, but not on Pi
# Print the numer of faces trained and end program
print(«n [INFO] {0} faces trained. Exiting Program».format(len(np.unique(ids))))
В этом наборе скриптов в систему можно ввести несколько лиц, что означает, что несколько человек могут получить доступ к тайнику, если захотят.
Теперь переходим к распознаванию лица. В этот сценарий был добавлен дополнительный код, чтобы запустить шаговый двигатель.
Начинаем с импорта всех необходимых модулей, а затем устанавливаем режим GPIO на GPIO.BCM.
import numpy as np
import os
import time
import RPi.GPIO as GPIO
GPIO.setwarnings (False)
GPIO.setmode (GPIO.BCM)
Следующий список с именем ControlPin представляет собой массив чисел, представляющих выходные контакты, которые будут использоваться для шагового двигателя.
ControlPin = [14,15,18,23]
Следующий код можно настроить на закрывание ящика кнопкой или через определенный промежуток времени.
GPIO.setup (ControlPin [i], GPIO.OUT)
GPIO.output (ControlPin [i], 0)
GPIO.setup (2, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
Следующие две переменные — это последовательности, которые используются для управления двигателем. Один предназначен для движения двигателя вперед, а другой — для движения назад.
seq1 = [[1,0,0,0],
[1,1,0,0],
[0,1,0,0],
[0,1,1,0],
[0,0,1; 0],
[0,0,1,1],
[0,0,0,1],
[1,0,0,1],]
seq2 = [[0,0,0,1],
[0,0,1,1],
[0,0,1,0],
[0,1,1,0],
[0,1,0, 0],
[1,1,0,0],
[1,0,0,0],
[1,0,0,1],]
Эта часть кода отвечает за количество оборотов двигателя и время задержки при выдвижении ящика вперед
for i in range(1024):
for halfstep in range(8):
for pin in range(4):
GPIO.output(ControlPin[pin], seq1[halfstep] [pin])
time.sleep(.001)
»’while True:
if GPIO.input(2) == GPIO.LOW:
break;»’
time.sleep(5)
Следующая часть за возвращение ящика обратно
for i in range(1024):
for halfstep in range(8):
for pin in range(4):
GPIO.output(ControlPin[pin], seq2[halfstep] [pin])
time.sleep(.001)
print(«Compartment Closed»)
GPIO.output(ControlPin[0], 0)
GPIO.output(ControlPin[3], 0)
time.sleep(3)
Основная часть следующей части используется для настройки камеры и запуска распознавания лиц.
Сначала мастер изменил имена списков, чтобы его имя было в индексе, который он присвоил ему при сборе данных (в данном случае 1). А затем я установил остальные значения на None (или нужно установить другие значения в случае есть пользователей больше).
names = [‘None’, ‘Daniel’, ‘None’, ‘None’, ‘None’, ‘None’]
Следующая часть кода запускает сравнение соответствия лица ранее созданной фотографии.
если intConfidence> 30 и id == ‘Daniel’:
openComp ()
closeComp ()
Полностью все части кода можно скачать ниже.
FaceDataCapture.py
trainingScript.py
recognizerScript.py
Шаг четвертый: установка Pi и подключение двигателя
Установить Raspberry Pi на раму довольно просто. Мастер разработал и напечатал на 3D-принтере угол 90 градусов, на одном конце которого отверстие. Через монтажные отверстия детали закрепляются на Raspberry Pi.
Затем суперклеем приклеиваются к раме.
Файл для печати можно скачать ниже.
piHolder.stl
Теперь нужно просто подключите драйвер двигателя к PI: IN1, IN2, IN3, IN4, к 14,15,18,23 соответственно.
Наконец, подключить контакты 5 В и заземления платы контроллера к выходам 5 В и контактам заземления Pi.
Распиновку можно посмотреть перейдя по этой ссылке.
Шаг пятый: установка камеры
Камера крепится с помощью специально напечатанной штанги.
CameraHolder.stl
Шаг шестой: механизма перемещения ящика
Для перемещения ящика нужно напечатать линейный привод. Скачать файл для печати можно здесь. А ниже можно скачать шестерню, адаптированную для установки на вал двигателя.
spurLinearAct.stl
Затем нужно установить привод на двигатель и закрепить рычаг привода на ящике.
Шаг седьмой: последние детали
Заднюю часть рамы мастер закрывает картоном. В данном случае картон выполняет две функции. Во-первых, закрывает заднюю часть от пыли и посторонних предметов, во-вторых затеняет заднюю часть пленки.
Наконец последний шаг- закрепить на ящике переднюю планку.
Все готово, теперь осталось повесить зеркало на стену, подключить блок питания и использовать по назначению.
Источник (Source)
Становитесь автором сайта, публикуйте собственные статьи, описания самоделок с оплатой за текст. Подробнее здесь.
Источник: