ラズパイとカメラモジュールでタイムラプス

ラズパイとカメラモジュールを使って定点観測する方法

この記事ではRaspberry Pi(ラズパイ)でカメラモジュールを使えるようにする設定と、そのカメラを使って一定時間置きに写真撮影をし、それを動画にするまでの方法を説明していく。

HiLetgo OV5647 5MP Raspberry Pi  カメラ OV5647 HDカメラモジュール
HiLetgo OV5647 5MP Raspberry Pi カメラ OV5647 HDカメラモジュール
Amazon

はじめに

定点カメラの機能はスマホにも付いていて、iPhoneでは「タイムラプス」、Androidでは「コマ抜き」の低速度撮影の機能にあたる。今回使用したラズパイは Raspberry Pi3 Model B+ となる。操作はMacのターミナルからSSHでログインして行った。

ラズパイの初期設定はこちらの記事を参考に

Raspberry Piでカメラモジュールを使えるようにする設定

まずは、Raspberry Piでカメラモジュールを使えるようにしていこう。今回使用するカメラモジュールはこちらの OV5647 カメラモジュール である。わずか1000円以下で買うことができる。

HiLetgo OV5647 5MP Raspberry Pi  カメラ OV5647 HDカメラモジュール
HiLetgo OV5647 5MP Raspberry Pi カメラ OV5647 HDカメラモジュール
Amazon

用途によってはケースに入った製品の方が使い勝手がよいかもしれない。

For raspberry pi カメラモジュール 5MP 感光チップOV5647センサー
For raspberry pi カメラモジュール 5MP 感光チップOV5647センサー
Amazon

また、ズーム機能付だったり、赤外線で夜間も撮影できるカメラモジュールもある。

Kuman カメラモジュール Raspberry Pi用 日中/夜間モード ズームレンズ
Kuman カメラモジュール Raspberry Pi用 日中/夜間モード ズームレンズ
Amazon
Kuman カメラモジュール Raspberry Pi用 夜間 赤外線可視 ラズベリーパイ
Kuman カメラモジュール Raspberry Pi用 夜間 赤外線可視 ラズベリーパイ
Amazon

動画など重い処理をラズパイで行う場合、CPUが発熱して本体が壊れる恐れがある。ヒートシンクや放熱性のあるケースに入れて必ず熱対策をしよう。

過去にラズパイを壊してしまったことがある。

Geekworm Raspberry Pi4 B 用アーマー金属ケース パッシブ冷却/シェル熱放散(ファン無し)
Geekworm Raspberry Pi4 B 用アーマー金属ケース パッシブ冷却/シェル熱放散(ファン無し)
Amazon
最新 Raspberry Pi 4 ケース, 超薄型アルミニウム合金ケース+ヒートシンク+ 35x35x10 冷却大超静音ファン
最新 Raspberry Pi 4 ケース, 超薄型アルミニウム合金ケース+ヒートシンク+ 35x35x10 冷却大超静音ファン
Amazon

Raspberry Piのrootログインを設定しておく

カメラを設定する上で、Raspberry Piのrootになる必要がるので先に設定しておこう。初期状態のRaspberry Piはrootにパスワードが設定されていないため、デフォルトではrootにログインできないのだ。次のコマンドでrootユーザーにパスワードを設定しておく。

$ sudo passwd root

パスワード設定を解除したかったら、次のコマンドで戻すことができる。

$ sudo passwd -l root

カメラを認識させる

それではいよいよカメラをRaspberry Piに認識させてみよう。Raspberry Piにカメラモジュールを接続したら次の手順で設定を行っていく。

$ sudo raspi-config5 Interfacing OptionsP1 Camera へと進み Yes を選択してカメラを有効にする。再起動後、$ vcgencmd get_camerasupported=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.localexit 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で定点観測中
Raspberry Piで定点観測中

いざ定点観測しようと思ったが、カメラの位置調整で日が暮れそうな時間までかかってしまった。カメラを使う場合は、Raspberry Piにモニターがないと不便かもしれない。

さて、こちらが実際にベランダで定点観測してみた画像だ。このカメラモジュールどうもフィルムカメラっぽい色合いになる。映像に面白みはないかもしれないが、とりあえずタムラプス動画には成功した。

ラズパイで空の定点観測
ラズパイで空の定点観測

動画をGIFアニメにする方法はこちらを参考に

この記事で扱った関連製品はこちら

HiLetgo OV5647 5MP Raspberry Pi  カメラ OV5647 HDカメラモジュール
HiLetgo OV5647 5MP Raspberry Pi カメラ OV5647 HDカメラモジュール
Amazon
For raspberry pi カメラモジュール 5MP 感光チップOV5647センサー
For raspberry pi カメラモジュール 5MP 感光チップOV5647センサー
Amazon

人気のラズパイ

Raspberry Pi 4 Model B 8GB 技適マーク入 正規品!ラズベリーパイ4 モデルB
Raspberry Pi 4 Model B 8GB 技適マーク入 正規品!ラズベリーパイ4 モデルB
Amazon
TRASKIT Raspberry Pi 4 Model B Starter Kit
TRASKIT Raspberry Pi 4 Model B Starter Kit
Amazon
Raspberry Pi Zero W - ヘッダー ハンダ付け済み
Raspberry Pi Zero W - ヘッダー ハンダ付け済み
Amazon

人気のラズパイ周辺機器

10 インチRaspberry Pi用タッチモニター EleDuino HDMI モバイルディスプレイ
10 インチRaspberry Pi用タッチモニター EleDuino HDMI モバイルディスプレイ
Amazon
Raspberry Pi4 Model B /アルミニウム金属ケース/ファンレス/放熱シート付き
Raspberry Pi4 Model B /アルミニウム金属ケース/ファンレス/放熱シート付き
Amazon
Freenove Raspberry Pi 4 B 3 B+ 400用の究極のスターターキット
Freenove Raspberry Pi 4 B 3 B+ 400用の究極のスターターキット
Amazon
KEYESTUDIO DC 5V 4チャンネル リレーシールドモジュール 拡張ボード for Raspberry Pi
KEYESTUDIO DC 5V 4チャンネル リレーシールドモジュール 拡張ボード for Raspberry Pi
Amazon

Raspberry Piのオススメ入門書

Raspberry Piクックブック 第3版 (Make:PROJECTS)
Raspberry Piクックブック 第3版 (Make:PROJECTS)
Amazon
これ1冊でできる! ラズベリー・パイ 超入門 改訂第6版 Raspberry Pi 4/Zero W対応
これ1冊でできる! ラズベリー・パイ 超入門 改訂第6版 Raspberry Pi 4/Zero W対応
KindleAmazon
写真や図解でよくわかる ラズパイZeroを使い倒す本 Raspberry Pi Zero W対応
写真や図解でよくわかる ラズパイZeroを使い倒す本 Raspberry Pi Zero W対応
KindleAmazon

raspistillのオプション

最後に、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 ms. %d == frame number (Try: -o img_%04d.jpg)
-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 . Default 0
-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)
記事に関するご質問などがあれば、ぜひTwitterへお返事ください。