Raspberry Piでカメラモジュールの使い方【コマ抜き撮影】
Raspberry Pi(以下ラズパイ)でカメラモジュールをつかう方法を解説します。Raspberry Piでカメラを認識させるための設定方法は簡単です。またここでは、一定間隔で写真撮影するコマ抜き撮影(タイムラプス)の方法もご紹介いたします。
Raspberry Piの設定は、MacからSSHでログインしてCUIでの遠隔操作で行います。
▼ Raspberry Piの初期設定はこちらの記事を参考に済ませてください。
つかうもの
はじめに、この記事でつかうものをご紹介いたします。
ラズパイ
Raspberry Piは、Raspberry Pi 3B+を使用しましたが、お好きなRaspberry Piで構いません。
カメラモジュール
こちらのカメラモジュールを使用しました。 OV5647 カメラモジュール は、Raspberry Piの基板にあるカメラ端子へ直接つなぐことができます。1000円程度のお値段ですので、お試しにはちょうど良いカメラです。
ズーム機能付だったり、赤外線で夜間も撮影できる高機能なカメラモジュールもあります。
ヒートシンク
動画など重い処理をRaspberry Piで行う場合、CPUが発熱して本体が壊れてしまう可能性があります。必ずヒートシンクや放熱性のあるケースに入れて熱対策をしましょう(私は放熱対策せず、過去にRaspberry Piを壊してしまったことがありますのでご注意ください)。
Raspberry Piでカメラモジュールの設定
それではRaspberry Piでカメラモジュールを使えるように設定していきましょう。
▼ USBカメラの扱いについてはこちら。
rootログインを設定しておく
Raspberry Piでカメラを認識させる上で、ターミナル操作でroot権限になる必要があります。初期状態のRaspberry Piでは、rootにパスワードが設定されていないため、次のコマンドでrootユーザーにパスワード設定をします。
$ sudo passwd root
パスワード設定を解除する場合は次の通りです。
$ sudo passwd -l root
カメラを認識させる
Raspberry Piにカメラモジュールを接続して、次の作業を行なってください。
$ sudo raspi-config
表示されたダイアログの 5 Interfacing Options → P1 Camera へと進み Yes を選択してカメラを有効にします。Raspberry Piを再起動してください。
次のコマンドを実行して supported=1 detected=1 と表示されれば、カメラモジュールが正常に認識できてることになります。
$ vcgencmd get_camera
これで準備が整いました。次からは実際にカメラで撮影してみましょう。
ラズパイカメラで写真の撮影
写真撮影は標準でインストールされている raspistill コマンドを使って簡単にできます。たとえば次のコマンドを実行してみましょう。
$ raspistill -o photo.jpg
photo.jpgの名前で画像ファイルが保存されましたね。カメラの映像が写真に写っているはずです。
Raspberry Piのカメラで撮影する場合、いつ撮影した写真なのかをファイル名に残せたら便利ですね。そこでRaspberry Piの時刻を設定します。
Raspberry Piで時刻の自動設定
実は、Raspberry Piにはハードウェア時計(RTC)が備わっていないため、時刻を手動で合わせても再起動するたびに時間がズレてしまうなんてことがあります。ですからRaspberry Piの起動時にネット接続して、自動で時刻を合わせられるようにしておきましょう。
設定ファイルをVimで開きます。
$ sudo vi /etc/rc.local
$ date
Tue Aug 4 09:12:40 JST 2020`
ファイル名に日付を追加
ファイル名に日付を入れる方法です。次のようにインラインでシェルの実行結果を返すようにすると、20200804_092756.jpg のような日付入りファイル名で写真を保存できます。
$ raspistill -o `date "+%Y%m%d_%H%M%S"`.jpg
ファイルサイズ(画質)の変更
raspistill のデフォルトでは、ファイルサイズが数MBもあり大きすます。画像サイズ指定して保存するには次のようにコマンドを実行します。$ raspistill -w 480 -h 360 -o `date "+%Y%m%d_%H%M%S"`.jpg
2.4MBもあった写真が119kBまで圧縮できました。
raspistill にはたくさんのオブション機能があるので、ヘルプを表示して確認しておきましょう。$ raspistill --help
写真撮影してプレビューする
ところでRaspberry Piにモニターをつけてない場合、写真を確認する方法としてscp コマンドを使いました。たとえば次のコマンドは、Raspberry Piにあるファイルを、カレントディレクトリへダウンロードします。
$ scp pi@0.local:~/photo.jpg .
写真確認の一連の動作を、シェルスクリプトにしてしまうともっとラクです。たとえば次のような感じです。
#!/bin/bash
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}
VS Codeを使っている方ならリモートSSHが便利です。
コマ抜き撮影の方法
ここではコマ抜き撮影(タイムラプス)をやってみます。raspistill コマンドでは、すでにタイムラプスのオプションが装備されているのでそれを使います。次はコマ抜き撮影の例です:
$ raspistill -t 30000 -tl 2000 -o photo/image%04d.jpg
オプション -t で全体の時間制限(ms)を、オプション -tl で撮影する間隔(ms)を指定します。つまり上のコマンドは、2秒おきに30秒間、写真撮影する意味になります。
photoディレクトリに、連番で写真が保存されてます。これでコマ抜き撮影ができました。
もちろん24時間の長時間撮影もディスク容量が許す限り可能です。
$ raspistill -t 86400000 -tl 30000 -w 960 -h 720 -co 20 -awb shade -ex auto -o tomato/image%04d.jpg
このコマンドは、30秒おきに1日(24時間は、86400 x 1000 ms)撮影する命令になります。色合の調整などのオプションも足してます。
ただし、長時間のコマ抜き撮影の場合、SSHをログアウトしてしまう場合もあるでしょう。ログアウトしたと同時に、実行したシェルコマンド(プロセス)も停止してしまうはずです。
SSHをログアウトしてもプログラムを継続するには?
そこで、SSHをログアウトしてもプログラムを継続するには nohup コマンドを使います。たとえば、次のとおりです。
$ nohup raspistill -t 86400000 -tl 30000 -w 960 -h 720 -co 20 -awb shade -ex auto -o tomato/image%04d.jpg > tomato/out.log &
$ 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 をインストールします。
$ sudo apt install libav-tools
インストールに失敗するようでしたら $ sudo apt update を一度実行してから再度試してください。
次は、複数の写真をつなげて動画を作成する例です:
$ avconv -r 30 -i tomato/image%04d.jpg -vcodec libx264 -vf scale=960:720 tomato/timelapse.mp4
実際にベランダで定点観測して、コマ抜き動画を作ってみました。1000円のカメラモジュールなので画質は期待できませんでしたが、思ったより簡単にRaspberry Piでカメラを扱うことができてよかったです。
▼ 動画をGIFアニメにする方法はこちら。
▼ 他にも映像関係の記事を書いてます。