请稍侯

树莓派拍照上传--RASPICAM+七牛

17 November 2014

  在买树莓派的时候顺带买了原装的树莓派摄像头模组,想要实现拍摄图片加上上传到网盘的功能。树莓派的摄像头还是蛮好用的,或者大家可以使用自己的USB摄像头,不过还是老问题,注意兼容性的问题。首先更新下软件:

sudo apt-get update
sudo apt-get upgrade

  然后运行命令sudo raspi-config转到树莓派的配置界面,里面可以设置时区、扩展系统大小等等功能,选择Enable camera选项然后重启sudo shutdown -r now。接下来就可以使用摄像头拍摄照片了。

使用摄像头拍照

  摄像头上的螺丝孔太小,没找到合适的螺丝固定,只能切了块亚克力板用橡皮筋先绑着,在用硅胶打在了树莓派的底板上。
摄像头实物   使用raspistill命令来拍摄禁止的画面,将摄像头插在板上之后,使用命令raspistill -o cam.jpg命令来拍摄照片,照片就会存储在运行该命令的文件夹下。如果发现你的照片是上下颠倒的,使用命令raspistill -vf -hf -o cam2.jpg来反转图像。树莓派摄像头的分辨率是2592 x 1944,一张照片大概2.4MB左右。如果每分钟拍摄一张照片的话一个小时占用144MB,7个小时大概存满1GB,一天能拍3.3GB。你可以可以使用-w-h指定你的照片的尺寸,更多选项参考

定时拍摄任务

  如果你想每天的8点拍摄一张照片的吧,使用定时任务是个不错的选择,首先新建一个脚本:nano camera.sh,输入:

#!/bin/bash
DATE=$(date +"%Y-%m-%d_%H%M")
raspistill -vf -hf -o /home/pi/camera/$DATE.jpg

  这个脚本拍摄照片并且命名为拍摄的日期,保存之后修改下该脚本的执行权限:chmod +x camera.sh。再使用crontab命令:crontab -e,这个命令是用于设置周期性被执行的指令。在里面写入:

* * * * * /home/pi/camera.sh 2>&1

  这个命令代表每分钟执行camera.sh这个脚本一次,cronta命令的格式可以参考这里。保存之后该脚本就会每分钟执行一次了。
  除了拍摄照片之外,还有一些其他的命令如raspivid用于拍摄视频等其他功能。

照片压缩视频

  当你拍摄了一天,发现你的文件夹里面全是图片,是不是会想到把这些图片压缩成视频也是个不错的选择,这时候我们需要mencoder的帮助了。
  首先在cd到存放照片的文件夹,执行ls *.jpg > stills.txt将所有的jpg图片名称重定位到stills.txt中,然后安装mencoder:sudo apt-get install mencoder,安装完成之后执行命令:

mencoder -nosound -ovc lavc -lavcopts vcodec=mpeg4:aspect=16/9:vbitrate=8000000 -vf scale=1920:1080 -o timelapse.avi -mf type=jpeg:fps=24 mf://@stills.txt

  完成之后你就会发现当前文件下多出了timelapse.avi文件,这就是图片压缩成的视频。PS:如果发现在树莓派上压缩比较慢的话,可以放在你的PC上执行

图片上传七牛

  你的树莓派在运行了一段时间之后可能SD卡就满了,可是你还想继续拍照存储怎么办,一种方法就是换张SD卡继续,当然你也可以将图片存到网盘上,这样你就可以将本地的图片删了留出空间了。
  网盘我用了七牛,因为这个博客上的图片也全部托管在上面,很好用。查看七牛的开发文档觉得是可以实现的,语言使用python,最新的七牛SDK是7.0.0(截止2014.11.17),不需要对它的机制了解很深刻,我们只需要用它的接口就可以了。

安装七牛SDK

  使用之前需要安装七牛的SDK,可以使用pip install qiniueasy_install qiniu安装,也可以从github上下载源码安装:

tar xvzf python-sdk-$VERSION.tar.gz
cd python-sdk-$VERSION
python setup.py install

  在安装时可能会需要缺少request.auth包的错误:
缺少request.auth包   你可以在github上下载安装下,然后再执行python setup.py install命令就可以了:

git clone git://github.com/kennethreitz/requests.git
python setup.py install

获得AccessKey 和 SecretKey

  在使用SDK需要拥有一对有效的 AccessKey 和 SecretKey 用来进行签名授权。这两个key如何获得呢?1:开通七牛开发者帐号 2:登录七牛开发者自助平台,查看 Access Key 和 Secret Key

上传图片

  都准备好了之后就可以编写程序了,指的注意的是七牛SDK7.0.0版本和之前的版本相差蛮大的,许多包的名字都改了,如果你发现你找的网上的程序发现包不能导入,可能就是使用SDK版本的问题,我这里使用的是的7.0.0。因为没找到七牛相关的包的说明,就参考七牛给出的test将所有的包全部导入了,程序如下,实现的是完成当前文件夹中123.png文件上传到指定的空间中:

from qiniu import Auth, set_default, etag, PersistentFop, build_op, op_save
from qiniu import put_data, put_file, put_stream
from qiniu import BucketManager, build_batch_copy, build_batch_rename, build_batch_move, build_batch_stat, build_batch_delete
from qiniu import urlsafe_base64_encode, urlsafe_base64_decode
from qiniu.compat import is_py2, b
from qiniu.services.storage.uploader import _form_put
import qiniu.config

#将<access_key>和<secret_key>改成你自己的,bucket_name是你想要上传到哪一个空间,没有可以自己创建,都是字符串格式
access_key = <access_key>
secret_key = <secret_key>
bucket_name = <bucket_name>
#文件类型是jpeg图片,也可以是其他类型
mime_type = "image/jpeg"
params = {'x:a': 'a'}
q = Auth(access_key, secret_key)
#文件的位置,根据你自己的文件位置填写
localfile = "123.png"
#上传之后的文件名
key = 'test_file'

token = q.upload_token(bucket_name, key)
ret, info = put_file(token, key, localfile, mime_type=mime_type, check_crc=True)
print(info)
assert ret['key'] == key
assert ret['hash'] == etag(localfile)

  最基本的功能已经完成了,剩下的就是实现你想要完成的功能了!