Ничего не найдено :(
    В гостях у Самоделкина! » С сайтов » Спец » Зеркало со скрытым отсеком, который открывается при распознавании лица

    Зеркало со скрытым отсеком, который открывается при распознавании лица





    Это зеркало было сделано мастером специально для конкурса. Зеркало имеет секретное отделение и когда в него (зеркало) посмотрит определенный человек, то отсек открывается.

    Инструменты и материалы:
    -Доска;
    -Деревянная рамка;
    -Баллончик с краской;
    -Зеркальная пленка;
    -Средство для чистки стекол и ветошь;
    -МДФ;
    -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)
    Становитесь автором сайта, публикуйте собственные статьи, описания самоделок с оплатой за текст. Подробнее здесь.

    Мусорное ведро с автоматической крышкой

    Как удивить гостей и напугать детей

    10
    Идея
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    10
    Описание
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    10
    Исполнение
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    Итоговая оценка: 10 из 10 (голосов: 1 / История оценок)

    Добавить комментарий

    7 комментариев
    Гость Дмитрий
    Нужно прикрутить ещё секретную кнопочку, чтоб ящик открывался при нажатии кнопки и распознавании лица
    LeoBrynn
    ino53, Сарказм, если что.
    Цель кликбейт – побуждение пользователя к совершению требуемого действия:
    • в интернет-маркетинге – увеличение количества действий посетителей на целевом сайте;
    • в средствах массовой информации – вызвать интерес. Кликбейт представляет собой заголовок к следующей за ним статье;
    Прагматик.
    ino53
    Цитата: Korolev
    Спишем на дребезг/залипание!
    И запятую перед "который", и О вместо А, все туда ... smile
    Цитата: LeoBrynn
    Нифига вы в кликбейте не шарите   
    Эт  точно... А что это? dontknow


    LeoBrynn
    Ну хоть в заголовках ошибок не делайте...

    Нифига вы в кликбейте не шарите  xaxa 
    Прагматик.
    Korolev
    ino53,
    Ну хоть в заголовках ошибок не делайте
    при расспозновании
    Спишем на дребезг/залипание!  smile 
    ino53
    Korolev,
    Не помню точно, как Похмельев писал - Ну хоть в заголовках ошибок не делайте...
    Korolev
    Зеркало имеет секретное отделение и когда в него (зеркало) посмотрит определенный человек, то отсек открывается. 
    Каждый раз, когда я прохожу мимо зеркала? Или надо каждый раз отворачиваться, а смотереться можно только тогда, когда надо открыть ящик? А как он закрывается?  scratch

    Привет, Гость!


    Зарегистрируйтесь

    Или войдите на сайт, если уже зарегистрированы...

    Войти

    Добавьте самоделку

    Добавьте тему

    Онлайн чат

    Опрос
    А Вы знаете, что на сайте оплачиваются отчеты о создании самоделок?

    Последние комментарии

    Все комментарии