Raspberry Pi Birdbox kamera (10 / 12 steg)
Steg 10: Skriva din Python program
Jag använde Python eftersom jag ville ha både live streaming och rörelsedetektor för samtidig och Python picamera biblioteket stöder detta. Om du bara vill live streaming sedan programmet raspivid kommer att bli bra, du bara inte kommer att kunna ta bilder med raspistill medan raspivid igång.
Min python skript är som följer. Det är inte snyggt och jag kommer inte att vinna några priser men det fungerar! Mycket av skriptet togs från snuttar finns någon annanstans på internet. Mest noterbart var rörelsedetektor från här.
importera smtplib
Importera e-post
importera mimetypes
importera StringIO
importera underprocess
importera os
Importera tid
importera sys
Importera tid
importera picamera
datetime importera datetime
importera bild från PIL
från e-post. MIMEMultipart import MIMEMultipart
från e-post. Utils importera COMMASPACE
från e-post. MIMEBase import MIMEBase
från email.parser importera Parser
från e-post. MIMEImage import MIMEImage
från e-post. MIMEText import MIMEText
från e-post. MIMEAudio import MIMEAudio < /p >< p > # ursprungliga koden skriven av brainflakes och för att avsluta
# bild scanning för loop så snart känslighet värdet överskrids.
# Detta kan snabba ta av större foto om rörelse upptäcks tidigt i scan
# Motion detection inställningar:
# PGM maded förändringar att läsa värden dynamiskt via kommandoradsparametrar.
# --------------------------
# Tröskel - (hur mycket en pixel har man ändrar genom för att markeras som "förändrats")
# Känslighet - (hur många ändrade pixlar innan du tar en bild) måste vara högre om bullriga Visa
# ForceCapture - (om du vill tvinga en bild för att fångas upp varje forceCaptureTime sekunder)
# filepath - mapp att spara foton
# filenamePrefix - sträng som prefix filnamnet för att underlätta identifiering av filer.
tröskel = 10
känslighet = 180
forceCapture = sant
forceCaptureTime = 60 * 60 # en gång i timmen
filepath = "/ home/pi/bilder /"
filenamePrefix = "pgm"
fileType = "jpg"
# Foto storleksinställningar
saveWidth = 800
saveHeight = 600
diskSpaceToReserve = 40 * 1024 * 1024 # hålla 40 mb ledigt på hårddisken
sys.STDOUT = os.fdopen(sys.stdout.fileno(), 'w', 0)
kamera = picamera. PiCamera() < /p >< p > # e-variabler
användare = ' mattwood262
smtp_host = "smtp.gmail.com"
smtp_port = 587
# server = smtplib. SMTP()
# server.connect(smtp_host,smtp_port)
# server.ehlo()
# server.starttls()
# server.login(user,'')
fromaddr = ' matt
tolist = ' matt
sub = "ämne: birdbox aktivitet" < /p >< p > # fånga en liten testbild (för rörelseavkänning)
def captureTestImage():
imageData = StringIO.StringIO()
# försök:
Camera.Capture (imageData, format = "bmp', use_video_port = True)
# kommando = "raspistill -w %s -h %s -t 1 - n -e bmp -o-" % (100, 75)
# utom:
# camera.capture (imageData, format = "bmp', use_video_port = True)
imageData.seek(0)
im = Image.open(imageData)
buffert = im.load()
imageData.close()
tillbaka im, buffert < /p >< p > # sparar en helbild på disken
def saveImage (bredd, höjd, diskSpaceToReserve):
keepDiskSpaceFree(diskSpaceToReserve)
tid = datetime.now()
filnamn = filenamePrefix + "-% 04d_ % 02d_ % 02d-% 02d % 02d % 02d" % (time.year, time.month, time.day, time.hour, time.minute, time.second)+ "." + filtyp
fullfilename = filepath + filnamn
# camera.resolution = (saveWidth, saveHeight)
Camera.Capture (fullfilename, format = 'jpeg', use_video_port = True)
# subprocess.call ("echo %s > temp.out" % filnamn, shell = True)
# subprocess.call ("/home/pi/Dropbox-Uploader/dropbox_uploader.sh ladda upp %s %s" % (fullfilename, filnamn), shell = True)
# msg = e-post. MIMEMultipart.MIMEMultipart()
# msg ['från'] = fromaddr
# msg ["till"] = tolist
# msg [ämne] = sub
# msg.attach (MIMEText ("\nsent via python", "plain"))
# server.sendmail(user,tolist,msg.as_string())
# print "inspelat bild: %s" % filnamn
Camera.wait_recording(60) < /p >< p > # hålla fria utrymmet ovan med tanke
def keepDiskSpaceFree(bytesToReserve):
om (getFreeSpace() < bytesToReserve):
för filnamnet i sorted(os.listdir(".")):
om filename.startswith(filenamePrefix) och filename.endswith ("." + filtyp):
OS.Remove(filename)
skriva ut "Borttaget %s att undvika fyller disken" % filnamn
om (getFreeSpace() > bytesToReserve):
returnera < /p >< p > # få ledigt diskutrymme
def getFreeSpace():
St = os.statvfs(".")
du = st.f_bavail * st.f_frsize
Returnerar du < /p >< p > #---< /p >< p > # Start-fånga video
Camera.resolution = (640, 480)
Camera.framerate = 30
# camera.resolution = (1024, 768)
Camera.start_recording (sys.stdout, format = "h264") < /p >< p > # få första bilden
image1, buffer1 = captureTestImage() < /p >< p > # Återställ senast fånga tid
lastCapture = time.time() < /p >< p > # lagt detta för att ge visuell feedback av kamera motion capture aktivitet. Kan tas bort efter behov
OS.system('clear')
f = open('./logfile','w')
f.write ("Motion Detection igång")
f.write(' ------------------------')
# print "Pixel tröskel (hur mycket) =" + str(threshold)
# print "känslighet (ändrade pixlar) =" + str(sensitivity)
# Skriv ut "---Motion Capture Filaktivitet---" < /p >< p > medan (sant): < /p >< p > # få jämförelse bild
försök:
image2, buffer2 = captureTestImage()
utom:
subprocess.Call ("echo"timeout"> temp.out", skal = True)
image2, buffer2 = captureTestImage() < /p >< p > # antal ändrade pixlar
changedPixels = 0
x i xrange (0, 100):
# Skanna en linje i bilden så kolla känslighet för rörelse
för y i xrange (0, 75):
# Bara kolla gröna kanalen eftersom det är den högsta kvalitet kanalen
pixdiff = abs (buffer1 [x, y] [1] - buffer2[x,y][1])
om pixdiff > tröskelvärde:
changedPixels += 1 < /p >< p > # förändrat logik - om rörelsen känslighet överskridits sedan
# Spara bilden och avsluta innan hela bilden scan komplett
om changedPixels > känslighet:
lastCapture = time.time()
saveImage (saveWidth, saveHeight, diskSpaceToReserve)
Break
Fortsätt < /p >< p > # Check kraft capture
om forceCapture:
om time.time() - lastCapture > forceCaptureTime:
changedPixels = känslighet + 1
# Byta jämförelse buffertar
image1 = image2
buffer1 = buffer2
#------------------------------------------------------------
Detta program utgångar en videoström till stdout på ungefär samma sätt som raspivid, så föregående kommando används med FFMPEG kommer att fungera. Jag skapade ett enkelt skalskript för att starta programmet Python:
startPythonStream.sh
python cameraModule.py | ffmpeg -i - - vcodec kopia - r 30 - en -f flv rtmp: / / < användarnamn >: < lösenord >
Slutligen använde jag ett verktyg som heter "screen" att lansera programmet och lämna den igång när frånkopplad från Pi.