前置き
メリークリスマス。
現在進行形でストーカー被害に遭っています。
警察に相談して、警察の方からも直接ストーカー相手に厳重注意して頂いたのですが相手方は反省していないようで。
家の前を通るのもダメって警察から注意を受けたにも関わらず通る気満々のようなので、それなら監視カメラでも作るか~と思ってラズパイ(Raspberry Pi 4 Model B)とwebカメラ(ロジクール ウェブカメラ C270)を購入して監視カメラを作り始めました。実際怖い。本当に怖い。
当記事はその作業手順の備忘録になります。
もし私と同様にストーカー被害に遭って『ラズパイ+webカメラで監視カメラを作成したい!』という思考に至り、結果的にこの記事にたどり着いてしまったLinux初心者の方にも伝わるように、なるべく分かりやすい記事を書けたらと思います~~(そういう方はまず警察に相談しましょう)~~~~(可能なら早急に引っ越ししましょう)~~~~(というか自作じゃなくても普通に高性能な監視カメラを買った方が良い気がs)~~。
当記事では、ラズパイ+webカメラで動体検知&静止画や動画を撮影、さらに撮影したものは定期的にGmailで自分宛てに送信するシステムの作成手順を取り上げます。
準備するもの
上2つ(ラズパイ+webカメラ)で2万円くらいでした。
- Raspberry Pi 4 Model B
- Amazonでこちらを購入
- MicroSDカード(32GB)、電源アダプター、MicroHDMI-to-HDMIケーブルなど必要なものが一式揃っていて良きです
- ロジクール ウェブカメラ C270
- Amazonでこちらを購入
- 新品を買ったと思ったら中古の物が届いてビックリしましたがとりあえず動いたので良しとします
- モニタ、キーボード、マウス
- ラズパイに使う用。カメラがちゃんと動いているか、静止画や動画が撮れてるかの確認に使用
- 他、普通にラズパイのターミナルで作業したい場合に使用
- 作業用PC (Windows10)
- ラズパイにOSを入れるために必要。ラズパイに入れるOSはこの作業用PCでダウンロードして、SDカードを通してラズパイに持っていきます (詳細は後述)
- 他、作業用PCからSSHでラズパイを操作する場合に使用。この用途がメイン。いちいち作業用PCとラズパイとで作業する手と目を反復横跳びするは面倒なので
そもそも自作する必要ある?
ありません。
この疑問を持った方は普通に監視カメラを買うことをお勧めします。
2万円出さずとも、より安価で良いものはたくさんあります。
この記事で取り上げる自作監視カメラよりも高画質で撮影してくれたり、さらにスマホに情報を送る機能があったり、高精度な動体検知のみならず熱感知、顔認識まで……Amazonでざっと調べただけでも色々ありますね。書いてて悲しくなってきました。
私が自作しようと思ったのは、ただ純粋にラズパイを触ってみたかったというのがあります。純粋にお遊び&お勉強ですね。
ラズパイは普通に色々な使い道があるので、今回は監視カメラですが他の用途でも使ってみたいなと思っています。
次回の記事では、このラズパイをwebサーバにしてwebページ作る手順の備忘録でも書こうかなとふんわり考えています。
あとは、幸か不幸かストーカー相手の顔写真もたくさんあるので、機械学習でストーカー相手を学習させたモデルを使って、もし現れたらアラートで知らせる……みたいなのも(蛇足ですが)できたら面白そう……と思っていましたが、監視カメラを置く場所・距離の都合上、多分顔認識までは厳しそう……となっています。
……猫が近くをどれくらい歩いたかとか、猫の様子とその日の天気や気温の相関を可視化とかできたら面白いかもしれない……(※思い付きで適当に書いています)。
つまりラズパイを使うメリットは、監視カメラの用途であってもそうでなくても、自分のやりたいように様々な機能を持たせることができること、ですね。
作業手順
作業手順は下記の通りです。
ラズパイの組み立てやOSインストールに関してはほぼ丸々参考にしたサイトや動画の手順通りに行ったので、そちらの紹介をして詳細は割愛します。
目次
- 1. ラズパイの組み立て
- 2. OSインストール
-
3. motionのインストール、設定
- 撮影に必要なソフト
motion
のインストール、設定を行います
- 撮影に必要なソフト
-
4. sSMTPのインストール、設定
- メール送信に必要なソフト
sSMTP
のインストール、設定を行います
- メール送信に必要なソフト
-
5. メール送信機能の実装
- 撮影したものを数時間おきに自動でメールに添付して送信する機能を実装します
1. ラズパイの組み立て
左半分の段ボール箱にラズパイ一式が入っています。
中央右側のプチプチに入っているのがwebカメラです。中古です。
右側のUSBメモリみたいなものは念のため買っておいた無線LAN子機ですが、ラズパイ4に搭載されている無線LANが問題なく使えそうなので、今回こちらの出番はなさそうです。箱は初対面時から潰れていました。
組み立てはこちらの動画を参考にしました。↓
上記の動画を参考に、ヒートシンクやファン等を一通り付けた実物がこんな感じです。↓
上の蓋をパカッと被せれば組み立ては終了です。
2. OSインストール
こちらの記事を参考にインストールしました。
そもそもラズパイって何?という部分から丁寧に解説されていて、作業手順の解説も分かりやすくて大変良い記事です。
私の作業用PCも記事先と同じでWindowsなので、Raspberry Pi Imagerファイルは『Download for Windows』の項目をクリックしてダウンロードしました。
また、Raspberry Pi Imagerを起動した後の『CHOOSE OS』についても、記事先と同じで『Recommended』と書かれている『Raspberry Pi OS (32-bit)』を選択しました。
ラズパイにOSをインストールして無事初期設定を終えたら、以下の記事を参考にしてセキュリティ対策を行います。
記事の後半に記載されているSSHの設定もここで行います。これにより作業用PCからラズパイを操作できて便利です。
→買ったらまず実施!RaspberryPiのセキュリティ対策
また、下記の記事を参考に~/.ssh/config
ファイルを設定することで、作業用PCからラズパイへのSSH接続が楽になります。
3. motionのインストール、設定
motionとは?
動体検知用のソフトウェアです。
リファレンスも豊富で扱いやすそうだったので、今回こちらのソフトウェアを採用しました。
詳細はこちらのドキュメントで確認できます。
motion
の設定回りは下記の記事を参考にしました。
→Raspberry Pi(ラズパイ)にMotionを入れて動体検知機能付きの監視カメラを作る - 親子ボードゲームで楽しく学ぶ。
ちなみに、私のmotion
のバージョンは4.3.2
です。
motionのインストール
ラズパイでターミナルを起動し(もしくは作業用PCからcygwinなどでラズパイにSSH接続し)、下記コマンドを実行してmotion
をインストールします。
$ sudo apt install motion
左端に映っている$
はコマンドではないので入力しません。
他のサイトを見ても、$
や#
がコマンドの左端に映っていることがありますが入力しません。
現在のユーザが一般ユーザだったら$
、rootユーザ(=管理者)だったら#
という情報を示している記号です。
これらはコマンドプロンプトと呼ばれるもので、プロンプト(prompt)は『促す』という意味です。つまり、『これの後にコマンドを入力してください』という、コマンドを促す記号が$
や#
ということです。
また、上記で打っているapt
コマンドはどのディレクトリに入っている状態で打っても問題ないです。
ちなみに、自分が今どのディレクトリにいるかはpwd
コマンドで確認できます。
あと、色んな記事を見てるとapt
コマンドとapt-get
コマンドどちらを使うべきか迷うかもしれませんが、基本的にapt
コマンドでいいと思います。
→apt と apt-get の違い | rs-techdev
webカメラをラズパイに接続し、下記コマンドを実行すれば、とりあえずカメラが動作します。
$ sudo motion
ブラウザからhttp://<ラズパイのIPアドレス>:8081
を開くと、webカメラに映っている映像が確認できます(※ラズパイとは別のマシンから確認する場合は、後述するstream_localhost
の設定をoff
にしている場合のみ可能)。
保存先ディレクトリの作成
撮影された静止画や動画が保存されるディレクトリを作成します。
$ mkdir /home/<ユーザ名>/motion_data
motion.conf
motion
の設定ファイルであるmotion.conf
を編集します。
このファイルで扱う各パラメータについては、こちらのリファレンスを見れば分かります。
上記のリファレンスを日本語訳しているページもこちらにあります。
motion.conf
にデフォルトで記載されていたパラメータで値を変更するパラメータを『変更項目』に、デフォルトで記載されておらず今回新たに追記するパラメータを『追加項目』に書きます。
cd
コマンドでmotion.conf
がある/etc/motion
ディレクトリに移動します。
編集する前に、下記のようにオリジナルのmotion.conf
は念のためバックアップを取っておくといいです。
$ sudo cp motion.conf motion.conf.org
下記コマンドでmotion.conf
を編集します。
私はファイルを編集する際はvi
(vim
)を使っていますが、慣れない方はnano
が直感的で良いかもしれません。
$ sudo vi motion.conf
変更項目
daemon on
target_dir /home/<ユーザ名>/motion_data
width 800
height 600
framerate 100
threshold 150
picture_output best
movie_codec mp4
stream_localhost off
-
daemon
: デーモンモードを機能させるか、つまりバックグラウンドでシステムを動作させるかどうかです。動作させたいのでon
にします。デーモンの召喚を召喚! -
target_dir
: 撮影した静止画・動画の保存先ディレクトリ。先ほど作成したディレクトリを指定します -
width
: 撮影する静止画・動画の解像度(幅) -
height
: 撮影する静止画・動画の解像度(高さ) -
framerate
: 1秒間に撮影する最大フレーム数 -
threshold
: 閾値。ここで指定したピクセル数より大きなピクセル数の変化が画面にあった場合に、picture_output
をfirst
、best
、on
のいずれかに設定していたら静止画を撮影、またはmovie_output
をon
に設定していたら動画を録画します。つまり、この値を低く設定すればするほど小さな動きの変化も検知して撮影・録画を行います -
picture_output
: 動体検知した際にどのように静止画を撮影するかを指定します。off
は撮影しない、on
は可能な限り撮影、first
は動きを検知した瞬間の1枚のみ撮影、best
は(少しCPU使うけど)そのイベントで最も動きを検知した瞬間の1枚のみを撮影します。on
にすると撮りまくってえらい数の静止画が生成されるのでbest
あたりが良いかなと思います -
movie_codec
: 保存する動画のファイル形式 -
stream_localhost
: カメラのリアルタイムの映像確認ページの閲覧権限を、ローカルホストに限定するかどうかを指定します。これをoff
にすることで、同じLAN内の別のマシンからもhttp://<ラズパイのIPアドレス>:8081
にアクセスしてカメラのリアルタイムの映像を見ることが可能になります
もし動画ファイルを生成したくない場合は、movie_output
をoff
にします。
movie_output off
追加項目
movie_bps 700000
-
movie_bps
: 映像の1秒あたりのビットレート。高ければ高いほど高品質になり、その分ファイルサイズが大きくなります
動きが無くても定期的に画像を保存したい場合は、snapshot_interval
を指定します。
snapshot_interval 300 # 動きが無くても5分おきに画像を保存
/etc/default/motion
デーモン起動用ファイルを作成します。
下記コマンドでファイルを作成・編集を行います。
$ sudo vi /etc/default/motion
下記の内容を記載して保存します。
start_motion_daemon=yes
4. sSMTPのインストール、設定
sSMTPとは?
メール送信に使えるソフトウェアです。
シンプルで扱いやすそうだったので採用しました。
ローカルホストにSMTPサーバが起動していなくても、外部のサーバに接続してメール送信ができます。
sSMTPについてざっと理解するには下記の記事が分かりやすいかもしれません。
→[linux][sSMTP] 自前で smtp サーバを用意せずにメール送信する | バシャログ。
また、当記事でこれから行うことと以下の記事でやっていることはほぼ同じなので紹介しておきます。
私も参考にさせていただきました。
→Raspberry Pi | 撮った写真をgmailで送るための設定(sSMTPとMutt) – たぷん日記
私のsSMTP
のバージョンは2.64
です。
sSMTPのインストール
sSMTP
をインストールします。
$ sudo apt install ssmtp
Googleのアプリパスワードの発行
ご自身のGmailの二段階認証をオンにし、こちらからアプリパスワードを発行します。
ここで発行する16桁のパスワードは、後述するパラメータに使用します。
ssmtp.conf
sSMTP
の設定ファイルであるssmtp.conf
を編集します。
ssmtp.conf
にデフォルトで記載されていたパラメータで値を変更するパラメータを『変更項目』に、デフォルトで記載されておらず今回新たに追記するパラメータを『追加項目』に書きます。
いずれも、今回使用するGmailのSMTPサーバに関するパラメータです。
また、今回も編集する前にオリジナルのssmtp.conf
は念のためバックアップを取っておきましょう。
# cp ssmtp.conf ssmtp.conf.org
変更項目
root=<送信元メールアドレス(Gmailアドレス)>
mailhub=smtp.gmail.com:587
追加項目
AuthUser=<送信元メールアドレス(Gmailアドレス)>
AuthPass=<16桁のアプリパスワード>
AuthMethod=LOGIN
UseTLS=Yes
UseSTARTTLS=Yes
TLS_CA_File=/etc/pki/tls/certs/ca-bundle.crt
AuthPass
には、先ほど発行した16桁のパスワードを記載します。
5. メール送信機能の実装
ここまでの設定ファイル等の場所と説明まとめ(おさらい)
-
/etc/motion/motion.conf
-
motion
の設定ファイル。3で設定しました - これを編集してカメラ周り(撮影、録画等)の設定をします
-
-
/etc/default/motion
- デーモン起動時に読み込まれる設定ファイル。3で設定しました
-
/etc/ssmtp/ssmtp
-
ssmtp
の設定ファイル。4で設定しました
-
-
/home/<ユーザ名>/motion_data
- 撮影した静止画ファイルや動画ファイルが入るディレクトリ。3で作成しました
-
<ユーザ名>
は、pi
ユーザをそのまま使ってる人はpi
になります
-
/var/lib/motion_setting
- 以下のファイルが入るディレクトリです
-
send_camera_mail.sh
-
/home/<ユーザ名>/motion_data
ディレクトリに入っている静止画ファイルや動画ファイルをメールに送る機能を持つファイルです - 以下に作成手順を記載します
-
-
message.txt
- メール本文の内容を記載するファイルです。書く内容は適当でいいです
- 以下に作成手順を記載します
-
- 以下のファイルが入るディレクトリです
Muttのインストール
sSMTP
だけではファイルを添付することができないので、Mutt
という電子メールクライアントを組み合わせて扱います。
私のMutt
のバージョンは2.0.5
です。
下記コマンドでMutt
をインストールします。
-y
オプションを付けることで、本当にインストールしますか?[Yes/no]の対話部分を自動でYesにして手入力をスキップできます。
$ sudo apt install -y mutt
シェルスクリプトの作成
以降の手順は下記の記事を参考にしております。
→Raspberry Piを使った格安監視カメラシステムを作った!|まるブロ -へたれエンジニアが頑張ります-
/var/lib/motion_setting
ディレクトリを作成します。
$ sudo mkdir /var/lib/motion_setting
作成したディレクトリ内に、send_camera_mail.sh
というファイルを作成します。
# !/bin/sh
files="/home/<ユーザ名>/motion_data/*"
all_file=""
file_size=0
cur_file_size=0
for filepath in ${files}
do
cur_file_size=`ls -l ${filepath} | awk '{ print $5; }'`
file_size=`expr ${file_size} + ${cur_file_size}`
# 添付ファイルが25MBを超えないように分けてメールを送る
if [ ${file_size} -lt 25000000 ]; then
all_file=${all_file}' -a '${filepath}
else
mutt -s "監視システムからの連絡" "<送信先メールアドレス(Gmailアドレス)>" -c ""${all_file}<"/var/lib/motion_setting/message.txt"
all_file=""
all_file=${all_file}' -a '${filepath}
file_size=${cur_file_size}
fi
done
if [ -n "${all_file}" ]; then
mutt -s "監視システムからの連絡" "<送信先メールアドレス(Gmailアドレス)>" -c ""${all_file}<"/var/lib/motion_setting/message.txt"
fi
# ファイルの削除
ls "${files}.jpg" > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "jpgファイルを`ls -Ul ${files}.jpg | wc -l`件削除しました"
sudo rm -r ${files}.jpg
else
echo "jpgファイルはありませんでした"
fi
ls "${files}.mp4" > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "mp4ファイルを`ls -Ul ${files}.mp4 | wc -l`件削除しました"
sudo rm -r ${files}.mp4
else
echo "mp4ファイルはありませんでした"
fi
echo "メール送信処理が終了しました"
このファイルが、静止画ファイルや動画ファイルを添付してメール送信する機能を果たします。
今回送受信に使うメールアドレスにGmailを採用していますが、Gmailでは25MB以上のファイルを添付できないので、添付ファイルが25MBを超えるほど多い場合は数回に分けてメールを送るようにしています。
メールを送ったあとは、送った静止画ファイル、動画ファイルを全て削除しています。
メール内容の作成
自分宛てに送るメールの本文内容を記載するファイルです。
同じディレクトリに作成します。内容は適当でいいです。
メール本文
動作確認
一旦ここで、ちゃんと撮影されるか、メールが送られるか確認します。
ラズパイを再起動してから再びmotion
を起動します。
また、webカメラに自分の顔ないし体が映るようにします。
現状の設定では、動きを検知し次第静止画・動画を撮影し、/home/<ユーザ名>/motion_data
ディレクトリにそのファイルが保存されるようになっています。
自分の顔ないし体を動かしてみて、動きを検知して撮影された静止画・動画がちゃんと/home/<ユーザ名>/motion_data
ディレクトリに保存されているか、またsend_camera_mail.sh
を実行してちゃんとそれらのファイルが添付されたメールが送られるか確認しましょう。
下記コマンドでラズパイを再起動し、
$ sudo reboot
下記コマンドでmotion
を起動します。
$ sudo motion
顔ないし体を動かします。
/home/<ユーザ名>/motion_data
ディレクトリに入り、ls
コマンドでファイルが生成されているか確認します。
次に、/var/lib/motion_setting
ディレクトリに移動し、先ほど作成したsend_camera_mail.sh
を下記コマンドで実行します。
$ sudo ./send_camera_mail.sh
これで撮影ファイルが添付されたメールが送られ、それらのファイルはラズパイからは削除されたはずです。
実際、webカメラで撮影された自分の気持ち悪い横顔の写真が大量にGmailで送られてきたので無事動作確認完了です。
次に進みます。
cronの設定
cron
を設定します。
この設定により、メールを自動で何時間おきに送るか、といった設定ができます。
設定ファイルを直接いじっても良いのですが推奨されていないようなので、ここではcrontab
コマンドを使って設定します。
$ crontab -e
(エディタを選ぶように聞かれた場合は任意のエディタを選んでから)設定ファイルを開き、ファイルの末尾に以下の設定内容を追記し、保存します。
ここでは1時間おきにメールを送るように設定しています。
# 1時間ごとにメールを送る
0 */1 * * * sudo /var/lib/motion_setting/send_camera_mail.sh > /dev/null 2>&1
cron
には、設定されたコマンド(ここではsudo /var/lib/motion_setting/send_camera_mail.sh
)実行後に自動でメールが送信される機能がデフォルトで設定されています(※今回実装するメール送信処理とはまた別のメールの話)。
送信内容は/var/spool/mail/<ユーザ名>
ファイルにどんどん追記されていくので、いつの間にかディスクを圧迫している、なんてこともあります。
したがって、上記の末尾にある > /dev/null 2>&1
によって、cron
によるメール送信をしないようにしています。
(むしろ最初はあえて > /dev/null 2>&1
は書かずに、どんな風にcron
でメールが飛ぶのか確認するのも良いかもです)
ちなみに、エラーが出た場合のみcron
からメールを送るようにしてほしい場合は、上記の代わりに下記のように設定します。
0 */1 * * * sudo /var/lib/motion_setting/send_camera_mail.sh 1> /dev/null
crontab
コマンドで設定された情報は/var/spool/cron/crontabs/<ユーザ名>
ファイル内に記述されます。
下記コマンドで、設定された情報を確認することができます。
$ crontab -l
また、下記のように直接設定ファイルを見て確認することもできます。
この場合はrootユーザに切り替わる必要があります。
# less /var/spool/cron/crontabs/<ユーザ名>
sudoコマンドの設定変更
現状、send_camera_mail.sh
を実行するにはパスワード入力が求められます(※パスワードを設定してる場合のみ)。
自動で動かしたいのに途中でパスワード入力を求められては、システムがそこで止まってしまい何の意味もありません。
そこで、任意のユーザ(<ユーザ名>
)がパスワードを入力せずにsend_camera_mail.sh
を実行できるように、sudo
コマンドの設定を少し変更します。
ここではvisudo
コマンドを使います。
visudo
コマンドは、sudo
コマンドの設定ファイルである/etc/sudoers
ファイルを安全に編集するためのコマンドです。
※/etc/sudoers
はとても重要なファイルなので、直接編集するのではなくvisudo
コマンドを使って編集するようにしましょう。
下記コマンドを実行します。
$ sudo visudo
以下の内容を追記します。
<ユーザ名> ALL=(ALL) NOPASSWD: /var/lib/motion_setting/send_camera_mail.sh
これで、任意のユーザ(<ユーザ名>
)がパスワードを入力せずにsend_camera_mail.sh
を実行できるようになりました。
したがって、cron
で設定した時間通りに、任意のユーザ(<ユーザ名>
)がsend_camera_mail.sh
を実行してくれるシステムの作成が完了しました。
ラズパイを再起動(reboot
)してmotion
を起動し、webカメラを然るべき場所に置けばOKです。
最後に
とりあえず当記事の目標は達成できました。
写真は実際のGmailの受信トレイです。
1時間ごとにメールが送られてきているのが分かるかと思います。
また、早朝は撮影枚数が少ないのでメール1通に収まっていますが、7時以降は人の動きが増えたことで撮影枚数が増え、メールが分けて送信されていることが分かります。
もしこれで件のストーカー相手が確認できた場合は、警察に提示できる証拠資料が増えますね。
次回はwebページ作成の記事でも書けたらと思います。
生存報告も兼ねて次回の記事も更新できるように頑張ります。それでは。