千家信息网

树莓派如何实现动作捕捉抓拍存储图像脚本

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍了树莓派如何实现动作捕捉抓拍存储图像脚本,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如下#!/usr/bin
千家信息网最后更新 2026年10月31日树莓派如何实现动作捕捉抓拍存储图像脚本

这篇文章主要介绍了树莓派如何实现动作捕捉抓拍存储图像脚本,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

具体内容如下

#!/usr/bin/python# original script by brainflakes, improved by pageauc, peewee2 and Kesthal# www.raspberrypi.org/phpBB3/viewtopic.php?f=43&t=45235# You need to install PIL to run this script# type "sudo apt-get install python-imaging-tk" in an terminal window to do thisimport StringIOimport subprocessimport osimport timefrom datetime import datetimefrom 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, needs to be higher if noisy view# ForceCapture    - whether to force an image to be captured every forceCaptureTime seconds, values True or False# filepath      - location of folder to save photos# filenamePrefix   - string that prefixes the file name for easier identification of files.# diskSpaceToReserve - Delete oldest images to avoid filling disk. How much byte to keep free on disk.# cameraSettings   - "" = no extra settings; "-hf" = Set horizontal flip of image; "-vf" = Set vertical flip; "-hf -vf" = both horizontal and vertical flipthreshold = 10sensitivity = 20forceCapture = TrueforceCaptureTime = 60 * 60 # Once an hourfilepath = "/home/pi/picam"filenamePrefix = "capture"diskSpaceToReserve = 40 * 1024 * 1024 # Keep 40 mb free on diskcameraSettings = ""# settings of the photos to savesaveWidth  = 1296saveHeight = 972saveQuality = 15 # Set jpeg quality (0 to 100)# Test-Image settingstestWidth = 100testHeight = 75# this is the default setting, if the whole image should be scanned for changed pixeltestAreaCount = 1testBorders = [ [[1,testWidth],[1,testHeight]] ] # [ [[start pixel on left side,end pixel on right side],[start pixel on top side,stop pixel on bottom side]] ]# testBorders are NOT zero-based, the first pixel is 1 and the last pixel is testWith or testHeight# with "testBorders", you can define areas, where the script should scan for changed pixel# for example, if your picture looks like this:##   ....XXXX#   ........#   ........## "." is a street or a house, "X" are trees which move arround like crazy when the wind is blowing# because of the wind in the trees, there will be taken photos all the time. to prevent this, your setting might look like this:# testAreaCount = 2# testBorders = [ [[1,50],[1,75]], [[51,100],[26,75]] ] # area y=1 to 25 not scanned in x=51 to 100# even more complex example# testAreaCount = 4# testBorders = [ [[1,39],[1,75]], [[40,67],[43,75]], [[68,85],[48,75]], [[86,100],[41,75]] ]# in debug mode, a file debug.bmp is written to disk with marked changed pixel an with marked border of scan-area# debug mode should only be turned on while testing the parameters abovedebugMode = False # False or True# Capture a small test image (for motion detection)def captureTestImage(settings, width, height):  command = "raspistill %s -w %s -h %s -t 200 -e bmp -n -o -" % (settings, width, height)  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 diskdef saveImage(settings, width, height, quality, diskSpaceToReserve):  keepDiskSpaceFree(diskSpaceToReserve)  time = datetime.now()  filename = filepath + "/" + filenamePrefix + "-ddd-ddd.jpg" % (time.year, time.month, time.day, time.hour, time.minute, time.second)  subprocess.call("raspistill %s -w %s -h %s -t 200 -e jpg -q %s -n -o %s" % (settings, width, height, quality, filename), shell=True)  print "Captured %s" % filename# Keep free space above given leveldef keepDiskSpaceFree(bytesToReserve):  if (getFreeSpace() < bytesToReserve):    for filename in sorted(os.listdir(filepath + "/")):      if filename.startswith(filenamePrefix) and filename.endswith(".jpg"):        os.remove(filepath + "/" + filename)        print "Deleted %s/%s to avoid filling disk" % (filepath,filename)        if (getFreeSpace() > bytesToReserve):          return# Get available disk spacedef getFreeSpace():  st = os.statvfs(filepath + "/")  du = st.f_bavail * st.f_frsize  return du# Get first imageimage1, buffer1 = captureTestImage(cameraSettings, testWidth, testHeight)# Reset last capture timelastCapture = time.time()while (True):  # Get comparison image  image2, buffer2 = captureTestImage(cameraSettings, testWidth, testHeight)  # Count changed pixels  changedPixels = 0  takePicture = False  if (debugMode): # in debug mode, save a bitmap-file with marked changed pixels and with visible testarea-borders    debugimage = Image.new("RGB",(testWidth, testHeight))    debugim = debugimage.load()  for z in xrange(0, testAreaCount): # = xrange(0,1) with default-values = z will only have the value of 0 = only one scan-area = whole picture    for x in xrange(testBorders[z][0][0]-1, testBorders[z][0][1]): # = xrange(0,100) with default-values      for y in xrange(testBorders[z][1][0]-1, testBorders[z][1][1]):  # = xrange(0,75) with default-values; testBorders are NOT zero-based, buffer1[x,y] are zero-based (0,0 is top left of image, testWidth-1,testHeight-1 is botton right)        if (debugMode):          debugim[x,y] = buffer2[x,y]          if ((x == testBorders[z][0][0]-1) or (x == testBorders[z][0][1]-1) or (y == testBorders[z][1][0]-1) or (y == testBorders[z][1][1]-1)):            # print "Border %s %s" % (x,y)            debugim[x,y] = (0, 0, 255) # in debug mode, mark all border pixel to blue        # 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          if (debugMode):            debugim[x,y] = (0, 255, 0) # in debug mode, mark all changed pixel to green        # Save an image if pixels changed        if (changedPixels > sensitivity):          takePicture = True # will shoot the photo later        if ((debugMode == False) and (changedPixels > sensitivity)):          break # break the y loop      if ((debugMode == False) and (changedPixels > sensitivity)):        break # break the x loop    if ((debugMode == False) and (changedPixels > sensitivity)):      break # break the z loop  if (debugMode):    debugimage.save(filepath + "/debug.bmp") # save debug image as bmp    print "debug.bmp saved, %s changed pixel" % changedPixels  # else:  #   print "%s changed pixel" % changedPixels  # Check force capture  if forceCapture:    if time.time() - lastCapture > forceCaptureTime:      takePicture = True  if takePicture:    lastCapture = time.time()    saveImage(cameraSettings, saveWidth, saveHeight, saveQuality, diskSpaceToReserve)  # Swap comparison buffers  image1 = image2  buffer1 = buffer2

感谢你能够认真阅读完这篇文章,希望小编分享的"树莓派如何实现动作捕捉抓拍存储图像脚本"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

篇文章 动作 图像 树莓 脚本 存储 价值 兴趣 内容 同时 更多 朋友 知识 编带 行业 资讯 资讯频道 频道 参考 学习 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网与未来科技 凡科互联网科技 朗涯互联网科技 善班互联网科技有限公司 互联网科技ppt模板 互联网科技上市公司 互联网科技logo设计 互联网 视角下的科技创新 盛创互联网科技有限公司 成都互联网科技公司100强 哈尔滨屹滨互联网科技有限公司 链环科技传统企业怎么转型互联网 郑州欣桑互联网科技有限公司 广州梦谷互联网科技有限公司领导 银川新华互联网科技学校原画 互联网科技职业技能培训学校 米泉互联网科技专业怎么样 互联网科技创业计划的风险分析 现代科技的标志之一的互联网 六子台科技互联网展会 喔噻互联网科技有限公司 哈尔滨大商圈互联网科技有限公司 互联网科技战争 互联网科技logo 博兴的互联网电子科技公司 互联网科技创新的路径 为客找房互联网科技公司怎么样 风投北京互联网科技 互联网科技包装股 马化腾互联网科技教学
0