简易树莓派拍照远程监控

大二的时候用这个发现一个舍友趁其他人放假回家,偷偷叫了一帮兄弟挤(满)在我们宿舍打地铺睡觉,电扇什么的都充公,没谁了

基本思路(后面有变更版本):

  • 编写有两个功能的脚本:
    1. 执行raspistill控制树莓派拍照
    2. 执行python脚本,将照片上传至云
  • 利用crontab定时执行脚本

需要的工具:

  • 树莓派
  • 树莓派官方摄像头,带排线的那种
  • 七牛云(上传到云这方面,选择自己喜欢的即可,根据平台写代码)

首先需要将摄像头接入树莓派,需要注意:

  • 排线蓝色一面朝向以太网接口,插反不会boom但无法识别
  • 不能热插拔
  • 摄像头板子上有led灯(拍照的时候会亮),注意不要用导电的材料连通,否则灯会坏(反而更隐蔽?),我当时为了省事把摄像头卡在两根GPIO针中间,某天碰了一下,一个火花闪过LED再也没亮过

进入树莓派控制台:

  • 首先打开树莓派设置界面
    • sudo raspi-config
  • 打开摄像头支持
    • Interface Options -> Camera on
  • 重启
    • sudo reboot

摄像头安装成功后,执行raspistill即可进行拍照

raspistill的一些参数:

  • -w / –width + number 设置宽度
  • -h / –height + number 设置高度 (两者不设置默认2k,分辨率会影响上传效率,需要根据不同情况进行取舍)
  • -o 输出路径,例如:pic.jpg
  • -t 设置拍照延时 默认5000(5秒)

登陆七牛云,注册账号,在 个人面板 -> 密钥管理 中记录Access_key 和 Secret_key

新建一个存储空间,并记录存储空间名

回到树莓派,开始编写sh脚本:

  • vi [脚本名字].sh
  • 控制摄像头拍照:
    • raspistill -w 600 -h 400 -t 1000 -o [路径]/[图像名].jpg
  • 执行python:
    • python [路径]/[名称].py
  • 保存

回到命令行,安装七牛云的python sdk:

  • pip install qiniu

开始编写python脚本(这个脚本可以参考 七牛官方python文档,基本就是复制粘贴,能跑就行):

  • 七牛云其他语言的文档:软件开发工具包
  • 添加以下代码:
    • import time, os
      
      from qiniu import Auth, put_file, etag, urlsafe_base64_encode
      
      import qiniu.config
      
      #填写记录的Access_key 和 Secret_key
      
      access_key = '[Access_key]'
      
      secret_key = '[Secret_key]'
      
      
      
      q = Auth(access_key, secret_key)
      
      #填写存储空间名
      
      bucket_name = '[存储空间名]'
      
      #上传到云后的文件名
      
      key = '%s_%s_%s_%s_%s_%s.jpg'%(time.localtime()[0], time.localtime()[1],time.localtime()[2], time.localtime()[3], time.localtime()[4], time.localtime()[5])
      
      
      
      token = q.upload_token(bucket_name, key, 3600)
      
      #填写照片路径
      
      localfile = '[本地照片路径]/[照片]'
      
      
      ret, info = put_file(token, key, localfile)
      
      #自动删除照片
      
      if os.path.exists(localfile):
      
      os.remove(localfile)
      
  • import time为了给云文件命名,import os 为了删除本地照片

现在开始,每次执行sh脚本,都会拍摄一张照片,上传至云然后删除这张照片

最后,可以使用Linux自带的crontab来实现隔一段时间拍照

  • 编辑crontab
    • crontab -e
  • 注释的部分说明了crontab的配置方法
    • * * * * * sh [脚本路径]
  • 最后重启crontab服务
    • service cron retart

最后几点(优化?改进?):

  1. 可以在脚本内设置每隔几秒拍一张照片,然后crontab执行脚本,就可以按秒上传照片,例如:
    • fswebcam --rotate 0 -r 800*600 /root/Pictures/Photo.jpg
      python upload.py
      sleep 18
      fswebcam --rotate 0 -r 800*600 /root/Pictures/Photo.jpg
      python upload.py
      sleep 18
      fswebcam --rotate 0 -r 800*600 /root/Pictures/Photo.jpg
      python upload.py
      
    • fswebcam是另一款可以控制摄像头拍照的软件
  2. 在脚本内生成以时间为名称的照片:
    • fswebcam --rotate 0 -r 800*600 /root/Share/$(date +%Y年_%m月_%d日_%H时_%M分_%S秒).jpg
  3. 如果直接上传照片,云空间会有一大坨照片,查看相当麻烦,于是可以改写脚本,先拍照,满足一定条件(照片数量上限,特定时间,空间占用大小等等)后打包一并上传
    • 再编写脚本,加入压缩指令即可
    • 我的做法是将脚本里执行python的语句删除,在python脚本里加入打包指令,再用crontab设置python脚本几小时执行一次

控制好图片的大小比较关键