読者です 読者をやめる 読者になる 読者になる

ami_GS's diary

情報系大学院生の備忘録。ネットワークの勉強にハマっています。

Raspberry PiのカメラモジュールをPythonで動かした

Python shell script Raspberry Pi

ついにカメラモジュールを買ったぞおおおおおおおおおお!!!!!!!!!!
f:id:ami_GS:20140311220924j:plain

というわけで、色々遊んでみた成果をつらつらと書いていこうかと。


シェルから動かす

画像

まずは1枚の画像(.jpeg)を取る方法。以下の方法ではimage.jpgがカレントディレクトリに保存されます。

raspistill -o image.jpg
動画

動画(H246形式)を取る方法。以下の方法では10秒間の動画を取ります。

raspivid -o video.h264 -t 10000

tオプションがなければデフォルトで5秒の動画を取ることができます。




Pythonで動かす

シェルで動かすのつまらなくね!?


本題です。

  • RPiで写真、動画撮ってもディスプレイが無いとすぐに見れなくてつまらん!!
  • どうせならPythonで制御して別PCから見れたら面白そう。

と思ったので書いてみた。
使うものは
PiCamera Documentation for picamera — Picamera 1.2 documentation
という専用モジュール。ドキュメント英語だけど簡単なので読んでみると良いかも。


さすがPythonとRPiといった所か、ちゃんと用意してある素晴らしさである。

画像

一枚の画像であれば以下のようにすればOK

import time
import picamera

with picamera.PiCamera() as camera:
    camera.resolution = (1024, 768)
    camera.start_preview()
    time.sleep(2) #カメラ初期化
    camera.capture('foo.jpg')
動画

ストリーミングは以下の様にすると撮れます。 (2014 3/14 コード訂正)

import time
import picamera
import io

camera = picamera.PiCamera()
camera.resolution = (1024, 768)
time.sleep(2) #カメラ初期化
stream = io.BytesIO()

for foo in camera.capture_continuous(stream, "jpeg", use_video_port=True):
    stream.seek(0)
    frame = stream.getvalue() #これで1フレーム取り出せる
    stream.seek(0)
    stream.truncate()


あとは取り出したフレームをUDPなりWebSocketで他端末に送ると簡単に見れるよ!
っていう話でした。

この書き方より更に速く動作する書き方がドキュメントに書いてあるけども、トリッキーすぎて理解が追いつかない上にコードが長いのでこちらをおすすめします。

小ネタ

解像度設定

camera.resolution = (2592, 1944) #最大


fpsを設定する(上限30fps)
RPi自体が遅いので、色々処理したいのであればfps下げたほうがいいかもしれない。

camera.framerate = 10


カメラのLEDのオンオフ

camera.led = True #オン

最後に

TornadoのWebSocketを使って、このブログに載せる用のデモプログラムを書いたのだけれど、うまく動かないので次の機会に・・・・
趣味で書いたものは動いたけれど、その機能をそぎ落として書きなおしてみたら動かないこと動かないこと。

2014/4/9
書きました