Membre du forum de la Fondation ‘flocons de cerveaux‘a réussi à écrire un script Python pour prendre et analyser des images du module caméra Raspberry Pi afin de détecter les mouvements. Il explique ce qu’il fait sur le forum:
Tout en surveillant le mouvement, il dirige une image miniature de raspistill à environ 1 ips pour l’analyse (il garde tout en mémoire pour éviter d’user la carte SD). Une fois le mouvement détecté, il appelle à nouveau raspistill pour écrire un jpeg haute résolution sur le disque.
Il vérifie également l’espace disque libre et s’il est inférieur à une limite définie, il commence à supprimer les images les plus anciennes pour s’assurer qu’il y a toujours suffisamment d’espace libre pour les nouvelles images.
Lors de l’exécution sur mon rev1 B, il consomme environ 12% de CPU / 4% de RAM et parvient à capturer une image en taille réelle une fois tous les 2-3 secondes.
Si vous devez installer PIL, exécutez «sudo aptitude install python-imaging-tk»
Voici le script:
import StringIO import subprocess import os import time from datetime import datetime from PIL import Image # Motion detection settings: # Threshold (how much a pixel has to change by to be marked as "changed") # Sensitivity (how many changed pixels before capturing an image) # ForceCapture (whether to force an image to be captured every forceCaptureTime seconds) threshold = 10 sensitivity = 20 forceCapture = True forceCaptureTime = 60 * 60 # Once an hour # File settings saveWidth = 1280 saveHeight = 960 diskSpaceToReserve = 40 * 1024 * 1024 # Keep 40 mb free on disk # Capture a small test image (for motion detection) def captureTestImage(): command = "raspistill -w %s -h %s -t 0 -e bmp -o -" % (100, 75) imageData = StringIO.StringIO() imageData.write(subprocess.check_output(command, shell=True)) imageData.seek(0) im = Image.open(imageData) buffer = im.load() imageData.close() return im, buffer # Save a full size image to disk def saveImage(width, height, diskSpaceToReserve): keepDiskSpaceFree(diskSpaceToReserve) time = datetime.now() filename = "capture-%04d%02d%02d-%02d%02d%02d.jpg" % (time.year, time.month, time.day, time.hour, time.minute, time.second) subprocess.call("raspistill -w 1296 -h 972 -t 0 -e jpg -q 15 -o %s" % filename, shell=True) print "Captured %s" % filename # Keep free space above given level def keepDiskSpaceFree(bytesToReserve): if (getFreeSpace() < bytesToReserve): for filename in sorted(os.listdir(".")): if filename.startswith("capture") and filename.endswith(".jpg"): os.remove(filename) print "Deleted %s to avoid filling disk" % filename if (getFreeSpace() > bytesToReserve): return # Get available disk space def getFreeSpace(): st = os.statvfs(".") du = st.f_bavail * st.f_frsize return du # Get first image image1, buffer1 = captureTestImage() # Reset last capture time lastCapture = time.time() while (True): # Get comparison image image2, buffer2 = captureTestImage() # Count changed pixels changedPixels = 0 for x in xrange(0, 100): for y in xrange(0, 75): # Just check green channel as it's the highest quality channel pixdiff = abs(buffer1[x,y][1] - buffer2[x,y][1]) if pixdiff > threshold: changedPixels += 1 # Check force capture if forceCapture: if time.time() - lastCapture > forceCaptureTime: changedPixels = sensitivity + 1 # Save an image if pixels changed if changedPixels > sensitivity: lastCapture = time.time() saveImage(saveWidth, saveHeight, diskSpaceToReserve) # Swap comparison buffers image1 = image2 buffer1 = buffer2
Un grand merci à brainflakes pour cela – fantastique de voir les gens se retrouver coincés avec des applications utiles pour la caméra
Lire l’article original sur le forum Raspberry Pi Foundation