所持しているポートレート–更新
DIYはRaspberryを使用して怖いポートレートを最初からジャンプしますPi 3 B、Python、AtmosFXビデオの生き生きとしたポートレート。また10月になり、RaspberryPiを使用したハロウィーンプロジェクトを考え出したいと思いました。幽霊の出る肖像画があちこちに散らばっているのを見ましたが、どれも怖いものではなく、単純な動きだけでした。
私はそのアイデアを拡張することに決め、使用できるジャンプスケアタイプの優れた動画を探し始めました。これにより、AtmosFxにたどり着きました。彼らには、それぞれたったの7.99ドルの本当にクールなUnlivingPortraitビデオがいくつかあります。これらは私が考えていたものにぴったりで、手動で選択したり、ランダムに実行したりできるジャンプスケアビデオを複数持つことができました。
PIRコードを最初から書きたくなかったので、PythonでPIRにアクセスする例をウェブで検索しました。同様のプロジェクトを示した古い記事ByArcSoftwareを見つけました。
私が提示しているコードは、ほとんどが彼らの例からのものですが、ニーズに合わせていくつかの変更を加えました。
ステップ1:LCDフレームを作成する
LCDモニターを分解し、LCDパネルと電子機器を取り外した後、縦向きでディスプレイ17 X11の正確なサイズを測定します。
組み立てられたLCDフレーム
組み立ての最後のステップは、PIRセンサー用に全体をドリルして、PiのGPIOヘッダーに取り付けることでした。 PIRは非常にシンプルで、ホット、グラウンド、センサーピンがあります。
ステップ2:画像、動画、コード
最初のハードルは、画面上で常にループするだけでなく、動きが検出されたときにビデオを再生することでした。ビデオをロードして最初のフレームで一時停止し、モーションが発生したら再生を続行し、完全にリセットして最初からやり直すことができます。
最初のフレームの静止画を表示し、動きが検出されたらOMXPlayerを起動して適切なビデオファイルを再生する方が簡単です。これの利点は、OMXPlayerが終了したときに、ロードされたものがまだフレームバッファにあり、画面に表示されることです。
使用されるプレーヤーはOMXPlayerであり、一時停止をサポートしていますが、プロジェクトを過度に複雑にするDBuscontrolのようなものを実装せずに、Pythonで一時停止して再生するために呼び出すことができるコマンドラインコマンドはありません。
>フォルダ構造:
以下のフォルダ構造は、画像や動画にアクセスするためのスクリプトのパスと一致しています。スクリプト内のパスが一致するように更新されている限り、パスを変更できます。
スクリプトパスと一致するために必要なフォルダ構造
画像:
各ビデオについて、VLCにロードし、ビデオが再生されたときにビデオが画面に完全に重なるように、ビデオと同じ解像度で最初のフレームのスクリーンキャップを作成しました。 。
3つの動画は男性、女性、子供向けだったので、それぞれのスクリーンキャップを取り、MaleStart.png、FemaleStart.png、ChildStart.pngという名前を付けました。ハロウィーンプロジェクトでScareMediaというフォルダを作成し、3枚の静止画をアップロードしました。
ビデオ:
次に、各動画にMaleScare.mp4、FemaleScare.mp4、ChildScare.mp4という名前を付け、ScareMediaフォルダーにアップロードしました。
コード:
pirDetect.py
#!/ usr / bin / python
RPi.GPIOを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 pin {0} is {1}”。format(self.sensor、“ HIGH” ifself。 currState else“ LOW”))
def subscribe(self、callBack):
self.callBacks.append(callBack)
def callBack(self、state):
for fn in self.callBacks:
fn(state)
def start(self):
try:
self.read()
self.printState()
Trueの場合:
self.read()
if self.currState!=self.prevState:
self.printState()
self.callBack(self.currState)
time.sleep(.1)
#fbiはコンソールを正しく復元しないためアプリケーションが終了したら、KeyboardInterruptイベントを少しクリーンアップして処理します。
(KeyboardInterrupt、SystemExit)を除く:
os.system( ‘stty sane’)
scare.py
#!/ usr / bin / python
import subprocess as sp
import time
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” .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")
すべてをまとめる:
怖いスクリプトには、再生したいビデオシーケンスを含む単一のパラメーターを渡すことができます。後でこれを自動化して、3つのうちのいずれかをランダムに再生します。
Piカメラを追加し、モーションをアクティブにしている人の5秒間のビデオを撮影し、モーションが検出されるたびにPiに保存するように変更することもできます。 (まだ実装されていません)。
詳細を読む:所有するポートレート–更新
製造プロセス