Портрет одержимого - обновленный
Портрет со страхом в прыжке с нуля с использованием Raspberry Pi 3 B, Python и AtmosFX Видео неживые портреты. Снова октябрь, и я хотел придумать проект Хэллоуина, используя Raspberry Pi. Я видел несколько портретов с привидениями, разбросанных тут и там, но ни один из них не представлял особого страха, просто какое-то простое движение.
Я решил развить эту идею и начал искать несколько хороших видеороликов, которые можно было бы использовать. Это привело меня к AtmosFx, у них есть несколько действительно крутых видеороликов Unliving Portrait, которые стоят всего 7,99 доллара каждое. Они идеально подходили для того, что я задумал, и позволили мне иметь более одного видеоролика с запугиванием прыжка, который я мог выбрать вручную или запустить каждое из них наугад.
Вот видео готового проекта.
Мне не хотелось писать код PIR с нуля, поэтому я поискал в Интернете примеры доступа к PIR с помощью Python. Я нашел старую статью Arc Software, в которой демонстрировался похожий проект.
Код, который я представляю, в основном взят из их примера, но я внес в него несколько модификаций, чтобы удовлетворить свои потребности.
ШАГ 1. Создайте рамку ЖК-дисплея
После разборки ЖК-монитора и снятия ЖК-панели и электроники я измерил точный размер дисплея 17 X 11 в портретной ориентации.
Я использовал этот онлайн-инструмент, чтобы вычислить размеры разрезов рамы, чтобы они соответствовали моей ЖК-панели.
Я построил деревянную раму из дерева 1 ″ x 2 ″, которая имела бы внутренние размеры 17 ″ x 11 ″, в которую поместился бы ЖК-дисплей. Я вырезал 4 части, которые, если сложить их вместе, были бы точным размером моего ЖК-дисплея, установил ЖК-дисплей в рамку и сделал ЖК-дисплей заподлицо с рамкой ЖК-дисплея. Рамка для изображения прикрепляется к рамке ЖК-дисплея и оставляет доступ ко всей электронике сзади.
Окрашив фоторамку и дав ей высохнуть, я прикрепил рамку к рамке ЖК-дисплея с помощью гвоздика.
Собранная рамка ЖК-дисплея
Затем я установил Raspberry Pi, используя красивое маленькое крепление с Thingiverse.com (Pi Side Mount), которое я распечатал на своем 3D-принтере.
Я использовал держатели для зеркал, чтобы закрепить ЖК-экран болтами, чтобы он не смещался, и удерживал его заподлицо с передней частью рамы против рамки изображения.
Последним этапом сборки было просверлить весь датчик PIR и прикрепить его к заголовку GPIO Pi. Датчик PIR довольно простой, у него есть горячий, заземляющий и сенсорный штифт.
ШАГ 2. Изображения, видео и код
В моем проекте я использовал три видеоролика "Unliving Portrait" из AtmosFX.
Первым препятствием было заставить видео воспроизводиться при обнаружении движения, а не просто постоянно зацикливаться на экране. Я мог бы загрузить видео, а затем приостановить его на первом кадре, а затем, когда есть движение, заставить его продолжить воспроизведение, а после полного сброса и начать все сначала.
Было бы проще отобразить кадр первого кадра, а затем при обнаружении движения запустить OMXPlayer для воспроизведения соответствующего видеофайла. Преимущество этого заключается в том, что при выходе из OMXPlayer загруженный объект все еще будет находиться в буфере кадра и отображаться на экране.
Для отображения исходного изображения я использовал Linux FBI (просмотрщик изображений с кадровым буфером).
Используемый проигрыватель - OMXPlayer, и хотя он поддерживает паузу, нет команды командной строки, которую я мог бы вызвать в Python для приостановки и воспроизведения без реализации чего-то вроде DBuscontrol, что чрезмерно усложнило бы проект.
Структура папки:
Приведенная ниже структура папок соответствует путям в скрипте для доступа к изображениям и видео. Путь может быть изменен, если пути в скриптах обновлены для соответствия.
Требуемая структура папок для соответствия путям скриптов
Изображения:
Итак, для каждого видео я загрузил его в VLC и сделал экранную шапку первого кадра в том же разрешении, в котором было видео, чтобы они идеально накладывались на экран с видео при его воспроизведении. .
Три видео были с мужчиной, женщиной и ребенком, поэтому я снял экранную шапку каждого и назвал их MaleStart.png, FemaleStart.png и ChildStart.png. Я создал папку в своем проекте на Хэллоуин под названием ScareMedia и загрузил 3 кадра.
Видео:
Затем я назвал каждое видео MaleScare.mp4, FemaleScare.mp4 и ChildScare.mp4 и загрузил их в папку ScareMedia.
Код:
Для автоматизации видео при обнаружении движения необходимо два скрипта.
pirDetect.py
#! / usr / bin / python
import RPi.GPIO as GPIO
время импорта
import os
класс детектора (объект):
def __init __ (self, sensor ):
self.callBacks =[]
self.sensor =sensor
self.currState =False
self.prevState =False
GPIO.setmode (GPIO.BOARD )
GPIO.setup (self.sensor, GPIO.IN, pull_up_down =GPIO.PUD_DOWN)
def read (self):
self.prevState =self.currState
self. currState =GPIO.input (self.sensor)
def printState (self):
print («Вывод GPIO {0} равен {1}». format (self.sensor, «HIGH», если self. currState else «LOW»))
def subscribe (self, callBack):
self.callBacks.append (callBack)
def callBack (self, state):
для fn in self.callBacks:
fn (состояние)
def start (self):
try:
self.read ()
self.printState ()
while True:
self.read ()
if self.currState! =self.prevState:
self.printState ()
self.callBack (self.currState)
time.sleep (.1)
# Так как fbi неправильно восстанавливает консоль wh Когда приложение закрывается, мы немного очищаем и обрабатываем событие KeyboardInterrupt.
except (KeyboardInterrupt, SystemExit):
os.system (‘stty sane’)
scare.py
#! / usr / bin / python
import subprocess as sp
время импорта
import os
from pirDetect import *
import sys
video =[« omxplayer »,« filename »,« -o »,« both »,« –win »,« 0 0 1280 720 »,« –aspect-mode »,« fill »,« –no-osd »,« –orientation » , «180», «- vol», «-600»]
scareFile =«/home/pi/Projects/Halloween/ScareMedia/{0}ScareV.mp4 scheme.format(sys.argv[1])
print (scareFile)
def onMotion (currState):
if currState:
video [1] =scareFile
subVideo =sp.Popen (video)
пока subVideo.poll () имеет значение None:
time.sleep (.1)
def showImage ():
os.system («sudo fbi -T 1 -d / dev / fb0 -noverbose -once /home/pi/Projects/Halloween/ScareMedia/{0}Start.png ”.format (
sys.argv [1]))
showImage ()
objDetect =детектор (7)
objDetect.subscribe (onMotion)
objDetect.start ()
os.system («sudo killall -9 fbi»)
Собираем все вместе:
Скрипту запугивания можно передать один параметр с видеопоследовательностью, которую вы хотите воспроизвести. Позже я автоматизирую это, чтобы проигрывать любой из трех случайным образом.
Существует также модификация, позволяющая добавить камеру Pi и снимать 5-секундное видео человека, активирующего движение, и сохранять его в Pi каждый раз, когда движение обнаруживается. (Еще не реализовано).
Подробнее:портрет одержимого - обновлено
Производственный процесс