ラズパイで定点観測
この記事ではRaspberry Pi(ラズパイ)でカメラモジュールを使えるようにする設定と、そのカメラを使って一定時間置きに写真撮影をし、それを動画にするまでの方法を説明していく。
定点カメラの機能はスマホにも付いていて、iPhoneでは「タイムラプス」、Androidでは「コマ抜き」の低速度撮影の機能にあたる。今回使用したラズパイは Raspberry Pi3 Model B+ となる。操作はMacのターミナルからSSHでログインして行った。
ラズパイの初期設定はこちらの記事を参考に
Raspberry Piでカメラモジュールを使えるようにする設定
まずは、Raspberry Piでカメラモジュールを使えるようにしていこう。今回使用するカメラモジュールはこちらの OV5647 カメラモジュール である。わずか1000円以下で買うことができた。
OV5647 Camera Module センサータイプ:OV5647色CMOS QSXGA(5メガピクセル) センサーサイズ:3.67*2.74mm(1/4インチフォーマット) ピクセル計算:2592*1944, ピクセルサイズ:1.4*1.4μm
Amazon用途によってはケースに入った製品の方が使い勝手がよいかもしれない。
[Raspberry Pi 4 model b, 3 Model b+, Pi 3b, Pi Zero, Pi Zero Wireless]に適用 固定焦点レンズにOV5647ウェブカメラセンサーを搭載した5メガピクセルセンサー このカメラは、2592 x 1944ピクセルの静止画像に対応しており、1080 p / 30 fps、720 p / 60 fps、および640 x 480 p 60/90のビデオ録画もサポートしています
AmazonRaspberry Piのrootログインを設定しておく
カメラを設定する上で、Raspberry Piのrootになる必要がるので先に設定しておこう。初期状態のRaspberry Piはrootにパスワードが設定されていないため、デフォルトではrootにログインできないのだ。次のコマンドでrootユーザーにパスワードを設定しておく。
$ sudo passwd root
パスワード設定を解除したかったら、次のコマンドで戻すことができる。
$ sudo passwd -l root
カメラを認識させる
それではいよいよカメラをRaspberry Piに認識させてみよう。Raspberry Piにカメラモジュールを接続したら次の手順で設定を行っていく。
$ sudo raspi-config で 5 Interfacing Options → P1 Camera へと進み Yes を選択してカメラを有効にする。再起動後、$ vcgencmd get_camera で supported=1 detected=1 と表示されればカメラモジュールは認識されている。
カメラで画像を撮影してみる
カメラモジュールをRaspberry Piに認識させることができたら、実際に画像を撮影してみよう。撮影を可能にするプログラムは、OS(Raspbian)にすでに標準でインストールされている。raspistillコマンドを使って撮影できるようになっているはずだ。たとえば次のコマンドを実行してみよう。
$ raspistill -o photo.jpg
photo.jpgの名前で画像ファイルが保存され、カメラに写っている景色が撮れたと思う。ところでRaspberry Piにモニターをつけてない場合がある。その場合は、たとえばMacのターミナルから scp コマンドを使って、Raspberry Piにある画像ファイルをダウンロードして確認しよう。
$ scp pi@0.local:~/photo.jpg .
画像ファイルに日付を追加する方法
Raspberry Piのカメラで撮影する場合、いつ撮影した写真なのかをファイル名に残せたら便利だ。そこでRaspberry Piの時刻を自動で合わせられるようにしていこう。
Raspberry Piの時刻設定
時刻を手動で合わせてもRaspberry Piにはハードウェア時計が装備されていないため、いくら設定しても再起動するたびに時間はズレてしまう。だからRaspberry Piの起動時にネット接続して、自動で時刻を合わせられるようにしておく。
$ sudo vi /etc/rc.local の exit 0 より前の行に timedatectl set-timezone Asia/Tokyo の一行を追記し、Raspberry Piを再起動する。これで時刻を自動で合わせてくれるようになった。次のようにして、時間が正しいか確認しよう。
$ date
Tue Aug 4 09:12:40 JST 2020`
ファイル名に日付を追加
Raspberry Piに時刻の設定ができたところで、ファイル名に日付を入れる方法を紹介する。次のコマンドを実行すると、20200804_092756.jpg のように日付入りでファイルを保存できる。
$ raspistill -o `date "+%Y%m%d_%H%M%S"`.jpg
ファイルサイズ(画質)の変更
raspistill で撮影した写真は、デフォルトではファイルサイズが数MBあり大きすぎる。画像サイズを小さくすることでファイルサイズを抑えることができる。2.4MBもあった写真が119kBまで圧縮できた。
$ raspistill -w 480 -h 360 -o `date "+%Y%m%d_%H%M%S"`.jpg
Macから写真撮影してプレビューする
写真撮影のたび、毎回Raspberry Piにsshでログインして撮影し、scpでファイルをダウンロードして確認するのはあまりに面倒。そこでMac側の操作一発で写真撮影から写真表示までできるシェルスクリプトを書いてみたので参考に。
#!/bin/bash
# Created by Toshihiko Arai.
# https://101010.fun/iot/raspberry-pi-camera.html
HOST='pi@0.local'
DIR='photo'
FILE=`date "+%Y%m%d_%H%M%S"`.jpg
ssh ${HOST} "raspistill -w 960 -h 720 -co 20 -awb shade -ex auto -o ${DIR}/${FILE} ; exit"
scp ${HOST}:${DIR}/${FILE} ${DIR}/
ssh ${HOST} "rm -f ${DIR}/${FILE}"
open ${DIR}/${FILE}
さらにディレクトリも自動生成できると便利だが、それは皆さんに任せよう。
Raspberry Piでコマ撮り撮影する
写真の撮影に慣れたところで、いよいよコマ撮り撮影、タイムラプスをやってみよう。ありがたいことに raspistill コマンドにはすでにタイムラプスのオプションが装備されているので、それでコマ撮り撮影が可能だ。次のようにしてコマ撮り撮影する。
$ raspistill -t 30000 -tl 2000 -o photo/image%04d.jpg
上のコマンドの意味は、2秒おきに30秒間だけ写真を撮る命令である。-t と -tl にはミリ秒で指定してあげる。ちなみに1時間は3600秒、24時間だと86400秒。秒をミリ秒に変換したい場合は1000をかければ良い。
SSHがログアウトしてもプログラムを継続実行させる
さて、長時間のコマ撮り撮影の場合、Raspberry PiとのSSH接続からログアウトしてしまう可能性があるだろう。通常SSHでログインしてシェルを実行すると、ログアウトした時にそのシェルは停止してしまうのだ。
そこで、nohupコマンドを使うことで、ログアウトしてもシェルを実行し続けるようにする。nohup もまたOSに標準で実装されているのでインストールの必要はないはずだ。次の形で実行する。
$ nohup raspistill -t 86400000 -tl 30000 -w 960 -h 720 -co 20 -awb shade -ex auto -o tomato/image%04d.jpg > tomato/out.log &
上のシェルは、30秒おきに1日撮影する設定で、色合の調整などのオプションも足している。コマンドの最後の & はバックグラウンドで実行することを意味する。nohup を使えば自由にSSHをログアウトできるので、再度ログインしてさきほどのシェルが継続しているか $ ps x などで確認してみよう。
ちなみに、nohup で実行中のシェルを止めたい時は、 $ ps x でプロセスIDを調べてその番号を kill すればよい。
$ ps x
PID TTY STAT TIME COMMAND
1202 ? Ss 0:00 /lib/systemd/systemd --user
1205 ? S 0:00 (sd-pam)
1418 ? Sl 0:00 raspistill -t 86400000 -tl 30000 -w 960 -h 720 -co 20
1464 ? S 0:00 sshd: pi@pts/0
1467 pts/0 Ss 0:00 -bash
1479 pts/0 R+ 0:00 ps x
$ kill 1418
コマ撮り写真をつなげて動画にする(avconv)
最後に撮影したコマ撮り写真をつなげて動画にしてみよう。写真をつなげて動画にするには avconv が便利だ。avconvは標準ではインストールされていないので、次のようにしてインストールしておこう。もしインストールに失敗するようだったら$ sudo apt updateを一度実行してから再度試すとうまくいくかもしれない。
$ sudo apt install libav-tools
次のコマンドのようにして、撮影した写真をつなげて動画の作成ができる。
$ avconv -r 30 -i tomato/image%04d.jpg -vcodec libx264 -vf scale=960:720 tomato/timelapse.mp4
Raspberry Piで定点観測してみた
いざ定点観測しようと思ったが、カメラの位置調整で日が暮れそうな時間までかかってしまった。カメラを使う場合は、Raspberry Piにモニターがないと不便かもしれない。
さて、こちらが実際にベランダで定点観測してみた画像だ。このカメラモジュールどうもフィルムカメラっぽい色合いになる。映像に面白みはないかもしれないが、とりあえずタムラプス動画には成功した。
動画をGIFアニメにする方法はこちらを参考に
この記事で扱った関連製品はこちら
OV5647 Camera Module センサータイプ:OV5647色CMOS QSXGA(5メガピクセル) センサーサイズ:3.67*2.74mm(1/4インチフォーマット) ピクセル計算:2592*1944, ピクセルサイズ:1.4*1.4μm
Amazon[Raspberry Pi 4 model b, 3 Model b+, Pi 3b, Pi Zero, Pi Zero Wireless]に適用 固定焦点レンズにOV5647ウェブカメラセンサーを搭載した5メガピクセルセンサー このカメラは、2592 x 1944ピクセルの静止画像に対応しており、1080 p / 30 fps、720 p / 60 fps、および640 x 480 p 60/90のビデオ録画もサポートしています
AmazonRaspberry Piの参考書
本書は、全世界で多くのユーザーの支持を集めているマイコンボード「Raspberry Pi」を使いこなすためのレシピ集です。ハードウェアの基本、オペレーティングシステムの使い方、ネットワーク接続、Pythonプログラミングの基本を紹介した上デ、実際の作品製作に必要になる、高度なPythonプログラミング、GPIO(汎用入出力)、モーター、センサー、ディスプレイなどの使い方へと解説を進めていきます。
Amazonraspistillのオプション
最後に、raspistill には記事では紹介できなかった機能がたくさんあるので、ヘルプを表示して確認しておくと良いだろう。
$ raspistill --help
parameter | mean |
---|---|
-w | Set image width <size> |
-h | Set image height <size> |
-q | Set jpeg quality 0 to <100> |
-r | Add raw bayer data to jpeg metadata |
-o | Output filename <filename> (to write to stdout, use '-o -'). If not specified, no file is saved |
-l | Link latest complete image to filename <filename> |
-v | Output verbose information during run |
-t | Time (in ms) before takes picture and shuts down (if not specified, set to 5s) |
-th | Set thumbnail parameters (x:y:quality) or none |
-d | Run a demo mode (cycle through range of camera options, no capture) |
-e | Encoding to use for output file (jpg, bmp, gif, png) |
-x | EXIF tag to apply to captures (format as 'key=value') or none |
-tl | Timelapse mode. Takes a picture every |
-fp | Run the preview using the still capture resolution (may reduce preview fps) |
-k | Wait between captures for a ENTER, X then ENTER to exit |
-s | Wait between captures for a SIGUSR1 or SIGUSR2 from another process |
-g | Draw preview to texture instead of using video render component |
-gc | Capture the GL frame-buffer instead of the camera image |
-set | Retrieve camera settings and write to stdout |
-cs | Select camera |
-bm | Enable 'burst capture mode' |
-md | Force sensor mode. 0=auto. See docs for other modes available |
-dt | Replace output pattern (%d) with DateTime (MonthDayHourMinSec) |
-ts | Replace output pattern (%d) with unix timestamp (seconds since 1970) |
-fs | Starting frame number in output pattern(%d) |
-rs | JPEG Restart interval (default of 0 for none) |
-gps | Apply real-time GPS information from gpsd as EXIF tags (requires libgps.so.22) |
-sh | Set image sharpness (-100 to 100) |
-co | Set image contrast (-100 to 100) |
-br | Set image brightness (0 to 100) |
-sa | Set image saturation (-100 to 100) |
-ISO | Set capture ISO |
-vs | Turn on video stabilisation |
-ev | Set EV compensation - steps of 1/6 stop |
-ex | Set exposure mode (see Notes) |
-fli | Set flicker avoid mode (see Notes) |
-awb | Set AWB mode (see Notes) |
-ifx | Set image effect (see Notes) |
-cfx | Set colour effect (U:V) |
-mm | Set metering mode (see Notes) |
-rot | Set image rotation (0-359) |
-hf | Set horizontal flip |
-vf | Set vertical flip |
-roi | Set region of interest (x,y,w,d as normalised coordinates [0.0-1.0]) |
-ss | Set shutter speed in microseconds |
-awbg | Set AWB gains - AWB mode must be off |
-drc | Set DRC Level (see Notes) |
-st | Force recomputation of statistics on stills capture pass |
-a | Enable/Set annotate flags or text |
-3d | Select stereoscopic mode |
-dec | Half width/height of stereo image |
-3dswap | Swap camera order for stereoscopic |
-ae | Set extra annotation parameters (text size, text colour(hex YUV), bg colour(hex YUV), justify, x, y) |
-ag | Set the analog gain (floating point) |
-dg | Set the digital gain (floating point) |
Amazonでお得に購入するなら、Amazonギフト券がオススメ!
コンビニ・ATM・ネットバンキングで¥5,000以上チャージすると、プライム会員は最大2.5%ポイント、通常会員は最大2%ポイントがもらえます!
Amazonギフト券